记录对特定功能的所有调用?奥利/x64dbg

逆向工程 艾达 ollydbg x64dbg
2021-06-27 21:18:23

我需要找到传递给特定函数的参数值。

通常我设置 INT3 断点并在到达时检查寄存器和堆栈。但是对这个特定函数的调用太多,无法手动完成,所以我试图找到一些自动解决方案。

有什么建议?

2个回答

ollydbg v 2.01

ollydbg calc.exe -> ctrl+g ->address or symbol->follow ->shift+f4 ->pause never -> log arguments ->always -> f9 并查看日志窗口

在此处输入图片说明

如果你在windbg上,你就做

0:003> bp USER32!TranslateMessage "dt ole32!tagMSG poi(@esp+4);kb 2;.echo ========;gc"
breakpoint 0 redefined
0:003> g
   +0x000 hwnd             : (null) 
   +0x004 message          : 0x113
   +0x008 wParam           : 0x3341
   +0x00c lParam           : 0n1954748594
   +0x010 time             : 0x147656d
   +0x014 pt               : tagPOINT
 # ChildEBP RetAddr  Args to Child              
00 0017eee0 002b1c9f 0017efbc 00304a68 004f2b44 USER32!TranslateMessage
01 0017fc50 002c219a 002b0000 00000000 004f2b44 calc!WinMain+0x85b
========
   +0x000 hwnd             : 0x000e0212 HWND__
   +0x004 message          : 0xf
   +0x008 wParam           : 0
   +0x00c lParam           : 0n0
   +0x010 time             : 0x1477998
   +0x014 pt               : tagPOINT
 # ChildEBP RetAddr  Args to Child              
00 0017eee0 002b1c9f 0017efbc 00304a68 004f2b44 USER32!TranslateMessage
01 0017fc50 002c219a 002b0000 00000000 004f2b44 calc!WinMain+0x85b
========
   +0x000 hwnd             : 0x001d017e HWND__
   +0x004 message          : 0xf
   +0x008 wParam           : 0
   +0x00c lParam           : 0n0
   +0x010 time             : 0x14779a8
   +0x014 pt               : tagPOINT
 # ChildEBP RetAddr  Args to Child              
00 0017eee0 002b1c9f 0017efbc 00304a68 004f2b44 USER32!TranslateMessage
01 0017fc50 002c219a 002b0000 00000000 004f2b44 calc!WinMain+0x85b
========

编辑

当您切换 f2 bp 时,x64 dbg 也有一个编辑断点,但我不知道如何诱使它解码参数

使用 x64 dbg,您可以从 gui 设置 f2 断点,然后右键单击编辑断点

并将条件设置为 0(永不中断)并在日志文本编辑框中输入此格式化字符串

并在日志窗口中查看结果

像下面

msg *:FEDB0;hwnd=:160252;msg =: 118
msg *:FEDB0;hwnd=:160252;msg =: 118
msg *:FEDB0;hwnd=:160252;msg =: 118
msg *:FEDB0;hwnd=:160252;msg =: 118
msg *:FEDB0;hwnd=:160252;msg =: 118
msg *:FEDB0;hwnd=:160252;msg =: 118
msg *:FEDB0;hwnd=:160252;msg =: 118
msg *:FEDB0;hwnd=:160252;msg =: F
msg *:FEDB0;hwnd=:3D0458;msg =: F
msg *:FEDB0;hwnd=:1908B8;msg =: F
msg *:FEDB0;hwnd=:8038E;msg =: F

在此处输入图片说明

当需要处理的调用过多时,我通常使用pykd进行跟踪。举个例子

class ExceptionHandler(pykd.eventHandler):
    def __init__(self):
        pykd.eventHandler.__init__(self)

    def onBreakpoint(self, id):
        esp = pykd.reg("esp")
        eax = pykd.reg("eax")
        out = ""
        if id == 0:
            out += "RtlAllocateHeap ("
            out += hex(pykd.ptrPtr(esp + 0x4)) + " , "
            out += hex(pykd.ptrMWord(esp + 0x8)) + " , "
            out += hex(pykd.ptrPtr(esp + 0xc)) + ") "
            out += " = "
            out += hex(eax)
        print out

pykd.initialize()
pykd.handler = ExceptionHandler()
pykd.startProcess("test.exe")
alloc_module = pykd.module("ntdll")
alloc_module.reload()
b0 = pykd.setBp(alloc_module.offset('RtlAllocateHeap')+0xe6, callback)
pykd.go()
pykd.killAllProcesses()

这将为您提供所有 alloc 调用的清晰跟踪。一个小剧本我写了轻松管理这一点。