首页
社区
课程
招聘
[转帖] 汇编代码对应的高级语言分析
发表于: 2008-6-14 07:55 2587

[转帖] 汇编代码对应的高级语言分析

2008-6-14 07:55
2587
该程序使用c++编写
0053C9C0是一个对象指针
0053C9C4也是一个对象指针

.....
有问题。。。
大家补充哈  

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 1829
活跃值: (1372)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
2
谁写的?错误不少啊。

1. call [eax+xxxxx]  一般是调用重载过的函数,因为要取虚函数表

ps:重载过的函数不见得就是虚函数

2. 如果发现
call [reg+xxxx] 前面的那个ecx不等于对象地址,或者对象地址压栈,则极可能是调用类的静态虚函数。

ps:虚函数不能为静态
后面就没看了。
2008-6-14 09:50
0
雪    币: 82
活跃值: (521)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=backer;466542]谁写的?错误不少啊。

1. call [eax+xxxxx]  一般是调用重载过的函数,因为要取虚函数表

ps:重载过的函数不见得就是虚函数

2. 如果发现
call [reg+xxxx] 前面的那个ecx不等于对象地址,或者对象地址压栈,则极可能是调用类的静态虚函数。

...[/QUOTE]

........
网上看到的,,,本来想转过来大家一起把定式都列出来的。。。
2008-6-14 21:05
0
雪    币: 1829
活跃值: (1372)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
4
识别虚函数调用,除了this指针作为成员函数的依据,间接调用作为虚函数特征,还要看内存模型。像call [reg+xxxx]这样的,你可以通过前面对reg的定义,找到虚表的位置,如果虚表的位置合理,而且能确定this指针,那就可以高度怀疑是虚函数了,但是也有其他可能,比如程序员可能将首4字节作为函数地址数组的指针,里面每个元素是成员函数,然后调用之。较可靠的办法就是找到构造函数,里面一定有对虚表的初始化。

如果发现call [reg+xxxx] 前面的那个ecx不等于对象地址,或者reg不是对象的首地址,而现在又不是多虚拟继承,那就可以认定不是虚函数调用,而是对函数的间接调用,而[reg+xxxx]更可以说明是函数地址被保存到某个偏移量上,而这个首地址可能是数组,也可能是结构或者是类对象,那就需要进一步去分析排除了。
2008-6-15 00:07
0
雪    币: 82
活跃值: (521)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
恩,识别虚函数调用单靠看调用是不能确定的。。
还得看构造函数时有没有对虚表的初始。。还有结合内存看。
3Q

typedef void (*pFn[4])();
void main()
{
        pFn pfn;
        int i = 0;
        pfn[0] = Fn1;
        pfn[1] = Fn2;
        pfn[2] = Fn3;

        scanf("%d", &i);
        pfn[0 + i]();
        pfn[1]();
        pfn[2]();

        return ;
}

00401030  /$  83EC 14       sub     esp, 14                          ;  让栈空间出来
00401033  |.  8D4424 00     lea     eax, dword ptr [esp]
00401037  |.  C74424 00 000>mov     dword ptr [esp], 0
0040103F  |.  50            push    eax
00401040  |.  68 48804000   push    00408048                         ;  ASCII "%d"
00401045  |.  C74424 0C 001>mov     dword ptr [esp+C], 00401000      ;  fn1函数地址 。esp+C 数组首地址
0040104D  |.  C74424 10 101>mov     dword ptr [esp+10], 00401010     ;  fn2函数地址
00401055  |.  C74424 14 201>mov     dword ptr [esp+14], 00401020     ;  fn3函数地址
0040105D  |.  E8 4F000000   call    004010B1                         ;  scanf函数,参数分别是上面的两个push。eax和%d
00401062  |.  8B4C24 08     mov     ecx, dword ptr [esp+8]           ;  取i给ecx
00401066  |.  FF548C 0C     call    dword ptr [esp+ecx*4+C]          ;  这里可以提取出来,esp+c+ecx*4,esp+c前面已经看到是数组的首地址,所以是首地址加上偏移访问数组其元素。
0040106A  |.  E8 A1FFFFFF   call    00401010                         ;  这两个被编译器直接识别出来了。。优化了。。。
0040106F  |.  E8 ACFFFFFF   call    00401020                         ;  这两个被编译器直接识别出来了。。优化了。。。
00401074  |.  83C4 1C       add     esp, 1C                          ;  平衡栈空间,sub esp,14.加上两个push = 1c
00401077  \.  C3            retn

这样的应该就算数组首地址加偏移访问吧?

大家多多讨论高级语言到汇编下的形式哈。。。
这样对反汇编速度,和能力都会有大大的提高。。
学习。
2008-6-15 07:48
0
雪    币: 86
活跃值: (34)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
6
暂时还不懂类的用法,先收藏
2008-8-16 22:27
0
游客
登录 | 注册 方可回帖
返回
//