对 WinDbg 有点陌生。我得到了一个可执行文件,它稍后在执行路径中加载一个模块,所以在开始时我会sxe ld:moduleName
在进程加载模块时中断。
然后我尝试只在每个方法上放置一个断点,但这需要很长时间,因为大约有 30k 个方法和大约 300 个导出的方法。
我试图只在导出的断点上设置断点,但到目前为止还没有运气。
我也试图使用 pykd 但该模块的文档记录很差,我也没有设法做到这一点。
对 WinDbg 有点陌生。我得到了一个可执行文件,它稍后在执行路径中加载一个模块,所以在开始时我会sxe ld:moduleName
在进程加载模块时中断。
然后我尝试只在每个方法上放置一个断点,但这需要很长时间,因为大约有 30k 个方法和大约 300 个导出的方法。
我试图只在导出的断点上设置断点,但到目前为止还没有运气。
我也试图使用 pykd 但该模块的文档记录很差,我也没有设法做到这一点。
我很快就设置了 465 bps
0:000> bl
0:000> .foreach ( place { !showexports ollydbg } ) { bp place }
0:000> bl "*z*"
0 e Disable Clear 00406938 0001 (0001) 0:**** ollydbg!Absolutizepath
118 e Disable Clear 004a9274 0001 (0001) 0:**** ollydbg!Finalizetaggedfile
206 e Disable Clear 004a8e1c 0001 (0001) 0:**** ollydbg!Getoriginaldatasize
237 e Disable Clear 004a9510 0001 (0001) 0:**** ollydbg!Gettaggedrecordsize
268 e Disable Clear 00403918 0001 (0001) 0:**** ollydbg!Iszero
319 e Disable Clear 004068cc 0001 (0001) 0:**** ollydbg!Relativizepath
356 e Disable Clear 00487d74 0001 (0001) 0:**** ollydbg!Squeezename
375 e Disable Clear 00487dfc 0001 (0001) 0:**** ollydbg!Uncapitalize
449 e Disable Clear 0053000c 0001 (0001) 0:**** ollydbg!sizeatt
450 e Disable Clear 0052ff88 0001 (0001) 0:**** ollydbg!sizekey
451 e Disable Clear 0052ff04 0001 (0001) 0:**** ollydbg!sizename
465 e Disable Clear 005d552c 0001 (0001) 0:**** ollydbg!zwcontinue
请注意,导出也可能是数据导出,并且您可能会通过像这样的大量断点来破坏您的会话
为避免在数据上设置断点,您可以运行这样的 shell 脚本并复制粘贴输出(这是一种黑客行为,但它会减少在大小小于 16 的符号(例如 GUID)上设置 bp 的次数
.shell -ci "x /v /Z /f ollydbg!*" awk "{ if ( strtonum(\"0x\"$4) > 16 ) print \"bp \"$3 \" 5000\" }"
此命令将打印一系列 bp addr 5000(5000 是通过计数,因此您不会为该地址的前 5000 次点击而烦恼)
复制系列并将其粘贴回以设置 bps
对我来说这组 ~ 440 bps 发出g 继续执行
,几分钟后按 ctrl+break 并发出 bl
复制粘贴并搜索命中
grep -v "5000 (5000)" bl.txt
3 e Disable Clear 004de7c4 4ef9 (5000) 0:**** ollydbg!T
11 e Disable Clear 00409e74 4fff (5000) 0:**** ollydbg!Setstatus
34 e Disable Clear 0041e444 4fff (5000) 0:**** ollydbg!Setautoupdate
50 e Disable Clear 00419208 4fff (5000) 0:**** ollydbg!Addtolist
70 e Disable Clear 00473ca4 4ffe (5000) 0:**** ollydbg!Setactivetab
84 e Disable Clear 00418afc 4fff (5000) 0:**** ollydbg!Issortedinit
90 e Disable Clear 00417980 4fc0 (5000) 0:**** ollydbg!Addsorteddata
175 e Disable Clear 0041214c 4ffc (5000) 0:**** ollydbg!Sunkenframe
178 e Disable Clear 0041742c 4ffe (5000) 0:**** ollydbg!Createsorteddata
206 e Disable Clear 004109d4 4fd3 (5000) 0:**** ollydbg!StrcopyW
215 e Disable Clear 004071f8 4ffe (5000) 0:**** ollydbg!Readfile
233 e Disable Clear 00403c70 4ffc (5000) 0:**** ollydbg!Memalloc
235 e Disable Clear 00409b98 4fff (5000) 0:**** ollydbg!Message
253 e Disable Clear 00404070 4ffe (5000) 0:**** ollydbg!Virtalloc
259 e Disable Clear 00406938 4ff6 (5000) 0:**** ollydbg!Absolutizepath
262 e Disable Clear 00417350 4fe2 (5000) 0:**** ollydbg!Destroysorteddata
268 e Disable Clear 00403440 4fff (5000) 0:**** ollydbg!Unicodetoutf
269 e Disable Clear 00412078 4fff (5000) 0:**** ollydbg!Getmonitorrect
315 e Disable Clear 0040261c 4f96 (5000) 0:**** ollydbg!Stringfromini
331 e Disable Clear 004026a0 4ff3 (5000) 0:**** ollydbg!Filefromini
332 e Disable Clear 00402718 4d95 (5000) 0:**** ollydbg!Getfromini
392 e Disable Clear 00403d7c 4fff (5000) 0:**** ollydbg!Memfree
411 e Disable Clear 0043ac10 4ffe (5000) 0:**** ollydbg!Destroysimpledata
421 e Disable Clear 00402978 4fff (5000) 0:**** ollydbg!Getfromsettings
425 e Disable Clear 00471cd8 4ffe (5000) 0:**** ollydbg!Initset
我的 pykd + pykdwin 变体
https://githomelab.ru/pykd/pykdwin
from pykdwin.pe import get_exports
bps = list()
for name, addr in get_exports('kernel32'):
bps.append( setBp(addr) )
尝试使用 --global 选项运行此脚本:
!py --global set_allbp.py
如果模块没有加载符号,请将符号路径设置为空文件夹.sympath c:\empty
并发出bm moduleName!*
. 由于没有可用的符号,windbg 将仅在导出的函数上设置断点。然后将符号路径设置为之前的值。