通过签名搜索函数时如何知道地址范围?

时间:2012-05-27 03:26:37

标签: c assembly reverse-engineering

我正在尝试通过其“签名”搜索功能。

但是我无法弄清楚我应该搜索哪个地址范围?

我已经看过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 );

这样做的原因是我正在寻找一个未导出的功能,其签名如下所示:

Find a function by it signature in Windows DLL

请参阅有关“代码签名扫描”的答案。

虽然这是枚举地址范围,但我不知道这是否正确,因为我不知道预期的范围应该是多少。这是我从MSDN上看到的最好的结果。

1 个答案:

答案 0 :(得分:2)

当签名扫描模块从代码部分的开头到开始+部分大小时的地址范围。代码部分的开头及其大小在PE中。大多数工具采用惰性路径并扫描整个模块(再次使用PE获取大小,但使用模块句柄作为起始地址)。