-1

「署名」で関数を検索しようとしています。

しかし、検索するアドレス範囲がわかりません。

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 を調べて思いついた最高のものです。

4

1 に答える 1

2

モジュールの署名スキャン時のアドレス範囲は、コードセクションの先頭から先頭+セクションサイズまでです。コードセクションの先頭とそのサイズはPEにあります。ほとんどのツールは遅延ルートを取り、モジュール全体をスキャンします(ここでも、PEを使用してサイズを取得しますが、モジュールハンドルを開始アドレスとして使用します)。

于 2012-05-27T08:37:43.827 に答える