结论
这几个组合在一起通常是判断 函数返回结果是否是0.是0跳转到哪里,不是0跳转到哪里
举例分析
下面代码:就是判断2个字符串是否相等.
push edx
push eax
call dword ptr dS:[K&KERNEL32.1strcmpA> //判断edx和 eax 2个字符串是否相等,调用的是C语言的 strcmp
test eax,eax
push 0
JnZ Short Crackhe. 00401 0E8
上面代码call的是C语言的 strcmp ,这个函数比较2个字符串是否相等,如果相等,返回0,否则返回1, 返回的参数存入到eax里面.
然后如果用高级语言,想实现判断返回值是否等于0,如下
if (eax == 0){
跳转到一个地方
}else{
跳转到一个地方
}
在汇编中这么做判断eax是否等于0
test eax,eax
test作用
test作用是逻辑与,逻辑与就是2个数字相同是1,否则是0.按位逻辑与,就是每一位二进制进行逻辑与
例如 :如果是 0111和 0001按位逻辑与结果是0001,因为只有最后一位全是1,其他都是0
eax如果是二进制数 0101的话, 0101按位逻辑与还等于0101.
例如 test eax, eax 就是 让eax 和 自己逻辑与,按位逻辑与的话,eax和eax是相同的,所以,只有eax是0的时候才会是0,否则 结果就是eax本身.
但是test的作用,并不会改变后面的寄存器eax,改变的是标志位.
ZF PF标志位改变不需要记,因为不方便记忆.
这里改变了ZF标志,变成了0,
PF标志,这里不进行讲解,因为记忆标志位不方便理解.想要知道具体的可以自己查询.
需要联合记忆.
我们需要记住是test下面语句的跳转语句意思
jnz
例如jnz,那么就是说不等于0的时候跳转n是not不,z是zero零.jnz检验的标志位就是zf,这个标志位通过test改变了zf,然后jnz进行跳转.当test比较的结果不等于0,就跳转
jz
test比较结果等于0才跳转.
例如 test eax,eax. 当eax等于0的时候. 0 按位逻辑与0的结果还是0, 那么 下面执行jz的时候就直接跳转了
总结
call 函数改变了eax
test eax,eax,判断eax是否等于0
jnz 判断如果不等于0跳转,相当于是用if else 判断是否等于0
下面截图是一段汇编指令,判断2个字符串是否相等的