首页
社区
课程
招聘
[推荐]汇编与反汇编之小技巧
发表于: 2008-7-8 10:25 8545

[推荐]汇编与反汇编之小技巧

2008-7-8 10:25
8545
汇编与反汇编之小技巧
大家都知道,对于位于当前调试目标中的指令,可以使用WinDBG的u命令进行反汇编。u命令的参数是要反汇编代码的地址值或者符号,如果不指定,那么WinDBG会使用当前程序指针寄存器所指向的代码,例如:
0:001> u
ntdll!DbgBreakPoint:
7c901230 cc              int     3
7c901231 c3              ret
如果要想将汇编指令翻译为机器码,那么应该使用a命令,a命令使用的参数格式与u命令相同,只不过参数的含义代表的是要产生的机器码要存放的起始地 址。例如执行a 0x400000命令后,WinDBG会启动交互式编辑提示符(Input>),而后便可以输入汇编指令,没输入一条后,按回车,然后可以继续输入 下一条,结束时直接按回车。
举个实际的例子,启动记事本程序,然后将WinDBG附加上去,此时执行u命令看到的就是上面的反汇编结果,也就是EIP指向的是ntdll中的 DbgBreakPoint函数,这个函数只有两条指令。接下来执行a命令,在Input提示符后输入nop然后按回车,而后再按回车结束汇编操作。
此时再执行u ntdll!DbgBreakPoint命令,可以看到:
0:001> u
ntdll!DbgBreakPoint:
7c901230 90              nop
7c901231 c3              ret
可见本来的INT 3指令被替换为nop指令(机器码为90)了。
输入g命令恢复记事本程序执行,然后再按Ctrl+Break试图将其中断到调试器,发现不立刻反应了,这是因为远程中断所依赖的ntdll!DbgBreakPoint函数的INT 3指令被我们替换为NOP(空指令)了。不过当WinDBG发现中断操作超时后会使用挂起的方式来中断(感兴趣的读者,可以参考《软件调试》的10.6.7节)。
上面是基本的反汇编和汇编用法。下面再说一种特殊的用法。
如果我们在日志文件或者其它环境中看到一段机器码,那么如何将其翻译为汇编指令呢?u命令是不支持后面直接跟随机器码的。
这时一种简单的方法就是找一段内存,然后将要反汇编的机器码输入到这段内存中,然后再使用u命令。哪里找这段内存呢?这段内存必须可以写。通常可以 选择栈。具体来说,先使用r命令观察目前的栈顶地址,即ESP寄存器的值。为了不破坏栈上的数据,应该使用比ESP小的空闲区域。
例如:
0:001> r
eax=7ffd7000 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005
eip=7c901230 esp=00beffcc ebp=00befff4 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
7c901230 90              nop
上面的esp=00beffcc,如果我们要反汇编十几个字节的机器码,那么就可以使用00beff00开始的一段,即输入eb 00beff00,开始交互式编辑内存,输入要反汇编的机器码。
89.1E.83.C9.FF.F0.0F.C1.08.FF.75.08.E8.FD.0A.FD.FF.8B.45.08.5E.5B.5D.C2.08.00.CC.CC.CC.CC.CC.
输入结束后,再执行u 00beff00
0:001> u 00beff00
00beff00 891e            mov     dword ptr [esi],ebx
00beff02 83c9ff          or      ecx,0FFFFFFFFh
00beff05 f00fc108        lock xadd dword ptr [eax],ecx
00beff09 ff7508          push    dword ptr [ebp+8]
00beff0c e8fd0afdff      call    00bc0a0e
00beff11 8b4508          mov     eax,dword ptr [ebp+8]
00beff14 5e              pop     esi
00beff15 5b              pop     ebx

《软件调试》电子书下载:http://bv.csdn.net/resource/rjts.pdf
高端调试:http://advdbg.org/
《Windows用户态程序高效排错》下载:http://blogs.msdn.com/lixiong/attachment/746339.ashx

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
顶!!!!
2008-7-8 12:35
0
雪    币: 475
活跃值: (1130)
能力值: ( LV9,RANK:1410 )
在线值:
发帖
回帖
粉丝
3
WinDBG这个工具还没有用过的。不知到底能够干什么?
2008-7-8 13:16
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
老师好
2008-7-8 17:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
顶..看来我真是菜这都看不懂
2008-7-9 23:52
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
6
这本书连书中讲解的部分Src(应该是作者自己觉得重要的,作为技术保留的)都没提供的
2008-7-10 10:03
0
雪    币: 217
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
又学习了一些知识,谢谢楼主。
2008-7-10 17:42
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
下載來學習學習
2008-7-10 19:43
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
9
这本书有买....的确很厚的一本..简单看了下里面的内容很丰富.....可能还没看到后面吧...觉得具体的例子比较少......代码也的确很少
2008-7-10 21:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
汇编好久不用都忘了,得重新学习!
2008-7-14 15:01
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11

如果我们在日志文件或者其它环境中看到一段机器码,那么如何将其翻译为汇编指令呢?u命令是不支持后面直接跟随机器码的。……


吃力不讨好啊。。。一个个输入岂不太累,.readmem应该就可以了吧
2008-7-14 16:15
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
好,正需要这方面的东西
2008-7-16 17:36
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
偶一直用ida...很强大..很喜欢
2008-7-17 09:03
0
雪    币: 214
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
windbg哪儿有的下?
2008-7-17 09:49
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
应该是驱动调试用的
2008-7-17 11:49
0
雪    币: 230
活跃值: (149)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
~~~ WinDbg还是要用滴~~ 莫要小看WinDbg~~ 呵呵
2008-7-20 19:38
0
雪    币: 268
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
17
支持一下!!
2008-7-21 08:17
0
游客
登录 | 注册 方可回帖
返回
//