在python中编写内存扫描程序

时间:2015-02-23 11:04:24

标签: 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'获取所有信息 我想要的是?从这个过程中得到了什么?

2 个答案:

答案 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')]

请注意,无需打开该过程,您只需使用标准文件输入读取二进制文件内容。

希望它有所帮助!