吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 2381|回复: 16

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

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

本帖最后由 gmh5225 于 2014-12-28 23:15 编辑

写这个纯属就是自己记录下自己的学习经历,没有其他的意思。
详细命令请百度谷歌 8086汇编指令




继上几次C函数的调用方式 (1) __cdecl  (2) __stacall  (3) __fastcall
这次是C++的,多了一个类的自身对象 thiscall
thiscall会隐含一个this参数,在执行call前会给ecx


原型:
  1. class Mythiscall
  2. {
  3. public:
  4.         int add(int,int);
  5. };
  6. int Mythiscall::add(int a,int b)
  7. {
  8.         return a+b;
  9. }
  10. int main()
  11. {   
  12.         Mythiscall t;
  13.         int a=3,b=4,c=0;
  14.         c=t.add(a,b);
  15.         printf("%d",c);
  16.         system("pause");
  17.         return 0;
  18. }
复制代码
反汇编:
  1. 0128103E    50              push    eax
  2. 0128103F    8B4D FC         mov     ecx, dword ptr [ebp-0x4]
  3. 01281042    51              push    ecx
  4. 01281043    8D4D F3         lea     ecx, dword ptr [ebp-0xD]         ; 传递一个隐藏的this参数,赋值给ecx
  5. 01281046    E8 B5FFFFFF     call    testtest.Mythiscall::add  
复制代码

而加法函数内部:
  1. 01281000 >  55              push    ebp
  2. 01281001    8BEC            mov     ebp, esp
  3. 01281003    51              push    ecx
  4. 01281004    894D FC         mov     dword ptr [ebp-0x4], ecx            this参数赋值给第一个局部变量
  5. 01281007    8B45 08         mov     eax, dword ptr [ebp+0x8]
  6. 0128100A    0345 0C         add     eax, dword ptr [ebp+0xC]
  7. 0128100D    8BE5            mov     esp, ebp
  8. 0128100F    5D              pop     ebp
  9. 01281010 >  C2 0800         retn    0x8
复制代码
上面的讲完了,那么就讲C++的核心,面向对象,类,那类里面又属什么是核心呢,那就是虚函数了。



先看C++源代码:
  1. class Myfun
  2. {
  3.         public:
  4.                 virtual int add(int a,int b)
  5.                 {
  6.                         return a+b;
  7.                 }
  8.                 virtual int mul(int a,int b)
  9.                 {
  10.                         return a*b;
  11.                 }
  12. };
  13. int main()
  14. {
  15.         Myfun *m=new Myfun();
  16.         m->add(2,3);
  17.         m->mul(2,3);
  18.         return 0;
  19. }
复制代码

OD反汇编:


  1. 00CD1040 >/[        DISCUZ_CODE_21        ]nbsp; 55            push    ebp
  2. 00CD1041  |.  8BEC          mov     ebp, esp
  3. 00CD1043  |.  83EC 0C       sub     esp, 0xC
  4. 00CD1046  |.  6A 04         push    0x4                                     ;  为新指针m分配空间
  5. 00CD1048  |.  FF15 A820CD00 call    dword ptr [<&MSVCR100.operator new>]    ;  msvcr100.operator new
  6. 00CD104E  |.  83C4 04       add     esp, 0x4
  7. 00CD1051  |.  8945 F8       mov     dword ptr [ebp-0x8], eax                ;  new一个指针
  8. 00CD1054  |.  837D F8 00    cmp     dword ptr [ebp-0x8], 0x0
  9. 00CD1058  |.  74 0D         je      short testtest.00CD1067                 ;  判断指针是否为空
  10. 00CD105A  |.  8B4D F8       mov     ecx, dword ptr [ebp-0x8]
  11. 00CD105D  |.  E8 3E000000   call    testtest.Myfun::Myfun                   ;  指针指向Myfun类
  12. 00CD1062  |.  8945 F4       mov     dword ptr [ebp-0xC], eax                ;  返回的eax指针
  13. 00CD1065  |.  EB 07         jmp     short testtest.00CD106E
  14. 00CD1067  |>  C745 F4 00000>mov     dword ptr [ebp-0xC], 0x0
  15. 00CD106E  |>  8B45 F4       mov     eax, dword ptr [ebp-0xC]
  16. 00CD1071  |.  8945 FC       mov     dword ptr [ebp-0x4], eax
  17. 00CD1074  |.  6A 03         push    0x3                                     ;  压3
  18. 00CD1076  |.  6A 02         push    0x2                                     ;  压2
  19. 00CD1078  |.  8B4D FC       mov     ecx, dword ptr [ebp-0x4]                ;  this指针 传入ecx
  20. 00CD107B  |.  8B11          mov     edx, dword ptr [ecx]                    ;  this指针指向虚函数
  21. 00CD107D  |.  8B4D FC       mov     ecx, dword ptr [ebp-0x4]
  22. 00CD1080  |.  8B02          mov     eax, dword ptr [edx]                    ;  虚函数指针指向add函数
  23. 00CD1082  |.  FFD0          call    eax                                     ;  调用add函数
  24. 00CD1084  |.  6A 03         push    0x3                                     ;  压3
  25. 00CD1086  |.  6A 02         push    0x2                                     ;  压2
  26. 00CD1088  |.  8B4D FC       mov     ecx, dword ptr [ebp-0x4]                ;  this指针 传入ecx
  27. 00CD108B  |.  8B11          mov     edx, dword ptr [ecx]                    ;  this指针指向虚函数
  28. 00CD108D  |.  8B4D FC       mov     ecx, dword ptr [ebp-0x4]
  29. 00CD1090  |.  8B42 04       mov     eax, dword ptr [edx+0x4]                ;  虚函数指针指向mul函数
  30. 00CD1093  |.  FFD0          call    eax                                     ;  调用mul函数
  31. 00CD1095  |.  33C0          xor     eax, eax
  32. 00CD1097  |.  8BE5          mov     esp, ebp
  33. 00CD1099  |.  5D            pop     ebp
  34. 00CD109A  \.  C3            retn
复制代码
add函数内部
  1. 00CD1000 >/.  55            push    ebp
  2. 00CD1001  |.  8BEC          mov     ebp, esp
  3. 00CD1003  |.  51            push    ecx
  4. 00CD1004  |.  894D FC       mov     dword ptr [ebp-0x4], ecx                ;  this指针
  5. 00CD1007  |.  8B45 08       mov     eax, dword ptr [ebp+0x8]                ;  参数1
  6. 00CD100A  |.  0345 0C       add     eax, dword ptr [ebp+0xC]                ;  参数2
  7. 00CD100D  |.  8BE5          mov     esp, ebp
  8. 00CD100F  |.  5D            pop     ebp
  9. 00CD1010  \.  C2 0800       retn    0x8
复制代码
mul函数内部
  1. 00CD1020 >/.  55            push    ebp
  2. 00CD1021  |.  8BEC          mov     ebp, esp
  3. 00CD1023  |.  51            push    ecx
  4. 00CD1024  |.  894D FC       mov     dword ptr [ebp-0x4], ecx                ;  this指针
  5. 00CD1027  |.  8B45 08       mov     eax, dword ptr [ebp+0x8]                ;  参数1
  6. 00CD102A  |.  0FAF45 0C     imul    eax, dword ptr [ebp+0xC]                ;  参数2
  7. 00CD102E  |.  8BE5          mov     esp, ebp
  8. 00CD1030  |.  5D            pop     ebp
  9. 00CD1031  \.  C2 0800       retn    0x8
复制代码


我们发现,调用虚函数的时候,是用了2级指针去访问的,第一级指针是this指针,第二级是虚函数指针,然后再用虚函数指针去访问相应的函数



评分

参与人数 26HB +47 THX +21 收起 理由
24567 + 1
一路走来不容易 + 1
temp + 1
消逝的过去 + 1
ldljlzw + 1
weiran324 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
MoeRay + 1
jaunic + 1
hnymsh + 1
lies + 1
轻轻不语 + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!
jolly_800 + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
y123y45 + 1 + 1 好人有好报!你的热心我永远不忘!谢谢!
ningzhonghui + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!
Cyan + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
逍遥枷锁 + 2 + 1 好人有好报!你的热心我永远不忘!谢谢!
vipcrack + 4 + 1 论坛有你更精彩!感谢楼主!
Scar-疤痕 + 4 + 1 论坛有你更精彩!感谢楼主!
Desire + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!
Mrsin + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!
Top丶邪少 + 5 + 1 大型连续剧,1400集!
奥特曼 + 1 + 1 恒大说“评分不扣自己的分”!!
狮子 + 1 + 1 祝楼主桃花运天天都有,哈哈!
雨季 + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!!.
神秘小子 + 2 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
Shark恒 + 5 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
520Kelly 发表于 2014-12-28 23:24 | 显示全部楼层

说得好深奥、真的是接触不到这么高级的东西

膜拜gmh师傅

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
神秘小子 发表于 2014-12-28 23:25 | 显示全部楼层

看过就要支持  谢谢大神教程
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
htqweszxc 发表于 2014-12-29 08:27 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Cyan 发表于 2014-12-29 10:01 | 显示全部楼层

感谢 学习下
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
fcguo800 发表于 2017-11-30 14:54 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
别管我了行 发表于 2022-2-25 02:37 | 显示全部楼层

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

感谢分享,很给力!~
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
weiran324 发表于 2022-3-30 23:24 | 显示全部楼层

学习学习,,,
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
weiran324 发表于 2022-3-31 18:32 | 显示全部楼层

学习学习,,,
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!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

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