[英]Writing memory scanner in python
(编者)
很抱歉更改内容。
我改变了代码。
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'获取了我想要的所有信息吗? 这个过程到底是什么?
您的代码中存在严重错误。 您将(const char *)"0xde2d6c"
传递给ReadProcessMemory
:
if readprocess(process,hex(num),ctypes.byref(rdbuf),
ctypes.sizeof(rdbuf),ctypes.byref(bytread)):
hex
使整数形成十六进制字符串; 因此,您最终会在"0xde2d6c"
字符串碰巧存储在Python进程中的同一位置读取calc.exe
进程中的字节,这要归功于CPython内存分配的工作方式,恰好是所有的时间有。
你应该传入地址,也就是ctypes.cvoid_p(num)
!
你的代码可以清晰地写成:
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)):
使用ReadProcessMemory
,您正在读取特定内存地址的某些值。 根据你所说的,你正在寻找的是反汇编二进制代码。 我会使用diStorm ,一个简单但功能强大的x86和x64反汇编程序库。 看看一个简单的例子:
>>>Decode(0x400000, 'b800000000'.decode('hex'), Decode32Bits)
[(4194304L, 5L, 'MOV EAX, 0x0', 'b800000000')]
请注意,打开该过程不是必需的,您只需要使用标准文件输入读取二进制文件内容。
希望能帮助到你!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.