(修改)
很抱歉更改内容。
我已经更改了代码。
nameprocess = 'calc.exe'
def getpid():
for proc in psutil.process_iter():
if str(nameprocess) in str(proc.name):
print nameprocess,'pid = ', proc.pid
return proc.pid
PID = getpid()
PROCESS_QUERY_INFORMATION = 0x0400
PROCESS_VM_READ = 0x0010
process = windll.kernel32.OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,False,PID)
readprocess = windll.kernel32.ReadProcessMemory
rdbuf = ctypes.c_uint()
bytread = ctypes.c_ulong(0)
for i in range(11):
num = int('0x%08X'%(0x00400000+i),16)
try:
if readprocess(process,hex(num),ctypes.byref(rdbuf),
ctypes.sizeof(rdbuf),ctypes.byref(bytread)):
print hex(num),rdbuf.value
except:None
print '----------------done---------------'
结果输出为:
calc.exe pid = 4552
0x400000 4293587451
0x400001 4293587451
0x400002 4293587451
0x400003 4293587451
0x400004 4293587451
0x400005 4293587451
0x400006 4293587451
0x400007 4293587451
0x400008 4293587451
0x400009 4293587451
0x40000a 4293587451
----------------done---------------
[Finished in 0.2s]
但我希望它看起来像这样
00400000 AE SCAS BYTE PTR ES:[EDI]
00400001 0001 ADD BYTE PTR DS:[ECX],AL
00400003 0000 ADD BYTE PTR DS:[EAX],AL
00400005 0000 ADD BYTE PTR DS:[EAX],AL
00400007 01EE ADD ESI,EBP
00400009 FFEE JMP FAR ESI ; Illegal use of register
0040000B FF01 INC DWORD PTR DS:[ECX]
就像调试器一样。 我希望你们明白我要做的事情。 在阅读processmemory时,'rdbuf'获取所有信息 我想要的是?从这个过程中得到了什么?
答案 0 :(得分:2)
您的代码中存在严重错误。您正在将(const char *)"0xde2d6c"
传递给此处的ReadProcessMemory
:
if readprocess(process,hex(num),ctypes.byref(rdbuf),
ctypes.sizeof(rdbuf),ctypes.byref(bytread)):
hex
从整数中生成十六进制字符串;因此,您最终会在calc.exe
进程中读取"0xde2d6c"
进程中的字节,而ctypes.cvoid_p(num)
字符串恰好存储在Python进程中,这要归功于CPython内存分配的工作原理,恰好是同一地址一直都在那里。
你应该传递地址,即base = 0x00400000
for addr in range(base, base + 11):
try:
if readprocess(process, ctypes.cvoid_p(addr), ctypes.byref(rdbuf),
ctypes.sizeof(rdbuf),ctypes.byref(bytread)):
!
您的代码可以清晰地写为:
{{1}}
答案 1 :(得分:0)
使用ReadProcessMemory
时,您正在读取特定内存地址的某些值。根据您所说的,您正在寻找的是反汇编二进制代码。我会使用diStorm,一个简单但功能强大的x86和x64反汇编程序库。看一个简单的例子:
>>>Decode(0x400000, 'b800000000'.decode('hex'), Decode32Bits)
[(4194304L, 5L, 'MOV EAX, 0x0', 'b800000000')]
请注意,无需打开该过程,您只需使用标准文件输入读取二进制文件内容。
希望它有所帮助!