首页
社区
课程
招聘
[求助]请教一个反汇编阅读的问题。
发表于: 2008-12-16 20:31 3429

[求助]请教一个反汇编阅读的问题。

2008-12-16 20:31
3429
最近在学习认识反汇编代码。

在阅读过基本的指令之后,开始想拿API的汇编代码来实践一下。

下面是TerminateProcess的反汇编代码,我遇到一处不解的地方。

盼版主帮助。

kernel32!TerminateProcess:
7c801e16 8bff            mov     edi,edi
7c801e18 55              push    ebp
7c801e19 8bec            mov     ebp,esp
7c801e1b 837d0800        cmp     dword ptr [ebp+8],0
7c801e1f 7509            jne     kernel32!TerminateProcess+0x14 (7c801e2a)

kernel32!TerminateProcess+0xb:
7c801e21 6a06            push    6
7c801e23 e888740000      call    kernel32!SetLastError (7c8092b0)
7c801e28 eb1b            jmp     kernel32!TerminateProcess+0x2f (7c801e45)

kernel32!TerminateProcess+0x14:
7c801e2a ff750c          push    dword ptr [ebp+0Ch]
7c801e2d ff7508          push    dword ptr [ebp+8]
7c801e30 ff15fc13807c    call    dword ptr [kernel32!_imp__NtTerminateProcess (7c8013fc)]
7c801e36 85c0            test    eax,eax
7c801e38 7c05            jl      kernel32!TerminateProcess+0x29 (7c801e3f)

kernel32!TerminateProcess+0x24:
7c801e3a 33c0            xor     eax,eax
7c801e3c 40              inc     eax
7c801e3d eb08            jmp     kernel32!TerminateProcess+0x31 (7c801e47)

kernel32!TerminateProcess+0x29:
7c801e3f 50              push    eax
7c801e40 e826750000      call    kernel32!BaseSetLastNTError (7c80936b)

kernel32!TerminateProcess+0x2f:
7c801e45 33c0            xor     eax,eax

kernel32!TerminateProcess+0x31:
7c801e47 5d              pop     ebp
7c801e48 c20800          ret     8

请问红色的两句指令合起来是什么意思?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
只要对指令执行的机理有所了解,这个很简单的。

先说JL这条指令,助记符的意思是“小于则跳转(Jump if Less)”

它与CPUEFLAGS的对应关系为:当OF!=SF时,条件跳转成立。

再说TEST指令对EFLAGS的影响,由于TEST指令实际进行的是逻辑“与”运算,所以OF置0,SF与结果的最高位相同,在上例TEST EAX, EAX中,SF与EAX的BIT31相同。

结合起来就是,当EAX的最高位是1时则跳转。

可以看到,将JL改成JS也是一样的功能,因为TEST指令将OF置0了。
2008-12-16 21:10
0
雪    币: 180
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
呆头呆头
2008-12-16 21:28
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
书呆彭你分析得真好啊。

(1)逻辑“与”运算时,OF会被置0,SF与“与”运算结果的最高位相同。

(2)JL指令跳转的条件是OF!=SF;JS跳转的条件是SF=1。

这是我对以上规则的理解,不知道对吗?

最要命的问题,

我一直都对“条件跳转指令的跳转条件”和“各种运算对EFLAGS的影响”不太清楚,

看了很多书说得也是含含糊糊,没有像你上面分析的那么清晰。

你能帮我像上面那样系统地整理一下,或是给介绍我一个学习的资料吗?

谢谢啊。
2008-12-16 21:34
0
雪    币: 180
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不用客气,嘿嘿
2008-12-16 21:52
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
楼上的你别装了好不好。
---------------------------------------

书呆彭再帮我看看吧。
2008-12-16 22:13
0
雪    币: 155
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
我晕,山寨书呆彭!!!!!!!!!!!!
2008-12-16 22:21
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
8
关于标志位与条件码,常用的一般都很容易记住的,不需要死记的,理解了就记住了。

如果实在没把握,就查一下指令手册。

手头没有手册的可以看电子档,手册中有每每次指令的详细说明,包括对标志位的影响和条件码对应什么标志位:

http://www.intel.com/products/processor/manuals/
2008-12-17 01:14
0
游客
登录 | 注册 方可回帖
返回
//