我需要找到传递给特定函数的参数值。
通常我设置 INT3 断点并在到达时检查寄存器和堆栈。但是对这个特定函数的调用太多,无法手动完成,所以我试图找到一些自动解决方案。
有什么建议?
我需要找到传递给特定函数的参数值。
通常我设置 INT3 断点并在到达时检查寄存器和堆栈。但是对这个特定函数的调用太多,无法手动完成,所以我试图找到一些自动解决方案。
有什么建议?
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 调用的清晰跟踪。一个小剧本我写了轻松管理这一点。