首页
社区
课程
招聘
[原创]WinDbg学习笔记(二)--字符串访问断点
发表于: 2009-7-25 21:39 33700

[原创]WinDbg学习笔记(二)--字符串访问断点

2009-7-25 21:39
33700

WinDbg学习笔记(二)--字符串访问断点

一、前言
    本文是我自己学习WinDbg的过程,因为目标是逆向分析一个驱动文件,但现在对驱动开发的知识还不是很熟悉,所以先在用户级练习一下破解,熟悉一下操作。我选择的破解程序是《OllyDBG 入门系列(二)-字串参考》中的Crack3.exe,也模仿一下在OllyDbg破解的流程,在WinDbg实现一遍。

二、调试思想
   《OllyDBG 入门系列(二)-字串参考》一文中是使用字符串参考来找到关键的地方,但是很可惜WinDbg没有字串参考的功能,不能直接模仿。虽然我不太知道OllyDbg得到字串参考的原理,不过我想一般的程序都会把要显示的字符串放在内存里。所以,猜想一下只要在内存里找到对应的字符串的位置,然后下内存访问断点,那么程序在要调用该字符串时就会被断下来。而在程序被断下来后一般都是在系统函数里,所以回到用户代码,在返回的地方附近就应该能找到关键的代码。下面利用Crack3.exe尝试一下。

三、调试步骤
1、先运行程序,熟悉一下程序的操作。运行Crack3.exe,界面如下:


点击一下“Register now”,就会弹出一个对话框:


我们这里就是从这个对话框里显示的字符串入手。

2、点击“Quit the CrackMe”退出Crack,然后启动WinDbg。【File】【Open Executable】 选择Crack3.exe。WinDbg载入程序后会自动中断下来:


3、下入口断点
到这里,就会发现跟OllyDbg载入程序时不一样。为什么程序会停在系统代码区域里而不是在用户代码里?为什么入口地址不一样的?

其实我也是不太知道为什么会停在这里,不过大概这时Crack3已经载入内存里,只不过要等用户操作才进行下一步。
那怎样才能到程序的入口点?
WinDbg里有个伪寄存器叫$exentry,里面记录了程序的入口点。所以我们只要在命令输入栏里输入
bp $exentry
(bp就是用来下断点的命令,详细用法可以参考WinDbg的帮助文档)
在输入完命令并敲击Enter后,在命令输入行的前端一般会显示“*BUSY*”的字样。这时因为WinDbg要从目录或网站上找到对应的符号文件。如果网速慢的话可能会等好一阵子。如图:


在WinDbg找完符号文件后,就会变成:


什么,提示错误?
不过可以放心,这里不是说断点设置失败。我英文不太好,不过也可以大概理解说模块加载成功,但image00400000处的符号不能加载。这个对于我们没什么关系,因为我们调试的是没有源代码的程序,^_^。

这里也补充一下。要查看当前已经设置的断点,可以在命令栏输入  bl ,如图:


如图上所示,现在我们设置里一个断点,断点位置在 0041270。在00441270前的字母 e
代表断点是被激活的。而在最前面的0代表的是第0个断点,可以说是断点的编号。对于断点,还有其它经常用到的操作,例如:
be   激活断点
bd   禁用断点
bc   删除某个断点
详细的用法和其它操作可参考WinDbg帮助文档(在索引里输入 user-space breakpoints)。

其实我们不一定要用到$exentry寄存器,因为我们自己也可以算出程序的入口地址。用Stud_PE或其它PE工具,找到ImageBase和EntryPoint,那么ImageBase+EntryPoint就是入口地址了。对于Crack3,情况就是00400000+00041270=00441270(注意是16进制)。


使用bp下断点:
bp  00441270
得到的结果是一样的。

4、运行到入口点
按F5(或输入g),那么程序就会停在正式的入口点,如图:

现在貌似熟悉多了,终于回到用户代码了。

5、查找字符串
在步骤1我们运行程序时就记录了提示注册错误的字符串“Wrong Serial, try again!”,现在我们就要在内存找到该字符串的位置。

输入命令
s –a 00400000 L53000 “Wrong”
该命令的意思是以ASCII码形式在内存地址00400000往后53000个字节搜索字符串“Wrong”。
s,就是要调用查找的命令
-a,指定使用ASCII码的形式查找
00400000,指定要开始寻找的内存地址。
L53000,说明要在00400000往后的53000字节搜索。这个数值和00400000都可以从Stud_PE获得。00400000是程序的装入地址,而53000是映像的大小,也就是程序载入内存后占用的内存大小。使用这两个数值,基本上可以搜索到程序使用的整个内存范围。
“Wrong”,就不用多解释了,就是我们要寻找的字符串。不过WinDbg不支持模糊搜索,所以这里输入的字符串必定要完全正确。

具体用法可以参考帮助文档

最后,命令窗口输出:

表示在0044108c的地方找到我们想要的字符串。

6、下内存访问断点
WinDbg中,ba命令代表Break On Access,即访问时中断。
我们在命令行输入:
ba r 1 0044108c

命令的意思是在内存0044108c的位置下字节的读断点。命令中各元素的含义可以参考帮助文档,这里不啰嗦。
输入bl,查看断点使用情况:


7、按F5或输入命令g运行程序,点击“Register now”,程序被中断下来


可以看到,程序中断在系统代码区域。然后连续几次按或Shift+F11,又或者在命令行输入gu,直到程序弹出注册失败的窗口。点击 确定,继续shift+F11,直到用户回到用户代码区域。


到这里的话可能就需要借助IDA的帮忙了。因为在WinDbg的反汇编窗口里,跳转指令的调用不太明显,很难找出关键的跳转。而借用IDA,则可以很方便找出。如果不用IDA帮忙当然也可以,就是寻找起来可能稍微吃力点而已。
复制多一份Crack3.exe,再使用IDA,这样就不会影响到当前的调试。
用IDA载入Crack3的复件后,跳到0043d14b的地方(IDA不会用?那就随便看看IDA的一些教程,反正这里只用到IDA的一点点功能),如图:


什么,我们刚才进入的就是MessageBoxA?为什么WinDbg没有显示的?这也没办法,WinDbg本身就是这样,所以说结合IDA分析方便很多。其实也不能说WinDbg没提示,只要我们跟踪进MessageBoxA就知道了。下面实现一下:
重新载入Crack3,并在0043d146处(刚才调用MessageBoxA的地方)下断点,运行程序。点击“Register Now”后程序断了下来:


或F11,进入函数


看看,这里就不一样了,这里就可以提示是MessageBoxA了。

8、寻找关键跳转
在找到显示“Wrong Serial, try again!”的地方后,就尝试一下在代码附近有没有可以跳过显示这句提示的跳转指令。借用IDA,可以看到在当前函数里都没有一句跳转可以跳过提示,那么就说明当前函数整个都是注册错误后才调用的函数。
直接按跳出当前函数


借助IDA查看:


可以看到原来有两处地方调用刚才显示注册失败的函数。所以,我们要找的就是寻找一些可以跳过这两个地方的跳转指令。
关于怎样寻找,只要看一下IDA的那些跳转流程线就会很容易得到结果。而在这里,我直接给出关键的跳转,它们分别是00440F39 的jnz 和00440F56 的jnz。只要把这两个位置的jnz指令nop掉,就可以爆破成功。


9、修改指令
重新载入Crack3,然后分别使用
bp 00440F39
bp 00440F56

在关键的跳转下断点。按运行程序,点击“Register Now”,程序中断下来


现在就要修改这条指令。WinDbg提供命令a来修改指令。

简要用法是确认到当前要执行的指令,
首先,输入a,Enter
然后,输入要修改成的指令
最后,Enter,结束

在修改指令时要注意,修改后的指令占用的空间应该比原来的小,不然的话就会影响下面的指令。例如原来00440f39处的指令实际为 7551 ,占用两个字节,而我们修改后的指令占用空间必须小于或等于两个字节,多出的用90(nop)替代。这里我们要使用nop指令取代,也就是要替换成两个nop。

所以,我们接下来的操作是
在命令输入行:
输入a,Enter
输入nop,Enter
输入nop,Enter
直接Enter,结束


结果为:


00440F56处的指令采取的处理一样。最后按F5运行程序


提示注册成功。

到这里,就遇到一个问题。OllyDbg可以将修改后的指令保存到文件,而WinDbg怎么办?很遗憾,到现在我还没找到一个好的方法,不过可以根据要修改的地址,然后根据PE文件里的数据,算出对应的文件偏移,然后用Hex Workshop等工具把相应位置上的值改掉。这样貌似比较麻烦,不过也没办法,我能力就到这里。有人能提示一种更好的办法吗?

本文只是作为菜鸟的我初次接触WinDbg做的笔记,也是为了后面自己做驱动的逆向反汇编做准备。这里用到的破解方法不是很先进,不过就是为熟悉一下WinDbg的命令操作而已。

第一次发贴,见笑了,也请大家多多包涵,多多指教


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (44)
雪    币: 342
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
向LZ学习,谢谢
2009-7-25 23:35
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
WinDBG的 想学
LZ的第一篇笔记在哪??
2009-7-26 09:49
0
雪    币: 304
活跃值: (66)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
第一篇起了草稿,还没发表,在补充中

多谢支持
2009-7-26 11:05
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
写的非常详细的一篇文章,用函数下断点和如和找出关键跳
2009-7-26 14:12
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这种认真的态度必定会是你成功路上的法宝!!!
2009-7-26 14:52
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
期待第一篇
很有意思

WinDBG 等我学习驱动时再玩玩
2009-7-26 22:02
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
很好的文章,不过,我想问一下,一在哪里呢?
2009-7-26 22:44
0
雪    币: 8159
活跃值: (3321)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
呵呵,学习了,第一次有人出这么详细的WDBG的教程呢,收藏
2009-7-27 02:31
0
雪    币: 5286
活跃值: (3679)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
10
跟着楼主复习几个Windbg命令
2009-7-27 09:51
0
雪    币: 86
活跃值: (56)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
11
感觉破解还是ollydbg用起来舒服,更喜欢用windbg调试程序。
2009-7-27 23:02
0
雪    币: 3226
活跃值: (2868)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
期待一个完整教程...OD有CCDEBUG 的 入门系列.....winDbg 希望也有一个经典教程.. 支持楼主..
2009-7-27 23:08
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
下决心练习windbg,希望楼主继续。。。。
2009-7-28 00:17
0
雪    币: 97697
活跃值: (200744)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
14
Support.
2009-7-28 00:41
0
雪    币: 257
活跃值: (28)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
15
领教了一下WinDBG的“麻烦”,呵呵
2009-7-28 00:48
0
雪    币: 192
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
确实不太好用 。。。。。。。。。。。。。。。。。。。
2009-7-29 10:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
写的很好,支持。
2009-7-29 16:52
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
谢谢,学习                        。
2009-9-22 23:10
0
雪    币: 203
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
感谢lz提供,仔细拜读
2009-9-23 21:24
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
太强大了。顶
2009-9-23 21:59
0
雪    币: 202
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
21
不错,运用$exentry确实是个好方法,好像用  程序名!WinMain也可以,不过不是在入口点,而是在WinMain函数位置
2009-9-25 16:14
0
雪    币: 1915
活跃值: (634)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
精辟呀   收藏了
2009-9-25 16:31
0
雪    币: 177
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
windbg双机样用USB联机?
2009-9-30 17:23
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
楼主花了了很大心思啊,,现学习用windbg ,非常感谢
2009-10-1 10:13
0
雪    币: 486
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
不错,学习了,还有三吗?
2009-10-2 11:19
0
游客
登录 | 注册 方可回帖
返回
//