Знакомый попросил о 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" );
}
Комментариев нет:
Отправить комментарий