「署名」で関数を検索しようとしています。
しかし、検索するアドレス範囲がわかりません。
VirtualQuery() と GetNativeSystemInfo() を見てきましたが、正しい道を進んでいるかどうかはわかりません。
編集:質問の再試行。
Win32 API を使用して、コードが実行されているプロセスの実行可能ページの開始アドレスと終了アドレスを取得する方法を見つけようとしています。
これは私が試したことです:
SYSTEM_INFO info;
ZeroMemory( &info, sizeof( SYSTEM_INFO ) );
GetNativeSystemInfo( &info ); // GetSystemInfo() might be wrong on WOW64.
info.lpMinimumApplicationAddress;
info.lpMaximumApplicationAddress;
HANDLE thisProcess = GetCurrentProcess();
MEMORY_BASIC_INFORMATION memInfo;
ZeroMemory( &memInfo, sizeof( memInfo ) );
DWORD addr = (DWORD)info.lpMinimumApplicationAddress;
do
{
if ( VirtualQueryEx( thisProcess, (LPVOID)addr, &memInfo, sizeof( memInfo ) ) == 0 )
{
DWORD gle = GetLastError();
if ( gle != ERROR_INVALID_PARAMETER )
{
std::stringstream str;
str << "VirtualQueryEx failed with: " << gle;
MessageBoxA( NULL, str.str().c_str(), "Error", MB_OK );
}
break;
}
if ( memInfo.Type == MEM_IMAGE )
{
// TODO: Scan this memory block for the the sigature
}
addr += info.dwPageSize;
}
while ( addr < (DWORD)info.lpMaximumApplicationAddress );
これを行う理由は、ここで尋ねられるように、署名によってエクスポートされていない関数を探しているためです。
Windows DLL の it シグネチャで関数を見つける
「コード署名スキャン」に関する回答を参照してください。
これはアドレス範囲を列挙していますが、予想される範囲がどうあるべきかわからないため、これが正しいかどうかはわかりません。これは、MSDN を調べて思いついた最高のものです。