首页
社区
课程
招聘
[已解决]test后面接je是什么意思?
发表于: 2009-1-15 18:32 6083

[已解决]test后面接je是什么意思?

2009-1-15 18:32
6083
test eax,eax
je  004C8C29

一般不都是jz,jnz吗?我理解的是如果jz,那么就是检测eax是否为空,如果为空则跳转;
那么je怎么解释?另外,这两句放到这个程序里什么意思?

004C8BA9    8D95 F4FDFFFF   lea edx,dword ptr ss:[ebp-20C]
004C8BAF    8B83 04030000   mov eax,dword ptr ds:[ebx+304]
004C8BB5    E8 E648F8FF     call RescueXP.0044D4A0
004C8BBA    83BD F4FDFFFF00 cmp dword ptr ss:[ebp-20C],0
004C8BC1    74 7C           je short RescueXP.004C8C3F
004C8BC3    8D95 F0FDFFFF   lea edx,dword ptr ss:[ebp-210]
004C8BC9    8B83 04030000   mov eax,dword ptr ds:[ebx+304]
004C8BCF    E8 CC48F8FF     call RescueXP.0044D4A0
004C8BD4    8B85 F0FDFFFF   mov eax,dword ptr ss:[ebp-210]
004C8BDA    50              push eax
004C8BDB    8D85 ECFDFFFF   lea eax,dword ptr ss:[ebp-214]
004C8BE1    8D95 00FFFFFF   lea edx,dword ptr ss:[ebp-100]
004C8BE7    E8 0CC3F3FF     call RescueXP.00404EF8
004C8BEC    8B85 ECFDFFFF   mov eax,dword ptr ss:[ebp-214]
004C8BF2    5A              pop edx
004C8BF3    E8 98C6F3FF     call RescueXP.00405290
004C8BF8    85C0            test eax,eax
004C8BFA    74 2D           je short RescueXP.004C8C29    // 就是这里,004C8C29的地址是错误信息
004C8BFC    33D2            xor edx,edx
004C8BFE    8B83 04030000   mov eax,dword ptr ds:[ebx+304]
004C8C04    E8 C748F8FF     call RescueXP.0044D4D0

004C8C09    B8 BC8D4C00     mov eax,RescueXP.004C8DBC    ASCII "Registration Key Accepted Thank you for registering."

............

004C8C29    B8 FC8D4C00     mov eax,RescueXP.004C8DFC     ASCII "WARNING - Incorrect Key Entered WinRescue may be used without entering a Key WinRescue Terminating."

不知道为什么要这样写

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
jz和je是同一条指令的两个不同记号而已。
2009-1-15 18:34
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
je是检查test a b中,a 和b是不是相等,而jz是检查cpu的标志控制位,如果零标志位是0就跳。
2009-1-15 18:54
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
那 test eax,eax,为两个一样的值,岂不是永远相等?不好意思,汇编盲,问的弱了请见谅,呵呵
2009-1-15 18:57
0
雪    币: 347
活跃值: (30)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
5
那样je就会跳
2009-1-15 19:10
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
JE指令和JZ指令是等价的。
2009-1-15 19:15
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
7
就是同一条指令的不同且记符,机器码是0x74。
2009-1-15 19:17
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
je跳到了注册错误的信息中,想知道这两句话放在这里是怎么实现的,什么意思
2009-1-15 19:24
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
1.test a,b 是a与b相与的意思,不是检查a,b是否相等。故test eax,eax是检查eax是否为零。
1.test可以影响cf,of,pf,sf,zf标志位。
2.JE当zf为零时跳转。
3.“jz和je是同一条指令的两个不同记号而已”(引用彭书呆)。
2009-1-15 19:26
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
那 test eax,eax 放到这程序里面对于验证是否注册有什么意义呢?为什么要检测这个值是不是零呢?
2009-1-15 20:28
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
test的目的应该只是置0,为了je可以跳。
没有这步,无法跳转。
2009-1-15 20:54
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
12
补充:

1.test a,b是做 AND 运算(虽然通常是用来测试结果是否为零,但不限于此,比如一些位掩码操作,或者正负号判断等),但不把结果写回目的操作数,仅根据结果的值来置标志位。

2.je/jz 是 当运算结果为0时则跳,也就是当EFLAGS中的ZF标志为1时跳转。ZF标志为1,说明上一次运算(不管是算术运算还是逻辑运算)结果为0,而ZF为0,说明运算结果非0。

那 test eax,eax 放到这程序里面对于验证是否注册有什么意义呢?为什么要检测这个值是不是零呢?


因为EAX中是前一步的计算结果(比如验证是否成功),要判断验证是否成功,当然就等于判断EAX中的值了。当然,理论上不一定要和0比较,也可以进行其它的判断,但在这种情况下通常是一种bool型的值,在C中没有bool这种类型,而是把0作为false,把任何非0值作为true,所以这里就要判断它是true还是false,也就是判断它是不是为零了。

提个小建议,楼主应该先学习一段时间的编程,而不是一开始就照着汇编手册学逆向,这样效率不高。
2009-1-15 20:56
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
说错了,没有test不是无法跳转,而是跳转不受设计者控制,不知道什么状况会发生跳转
2009-1-15 20:56
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
多谢大家,特别要感谢 书呆彭 版主
2009-1-15 21:23
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
还好还好,能看懂汇编。。。
2009-1-15 21:25
0
游客
登录 | 注册 方可回帖
返回
//