WinDbg:在模块的每个 EXPORTED 函数上设置断点

逆向工程 风袋 pykd
2021-06-25 07:48:04

对 WinDbg 有点陌生。我得到了一个可执行文件,它稍后在执行路径中加载一个模块,所以在开始时我会sxe ld:moduleName在进程加载模块时中断。

然后我尝试只在每个方法上放置一个断点,但这需要很长时间,因为大约有 30k 个方法和大约 300 个导出的方法。

我试图只在导出的断点上设置断点,但到目前为止还没有运气。

我也试图使用 pykd 但该模块的文档记录很差,我也没有设法做到这一点。

3个回答

我很快就设置了 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 将仅在导出的函数上设置断点。然后将符号路径设置为之前的值。