内容纲要

windbg 可断在系统函数上 (windows api) 上,查看堆栈数据,然后继续执行。

1. 为函数调用 TRACE 一条信息

bp 0x41414141 ".echo in function x" 

2. 输出 API 的参数

bp nt!ZwCreateFile "du poi(poi(esp+10)+0xC);g"
bp kernel32!LoadLibraryExA "da poi(esp+4);g"
bp kernel32!LoadLibraryExW "du poi(esp+4);g"
bp kernel32!LoadLibraryA "da poi(esp+4);g"
bp DbgPrint "da poi(esp+4)"
bp nt!zwopenfile "du poi(poi(esp+10)+0xC)"

3. 条件断点

bp 41414141 "j @eax=0xbaadf00d ;g" 

如果 eax = 0xbaadf00d 则断在地址 41414141,负责继续运行。

4. 在循环中只断一次

bp 0x41414141 /1 

断 x 次

bp 0x41414141 x 

5. 内存访问断点

ba w4 41414141
ba r1 41414141

改写地址 41414141 处的值为 55

eb 0x41414141 55 

6. 修改 eip,改变执行流程

r @eip=0x41414141 

7. dump 内存到文件

.writemem c:hostmachine
ange.bin 0x0400000 0x0404000
.writemem c:hostmachinelength.bin 00400000 L4000
.writemem c:hostmachinelength.bin 00400000 L?4000

8. 某个 dll 模块上的所有函数都下断

bm /a kernel32!* 

9. 加载 DLL 断点

bu kernel32!LoadLibraryExW ".echo LoadLibraryExW for ->; du dwo(@esp+4); g"

加载符合条件的 DLL 断点

bu kernel32!LoadLibraryExW ";as /mu ${/v:MyAlias} poi(@esp+4); .if ( $spat( \"${MyAlias}\", \"*MYDLL*\") != 0 ) { kn; } .else { g }"

10. 在程序入口点添加 trace

bu MyApp!WinMain "r eip = poi(@esp); r esp = @esp + 0x14; .echo WinSpy!WinMain entered; g"

WinMain has 4×4 byte parameters = 0x10 bytes + 4 bytes for the return address = 0x14

11. 在源代码中下断

kernel32!DebugBreak
ntdll!DbgBreakPoint
__asm int 3 (x86 only)

12. Module Relocation

!imgreloc

或者

 .shell -ci "!imgreloc" findstr RELOCATED

图书

  • Deep Dive: The Development of an Exploit (WIN32)

links

发表评论

电子邮件地址不会被公开。 必填项已用*标注