Python 将内存地址从指针(字节)类型转换为十六进制
我正在尝试查找进程Python 将内存地址从指针(字节)类型转换为十六进制,python,ctypes,memory-address,Python,Ctypes,Memory Address,我正在尝试查找进程process.exe中使用的render.dll的基址。我已经修改了代码,并且能够得到render.dll的基址的结果 from ctypes import * from ctypes.wintypes import * import psutil class MODULEENTRY32(Structure): _fields_ = [( 'dwSize', DWORD), ( 'th32ModuleID', DWORD),
process.exe
中使用的render.dll
的基址。我已经修改了代码,并且能够得到render.dll
的基址的结果
from ctypes import *
from ctypes.wintypes import *
import psutil
class MODULEENTRY32(Structure):
_fields_ = [( 'dwSize', DWORD),
( 'th32ModuleID', DWORD),
( 'th32ProcessID', DWORD),
( 'GlblcntUsage', DWORD),
( 'ProccntUsage', DWORD),
( 'modBaseAddr', POINTER(BYTE)),
( 'modBaseSize', DWORD),
( 'hModule', HMODULE),
( 'szModule', c_char * 256),
( 'szExePath', c_char * 260)]
CreateToolhelp32Snapshot = windll.kernel32.CreateToolhelp32Snapshot
Module32First = windll.kernel32.Module32First
Module32Next = windll.kernel32.Module32Next
CloseHandle = windll.kernel32.CloseHandle
TH32CS_SNAPMODULE = 0x00000008
TH32CS_SNAPMODULE32 = 0x00000010
def getpid(processname):
for proc in psutil.process_iter():
if str(processname) in str(proc.name):
return proc.pid
def GetModuleByName(name):
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE32 | TH32CS_SNAPMODULE, getpid('process.exe'))
entry = MODULEENTRY32()
entry.dwSize = sizeof(MODULEENTRY32)
if Module32First(snapshot, pointer(entry)):
while Module32Next(snapshot, entry):
if entry.szModule == name:
CloseHandle(snapshot)
return entry.modBaseAddr
CloseHandle(snapshot)
return None
baseAddr = GetModuleByName('render.dll')
print baseAddr
这将导致
。我知道这与结果是一个指针(字节)
类型有关,但我不确定如何从该类型获取一个正常的十六进制内存地址,我可以使用该地址读取进程内存。我找到了答案。原来我和另一张海报有同样的误解,使用ctypes.addressof(baseAddr.contents)
返回的正确内存地址。dll
id(object)
将返回对象的内存地址。。。我不知道你为什么希望它是十六进制的,因为我知道任何东西都需要一个整数…我正在试图找到render.dll
的内存地址,而不是LP_c_byte对象。我正在寻找的内存地址应该包含在LP_c_byte对象中,我只是不确定如何从该对象检索它。我希望将十六进制值与Process Hacker 2中显示的render.dll
的十六进制值进行比较,但是在十六进制和整数之间转换非常容易,因此对我来说两者都很好。您可以使用byref(entry)
而不是指针(entry)
;i、 e.您不需要分配实际的ctypes指针对象;把地址传过去。Module32Next
调用有错误;传递entry
的地址时缺少byref
或pointer
。只传递entry
就是按值传递结构,但您可以在文档中清楚地看到它需要一个指针。这恰好在x64 ABI中起作用,因为大型结构是通过引用隐式传递的。但在32位x86中,结构被复制到调用堆栈,因此Windows将dwSize
字段解释为指针参数,这是一种访问冲突。您还跳过了第一个模块,它应该是进程映像(例如“process.exe”)。匹配名称也应该不区分大小写。如果只是将此指针传递给ReadProcessMemory
,那又有什么关系呢?这只是为了展示吗?
from ctypes import *
from ctypes.wintypes import *
import psutil
class MODULEENTRY32(Structure):
_fields_ = [( 'dwSize', DWORD),
( 'th32ModuleID', DWORD),
( 'th32ProcessID', DWORD),
( 'GlblcntUsage', DWORD),
( 'ProccntUsage', DWORD),
( 'modBaseAddr', POINTER(BYTE)),
( 'modBaseSize', DWORD),
( 'hModule', HMODULE),
( 'szModule', c_char * 256),
( 'szExePath', c_char * 260)]
CreateToolhelp32Snapshot = windll.kernel32.CreateToolhelp32Snapshot
Module32First = windll.kernel32.Module32First
Module32Next = windll.kernel32.Module32Next
CloseHandle = windll.kernel32.CloseHandle
TH32CS_SNAPMODULE = 0x00000008
TH32CS_SNAPMODULE32 = 0x00000010
def getpid(processname):
for proc in psutil.process_iter():
if str(processname) in str(proc.name):
return proc.pid
def GetModuleByName(name):
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE32 | TH32CS_SNAPMODULE, getpid('process.exe'))
entry = MODULEENTRY32()
entry.dwSize = sizeof(MODULEENTRY32)
if Module32First(snapshot, pointer(entry)):
while Module32Next(snapshot, entry):
if entry.szModule == name:
CloseHandle(snapshot)
return entry.modBaseAddr
CloseHandle(snapshot)
return None
baseAddr = GetModuleByName('render.dll')
print baseAddr