среда, 22 декабря 2010 г.

Скрипт для нахождения id сисколов

Знакомый попросил о IDA скрипте, который находит сисколы в ntdll.dll, генерит текстовый файл с парами: имя сервисной ф-ции + id, я такой нашел у себя, и подумал, что скрипт может пригодиться кому-нибудь еще, поэтому выкладываю тут(формат вывода легко можно подстроить для себя).

#include <idc.idc>

//
// Info: This script gets pair: "Service Function Name + Service Function Id" and save it into the file("c:\ServiceFuncNames.txt").
// HowToUse: Just run script in IDA.
// Version: 1.0
// Author: TSS
// Data: 18.05.10
//

static Processing( currentAddress, startAddress, reportFile )
{
    auto functionName;
    auto functionId;
    auto movInstructionAddress;

    //
    // get "mov eax, index" instruction
    //

    movInstructionAddress = PrevHead( currentAddress, startAddress );

    //
    // make some validation
    //
   
    if ( GetOpType( movInstructionAddress, 1 ) != 5 || GetMnem( movInstructionAddress ) != "mov" )
    {
        Message( "Error: before syscall wrong instruction\n" );
        return;
    }

    //
    // get service function id
    //

    functionId = GetOperandValue( movInstructionAddress, 1 );

    //
    // get function name
    //

    functionName = GetFunctionName( currentAddress );

    //
    // save info into the file
    //

    fprintf( reportFile, "%s, Id = %x\n", functionName, functionId );
}

static EnumSyscall( startAddress, endAddress, reportFile )
{
    auto currentAddress;
   
    currentAddress = startAddress;

    while ( currentAddress != BADADDR )
    {
        if ( GetMnem( currentAddress ) == "syscall" )
            Processing( currentAddress, startAddress, reportFile );
       
        currentAddress = NextHead( currentAddress, endAddress );
    }

    return 0;
}

static main()
{
    auto addressInCodeSegment;
    auto codeSegmentStartAddress;
    auto codeSegmentEndAddress;
    auto reportFile;

    Message( "Script started. Wait a couple of seconds...\n" );

    //
    // choosing first ordinal, cause it placed in code segment anyway
    //

    addressInCodeSegment = GetEntryPoint( 1 );

    //
    // we will search in entire code section
    //

    codeSegmentStartAddress = SegStart( addressInCodeSegment );
    codeSegmentEndAddress = SegEnd( addressInCodeSegment );

    //
    // open file for report
    //

    reportFile = fopen( "c:\\ServiceFuncNames.txt", "wt" );

    //
    // find and process all syscall's
    //

    EnumSyscall( codeSegmentStartAddress, codeSegmentEndAddress, reportFile );

    //
    // close report file
    //

    fclose( reportFile );

    Message( "GetServiceFunctions script complete work, check file c:\ServiceFuncNames.txt for result...\n" );
}

Комментариев нет:

Отправить комментарий