郁金香汇编逆向外挂52节 纯汇编字串比较 评析
郁金香老师在实现strcmp代码为:_declspec(naked) int strcmpA(char* s1,char* s1)
{
_asm
{
push ebp
mov ebp,esp
xor al,al
mov edi,
mov ecx,-1
repnz scasb
not ecx
mov edi,
mov esi,
repz cmpsb
mov eax,1
jnz end
pop ebp
ret
}
end:
_asm
{
mov eax,0
pop ebp
retn
}
}
这里说说我个人的看法,老师在第一次写好代码的时候运行出错,因为栈帧被内联汇编里的ret指令搞坏了,ret之后的恢复栈帧代码没有运行导致栈混乱,因此老师加入了naked修饰符作为裸函数去掉栈帧,之后又为使用参数而建立栈帧,这样做十分蹩脚,因为相当于自己去掉栈帧之后自己又建立了栈帧,如果是教学的话这种错误情有可原,在这里我提供一种更优的方式解决这个问题:
bool strcmpA(char* s1,char* s2)
{
if(!s1 || !s2)
return false;
if(s1 == s2)
return true;
_asm
{
mov edi,s1
mov ecx,-1
repnz scasb
not ecx
mov edi,s1
mov esi,s2
repz cmpsb
jnz end1
jmp end2
}
end1:
return false;
end2:
return true
}
学习了~~
页:
[1]