我有一个项目,我现在正在做一段时间,在我从发布x86版本切换到x64版本之前,它运行得很好。
这是出现错误的代码行:
ReadProcessMemory(a.hProcess, LPCVOID(b->Ebx + 8), LPVOID(&c), 4, 0);
我不了解程序集,但当错误出现在b->Ebx
时,我将其更改为b->Rbx
。它编译并运行,但没有完成它应该做的工作。
我用错寄存器了吗?
经过一点调试
pe_dos_h = PIMAGE_DOS_HEADER(pe_image);
pe_nt_h = PIMAGE_NT_HEADERS(DWORD(pe_image) + pe_dos_h->e_lfanew);
//error when trying to assign a value or access the signature in nt-headers
//ERROR: read access violation
IMAGE_NT_HEADERS* pe_nt_h->Signature == IMAGE_NT_SIGNATURE;//0x00004550-PE00
pe_image是从pe(.exe(文件复制的原始数据。处理x86 PE映像与x64映像的区别是什么?
这是代码的简化版本。如果您认为问题超出了这段代码的范围,请告诉我。
问题在于我定义IMAGE_SECTION_HEADER
的方式,在x64体系结构中,我必须使用x64特定的数据类型IMAGE_SECTION_HEADER64
。
以及在铸造pe_nt_h = PIMAGE_NT_HEADERS(DWORD_PTR(pe_image) + pe_dos_h->e_lfanew);
时
我不得不使用DWORD_PTR
而不仅仅是DWORD
,因为它缺少一些位。
这是我在帖子中提供的简化版本的解决方案代码:
PIMAGE_DOS_HEADER pe_dos_h = PIMAGE_DOS_HEADER(pe_image);
PIMAGE_NT_HEADERS64 pe_nt_h = PIMAGE_NT_HEADERS(DWORD_PTR(pe_image) + pe_dos_h->e_lfanew);