找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2251|回复: 1

郁金香汇编逆向外挂52节 纯汇编字串比较 评析

[复制链接]

311

主题

228

回帖

7373

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5619 个
贡献
253 次
宅之契约
0 份
在线时间
952 小时
注册时间
2014-1-25
发表于 2014-3-23 23:52:22 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
郁金香老师在实现strcmp代码为:
_declspec(naked) int strcmpA(char* s1,char* s1)
{
   _asm
   {
      push ebp
      mov ebp,esp
      xor al,al
      mov edi,[ebp+8]
      mov ecx,-1
      repnz scasb
      not ecx
      mov edi,[ebp+8]
      mov esi,[ebp+C]
      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
}


回复

使用道具 举报

0

主题

19

回帖

51

积分

用户组: 小·技术宅

UID
150
精华
0
威望
1 点
宅币
30 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2014-3-24
发表于 2014-3-24 00:35:03 | 显示全部楼层
学习了~~
回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-5-14 21:14 , Processed in 0.039425 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表