我正在尝试通过“签名”来搜索函数。
但是我无法弄清楚我应该搜索什么地址范围?
我已经查看了 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 所能想到的最好的结果。
最佳答案
签名扫描模块时的地址范围是从代码段开始到开始+段大小。代码段的开头及其大小位于 PE 中。大多数工具采用惰性路由并扫描整个模块(再次使用 PE 来获取大小,但以模块句柄作为起始地址)。
关于c - 通过签名查找函数时如何知道地址范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10771444/