将内存地址从POINTER(BYTE)类型转换为十六进制

时间:2015-09-21 17:07:41

标签: python ctypes memory-address

我正在尝试查找流程render.dll中使用的process.exe的基地址。我修改了代码in this question,我可以获得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

结果为<__main__.LP_c_byte object at 0x00000000023C9348>。我知道这与结果是POINTER(BYTE)类型有关,但我不知道如何从这种类型到正常的十六进制内存地址,我可以用来读取这个位置的进程内存。

1 个答案:

答案 0 :(得分:1)

我找到了答案here。结果我和其他海报有同样的误解,并且使用ctypes.addressof(baseAddr.contents)返回.dll的正确内存地址。