Sco*_*ham 8 windows 32bit-64bit
在Windows 64位上,我有一个32位进程读取其他32位进程的内存,我希望它能够读取64位进程.
ReadProcessMemory用于读取内存,但它有32位的限制.有没有办法在64位进程上执行相当于ReadProcessMemory的操作?
我知道我可以写一个64位进程,并推出从我的32位进程做的工作,但我不知道是否有一些其他的选项,这样我不需要写一个64位进程.
谢谢.
gre*_*ece 13
这是可能的.
举个例子,你可以参考tofucoder答案中的优秀样本.如需了解更多示例,请参阅此链接.
要解释为什么它实际工作,请检查此线程.
另一个样本可以在这里找到.
整个技巧是调用64位版本的ReadProcessMemory函数.直观地说,它不是32位进程的选项,但上面的链接解释了:x64版本ntdll.dll也作为Windows WOW64仿真器中32位进程的一部分加载.它有一个函数调用NtReadVirtualMemory与原型相同ReadProcessMemory64:
__declspec(SPEC)BOOL __cdecl ReadProcessMemory64(HANDLE hProcess, DWORD64 lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead);
Run Code Online (Sandbox Code Playgroud)
地址是64位长,因此可以参考64位处理的整个虚拟地址空间.
您可能想知道如何获取此函数的地址.当ntdll.dll中的另一个函数派上用场时:LdrGetProcedureAddress.它的原型与以下相同GetProcAddress:
__declspec(SPEC)DWORD64 __cdecl GetProcAddress64(DWORD64 hModule, char* funcName);
Run Code Online (Sandbox Code Playgroud)
我们要检查x64的export目录ntdll.dll并手动找到这个函数的条目.然后我们可以获得任何其他功能的地址.
到目前为止还没有发现另一个问题:如何获取x64的起始地址ntdll.dll?我们需要手动PEB遍历我们流程的x64 结构并遍历已加载模块的列表 - 作为其中一个变体.以及如何获得PEB地址?请参考上面的链接,不要在这篇文章中包含太多细节.
所有这些都包含在第一个链接的样本中.在第二和第三个链接中提供了使用NtReadVirtualMemory&NtWow64ReadVirtualMemory64函数的替代变体(以及获取PEB地址的替代方法).
简介:可以从x86进程与x64进程交互.它可以通过直接调用x64版本的函数(来自x64 ntdll.dll,它是作为WOW64进程的一部分加载)或者调用特定的x86函数来完成,该函数用于x64进程(即NtWow64ReadVirtualMemory64).
PS One可能会说它没有文档,而且更像是黑客 - 但它只是没有正式记录.柔软Unlocker,ProcessHacker或者ProcessExplorer,例如,使用这些未记录的功能(以及更多),当然,由您决定.
| 归档时间: |
|
| 查看次数: |
5607 次 |
| 最近记录: |