一个程序要想执行,总是要加载到内存里面的,为此我们使用下面的代码查询所有模块的信息,再找到它们在内存里面的对应位置:
HANDLE hProcess;
HMODULE hModule[0x70];
TCHAR strFileName[MAX_PATH];
DWORD cbNeeded;
MODULEINFO modinfo;
hProcess = GetCurrentProcess();
if(EnumProcessModules(hProcess, hModule, sizeof(HMODULE) * 0x30, &cbNeeded))
{
for(n = 0; n < cbNeeded / sizeof(HMODULE); n++)
{
GetModuleFileName(hModule[n], strFileName, MAX_PATH);
GetModuleInformation( hProcess, hModule[n], &modinfo, sizeof(MODULEINFO) );
// 根据lpBaseOfDll得到其它的数据
……………
}
}
于是就得到了下面的结果(数值均为十六进制):
名称 | 基址 | 大小 | 入口点 |
f:embedetoolsDebugbinbash.exe | 00400000 | 0006f000 | 0045bb30 |
E:WINDOWSsystem32ntdll.dll | 7c920000 | 00093000 | 7c932c28 |
E:WINDOWSsystem32kernel32.dll | 7c800000 | 0011e000 | 7c80b63e |
E:WINDOWSsystem32WS2_32.dll | 71a20000 | 00017000 | 71a21273 |
E:WINDOWSsystem32ADVAPI32.dll | 77da0000 | 000a9000 | 77da70fb |
E:WINDOWSsystem32RPCRT4.dll | 77e50000 | 00092000 | 77e5628f |
E:WINDOWSsystem32Secur32.dll | 77fc0000 | 00011000 | 77fc2126 |
E:WINDOWSsystem32msvcrt.dll | 77be0000 | 00058000 | 77bef2a1 |
E:WINDOWSsystem32WS2HELP.dll | 71a10000 | 00008000 | 71a11638 |
f:embedetoolsDebugbincygwin.dll | 10000000 | 0022f000 | 100a17e0 |
E:WINDOWSsystem32NETAPI32.dll | 5fdd0000 | 00055000 | 5fdd8b48 |
E:WINDOWSsystem32PSAPI.DLL | 76bc0000 | 0000b000 | 76bc10f1 |
E:WINDOWSsystem32WINMM.dll | 76b10000 | 0002a000 | 76b12b61 |
E:WINDOWSsystem32GDI32.dll | 77ef0000 | 00049000 | 77ef6587 |
E:WINDOWSsystem32USER32.dll | 77d10000 | 00090000 | 77d1b217 |
E:WINDOWSsystem32SHELL32.dll | 7d590000 | 007f4000 | 7d5b74d6 |
E:WINDOWSsystem32SHLWAPI.dll | 77f40000 | 00076000 | 77f451fb |
E:WINDOWSsystem32ole32.dll |