吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 3494|回复: 14

[原创逆向图文] 汇编逆向(三)

  [复制链接]
gmh5225 发表于 2014-12-25 17:08 | 显示全部楼层 |阅读模式

本帖最后由 gmh5225 于 2014-12-25 17:11 编辑

写这个纯属就是自己记录下自己的学习经历,没有其他的意思。




局部变量,参数,全局变量


无脑记法:
局部变量:第一个[ebp-4] 第二个[ebp-8],类推
参数:第一个参数[ebp+8],第二个[ebp+C],类推
全局变量:一般都是 mov eax,dword ptr ds:[0x4004000]之类的
局部变量需要使用sub  esp,xx 开辟空间xx个字节空间,有几个局部变量就开几个
举例:
  1. 003C1040 >  55              push    ebp                                ;保存原来ebp指针
  2. 003C1041    8BEC            mov     ebp, esp                         ;  ebp指向esp,即堆栈
  3. 003C1043    83EC 0C         sub     esp, 0xC                         ; 开辟12个字节空间供3个变量
  4. 003C1046    C745 FC 0300000>mov     dword ptr [ebp-0x4], 0x3         ; int a
  5. 003C104D    C745 F8 0400000>mov     dword ptr [ebp-0x8], 0x4         ; int b
  6. 003C1054    C745 F4 0000000>mov     dword ptr [ebp-0xC], 0x0         ; int c
  7. ////////////////////////////////////////////////////////////////////////
  8. 003C10A9    83C4 04         add     esp, 0x4
  9. 003C10AC    33C0            xor     eax, eax                                     ;清空eax
  10. 003C10AE    8BE5            mov     esp, ebp                                   ;esp指向当前ebp,同步跟进
  11. 003C10B0    5D              pop     ebp                                             ;  还原原来ebp指针
  12. 003C10B1    C3              retn
复制代码
可以看到我的第一个局部变量是 [ebp-0x4],初值是3,第二个是b,第三个是c


而参数因为之前的压栈导致esp的减少,一般如果是int型,就每次减4个字节,进行call的时候还会减4字节,在ret时返回4字节平衡,所以第一个参数就是ebp+8,注意堆栈的存储方式
,第二个就是ebp+c
举例:
  1. 003C1000 >  55              push    ebp
  2. 003C1001    8BEC            mov     ebp, esp
  3. 003C1003    8B45 08         mov     eax, dword ptr [ebp+0x8]    //这里是第一个参数
  4. 003C1006    0345 0C         add     eax, dword ptr [ebp+0xC]   // b
  5. 003C1009    5D              pop     ebp
  6. 003C100A    C3              retn
复制代码
此外,编译器还会用其他的寄存器来代替开辟局部变量的操作,以此来节省二进制的大小
C源代码:
  1. int add(int a,int b)
  2. {
  3.         int c=a+b;
  4.         return c;
  5. }
  6. int main()
  7. {   
  8.         int a=3,b=4,c=0;
  9.         c=add(a,b);
  10.         printf("%d",c);
  11.         system("pause");
  12.         return 0;
  13. }
复制代码
OD反汇编:
主要看add这个函数内部:
  1. 010E1000 >  55              push    ebp
  2. 010E1001    8BEC            mov     ebp, esp
  3. 010E1003    51              push    ecx //这里就是运用了节省空间的方法,达到同样开辟4字节的效果
  4. 010E1004    8B45 08         mov     eax, dword ptr [ebp+0x8]
  5. 010E1007    0345 0C         add     eax, dword ptr [ebp+0xC]
  6. 010E100A    8945 FC         mov     dword ptr [ebp-0x4], eax
  7. 010E100D    8B45 FC         mov     eax, dword ptr [ebp-0x4]
  8. 010E1010 >  8BE5            mov     esp, ebp
  9. 010E1012    5D              pop     ebp
  10. 010E1013    C3              retn
复制代码
上面的代码可以看到,push ecx这命令,相当于是sub  esp,4 不过这样写二进制编码就是51,节省了很大的空间,提高效率



全局变量:一般都是 mov eax,dword ptr ds:[0x4004000]之类的,里面的内容是一个4字节的内存地址
C源代码:
  1. int x=0;
  2. int add(int a,int b)
  3. {

  4.         return a+b+x;
  5. }
  6. int main()
  7. {   
  8.         int a=3,b=4,c=0;
  9.         x=5;
  10.         c=add(a,b);
  11.         printf("%d",c);
  12.         system("pause");
  13.         return 0;
  14. }
复制代码
OD反汇编:
  1. 01071020 >  55              push    ebp
  2. 01071021    8BEC            mov     ebp, esp
  3. 01071023    83EC 0C         sub     esp, 0xC                         ; 开辟12个字节的空间
  4. 01071026    C745 FC 0300000>mov     dword ptr [ebp-0x4], 0x3         ; int a=3
  5. 0107102D    C745 F8 0400000>mov     dword ptr [ebp-0x8], 0x4         ; int b=4
  6. 01071034    C745 F4 0000000>mov     dword ptr [ebp-0xC], 0x0         ; int c=0
  7. 0107103B    C705 6C330701 0>mov     dword ptr [x], 0x5               ; 全局变量x=5
  8. 01071045    8B45 F8         mov     eax, dword ptr [ebp-0x8]
  9. 01071048    50              push    eax                              ; 压b
  10. 01071049    8B4D FC         mov     ecx, dword ptr [ebp-0x4]
  11. 0107104C    51              push    ecx                              ; 压a
  12. 0107104D    E8 AEFFFFFF     call    testtest.add                     ; 调用add函数
  13. 01071052    83C4 08         add     esp, 0x8                         ; 堆栈平衡
  14. 01071055    8945 F4         mov     dword ptr [ebp-0xC], eax
  15. 01071058    8B55 F4         mov     edx, dword ptr [ebp-0xC]
  16. 0107105B    52              push    edx
  17. 0107105C    68 F4200701     push    testtest.010720F4                ; ASCII "%d"
  18. 01071061    FF15 9C200701   call    dword ptr [<&MSVCR100.printf>]   ; msvcr100.printf
  19. 01071067    83C4 08         add     esp, 0x8
  20. 0107106A    68 F8200701     push    testtest.010720F8                ; ASCII "pause"
  21. 0107106F    FF15 A4200701   call    dword ptr [<&MSVCR100.system>]   ; msvcr100.system
  22. 01071075    83C4 04         add     esp, 0x4                         ; 压 a
  23. 01071078    33C0            xor     eax, eax
  24. 0107107A    8BE5            mov     esp, ebp
  25. 0107107C    5D              pop     ebp
  26. 0107107D    C3              retn
复制代码


看下add函数
  1. 01071000 >  55              push    ebp
  2. 01071001    8BEC            mov     ebp, esp
  3. 01071003    8B45 08         mov     eax, dword ptr [ebp+0x8]         ; 参数1 a
  4. 01071006    0345 0C         add     eax, dword ptr [ebp+0xC]         ; 参数2 b  a=a+b
  5. 01071009    0305 6C330701   add     eax, dword ptr [x]               ; 全局变量x   a=a+x
  6. 0107100F    5D              pop     ebp
  7. 01071010 >  C3              retn
复制代码

变量到此结束!







评分

参与人数 25HB +51 THX +17 收起 理由
花盗睡鼠 + 2 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
对影成三人 + 1 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
虚心学习 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
一路走来不容易 + 1
Soul1999 + 1
temp + 1
消逝的过去 + 2
冷亦飞 + 1
liugu0hai + 1 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
ldljlzw + 1
weiran324 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
jaunic + 1
hnymsh + 1
lies + 1
轻轻不语 + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!
sndncel + 2 + 1 评分=感恩!简单却充满爱!感谢您的作品!
雨季 + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!!.
Top丶邪少 + 5 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
Shark恒 + 10 + 1 YES
Scar-疤痕 + 4 + 1 教程非常易懂,对新人帮助极大!楼主大爱!
逍遥枷锁 + 2 + 1 好人有好报!你的热心我永远不忘!谢谢!
Desire + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!
小者 + 2 + 1 评分=感恩!简单却充满爱!感谢您的作品!
520Kelly + 2 + 1 评分=感恩!简单却充满爱!感谢您的作品!!.
Mrsin + 2 + 1 评分=感恩!简单却充满爱!感谢您的作品!!.

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Scar-疤痕 发表于 2014-12-25 17:39 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
geekcat 发表于 2014-12-25 19:48 | 显示全部楼层

希望这个系列一直做下去!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
sndncel 发表于 2014-12-25 20:49 | 显示全部楼层

谢谢分享。这个要支持一下,对于新手来说,非常的有用呀。。。。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Desire 发表于 2014-12-25 23:29 | 显示全部楼层

不会c语言怎么破
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
=天天= 发表于 2015-1-2 23:21 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
fcguo800 发表于 2017-11-30 14:51 | 显示全部楼层

感谢楼主教程,继续学习中。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
别管我了行 发表于 2022-2-25 02:25 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
weiran324 发表于 2022-3-31 18:27 | 显示全部楼层

学习学习
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
4957465 发表于 2022-5-20 02:05 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

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