元始天尊 发表于 2014-3-23 23:52:22

郁金香汇编逆向外挂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
}


夜雨 发表于 2014-3-24 00:35:03

学习了~~
页: [1]
查看完整版本: 郁金香汇编逆向外挂52节 纯汇编字串比较 评析