【发布时间】:2012-06-02 00:59:32
【问题描述】:
我正在尝试通过其“签名”来搜索功能。
但是我不知道我应该搜索什么地址范围?
我已经查看了 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 所能想到的最好的。
【问题讨论】:
-
您的问题表述得不好。可以推断出其中的一部分(即您正在谈论某种 Windows),但您肯定可以做得更好。例如,您所说的签名到底是什么意思?
-
请更清楚地解释 1) 你到底想要做什么,2) 你在哪个平台上工作,3) 你试图使用什么工具/程序 4) 一个例子什么是“不工作”
标签: c assembly reverse-engineering