首页
社区
课程
招聘
[求助]对test eax,eax的理解
发表于: 2008-6-1 16:23 5713

[求助]对test eax,eax的理解

2008-6-1 16:23
5713
正在学习Crack Tutorial2001中的W32Dasm静态分析部分,碰到如下代码

* Reference To: KERNEL32.lstrcmpA, Ord:02FCh
                                  |
:0040158D FF1500204000     Call dword ptr [00402000]
:00401593 85C0                    test eax, eax
:00401595 7516                    jne 004015AD
:00401597 6A40                    push 00000040

我的理解是Call dword ptr [00402000]语句就是调用KERNEL32.dl中的lstrcmpA函数来比较输入的字符串与注册码是否一致,call完后ret前,会根据是否一致来置eax的值,如果是0就表示是一致的,所以ret后就用test eax,eax测试eax值,将eax作旗帜的意思就是将eax做返回参数,用它来提供字符串比较后是相等或不等的信息.

请问我以上理解有问题么?谢谢!

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 50161
活跃值: (20625)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
函数返回值一般放EAX寄存器,所以根据EAX的值是不是0,就知lstrcmpA比较结果了。
2008-6-1 18:53
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
MSDN 对于lstrcmp()返回值的解释:
  If the string pointed to by lpString1 is less than the string pointed to by lpString2, the return value is negative.
  If the string pointed to by lpString1 is greater than the string pointed to by lpString2, the return value is positive.
  [COLOR="DarkRed"]If the strings are equal, the return value is zero.[/COLOR]


就是说,如果两个字符串相等的话就返回0值。

:0040158D FF1500204000            Call dword ptr [00402000]  ;函数返回值在eax
:00401593 85C0                    test eax, eax              ;TEST指令是隐式执行AND运算,改变标志位,但是不改变寄存器的数值。根据“与”运算规则,执行完这条指令以后,如果eax是0,则零标记位被置1;如果eax是非零值,那么零标记位被置0。
:00401595 7516                    jne 004015AD               ;JNE指令会检查零标记位,如果零标记位为1则跳转,反之亦然。
:00401597 6A40                    push 00000040


瞎说说,牛们无视好了。
2008-6-1 19:23
0
雪    币: 114
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
明白了,非常感谢!
2008-6-2 10:13
0
游客
登录 | 注册 方可回帖
返回
//