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