【发布时间】:2018-10-13 20:41:48
【问题描述】:
我有两个进程,A 和 B。
A 正在使用读取某些内存位置的代码加载 DLL,而 B 尝试使用 ReadProcessMemory 读取 A 内存上的相同内存位置。
我得到相同的值,直到某些时候我没有,这很令人费解。我错过了一些东西,但我不知道是什么。我希望你能帮我找到它。
(在两个进程代码中,IMPORT_TABLE_OFFSET 是1,processBaseAdress 是A 的MZ 头在进程内存中的起始地址。
A 的 DLL 代码:
printf("processBaseAddress: %p\n", processBaseAddress);
PIMAGE_DOS_HEADER dosHeaderP = processBaseAddress;
printf("ntHeaderP = %p\n", (PBYTE)dosHeaderP + dosHeaderP->e_lfanew);
PIMAGE_NT_HEADERS ntHeader = ((PBYTE)dosHeaderP + dosHeaderP->e_lfanew);
printf("optHeaderP = %p\n", &ntHeader->OptionalHeader);
IMAGE_OPTIONAL_HEADER optionalHeader = (ntHeader->OptionalHeader);
printf("oh.aoep = %p\n", optionalHeader.AddressOfEntryPoint);
printf("oh.cs = %x\n", optionalHeader.CheckSum);
printf("DataDirectory: %p\n", optionalHeader.DataDirectory);
IMAGE_DATA_DIRECTORY dataDirectory = (optionalHeader.DataDirectory[IMPORT_TABLE_OFFSET]);
B 的代码:
(hHandle 是A 的句柄)
#define VERIFY_RPM(CALL_ID, RPM_CALL) {
if(RPM_CALL==0){
printf("Error! ReadProcessMemory(): %d. Call id: %d.\n",GetLastError(),CALL_ID);
exit(1);
}
}
SIZE_T bytesRead;
printf("processBaseAddress: %p\n", processBaseAddress);
VERIFY_RPM(0, ReadProcessMemory(hProcess, processBaseAddress, &dosHeader, sizeof(dosHeader), &bytesRead));
PIMAGE_NT_HEADERS ntHeaderP = processBaseAddress + dosHeader.e_lfanew;
printf("ntHeaderP = %p\n", ntHeaderP);
VERIFY_RPM(1, ReadProcessMemory(hProcess, ntHeaderP, &ntHeader, sizeof(ntHeader), &bytesRead));
IMAGE_OPTIONAL_HEADER optionalHeader = ntHeader.OptionalHeader;
printf("oh.aoep = %p\n", optionalHeader.AddressOfEntryPoint);
printf("oh.cs = %x\n", optionalHeader.CheckSum);
printf("DataDirectory: %p\n", optionalHeader.DataDirectory);
VERIFY_RPM(2, ReadProcessMemory(hProcess, optionalHeader.DataDirectory + IMPORT_TABLE_OFFSET, &dataDirectory, sizeof(dataDirectory), &bytesRead));
A 的输出:
processBaseAddress: 1C530000
ntHeaderP = 1C5300F0
optHeaderP = 1C530108
oh.aoep = 00001327
oh.cs = d6c7
DataDirectory: 0322F8E8
B的输出:
processBaseAddress: 1C530000
ntHeaderP = 1C5300F0
oh.aoep = 00001327
oh.cs = d6c7
DataDirectory: 001AEE3C
Error! ReadProcessMemory(): 299. Call id: 2.
在 DataDirectory 之前都是一样的。
【问题讨论】:
-
但是您制作了
IMAGE_OPTIONAL_HEADER-IMAGE_OPTIONAL_HEADER optionalHeader = (ntHeader->OptionalHeader);和DataDirectory的副本 指向此副本。你需要使用IMAGE_OPTIONAL_HEADER* optionalHeader = &ntHeader->OptionalHeader;
标签: c++ windows winapi memory readprocessmemory