首页
社区
课程
招聘
[讨论]关于精华9中“类的逆向分析”
发表于: 2008-6-30 16:48 9556

[讨论]关于精华9中“类的逆向分析”

2008-6-30 16:48
9556

如下
seg000:00443EDE                 mov     eax, ds:dword_A14E68
seg000:00443EE3                 mov     eax, [eax+2D4h]
seg000:00443EE9                 mov     edx, [eax+32040h]
seg000:00443EEF                 push    ebx
seg000:00443EF0                 mov     ebx, [ecx]
seg000:00443EF2                 push    esi
seg000:00443EF3                 lea     ecx, [eax+32040h]
seg000:00443EF9                 push    edi
seg000:00443EFA                 call    dword ptr [edx+8]

对于这个全局变量 ds:dword_A14E68地址 存放的值 经过一系列变换最后 call    dword ptr [edx+8]  我想知道对于这个ds:dword_A14E68地址里面的值应该怎么看,是理解为类指针吗?还是什么?

--------------------------------------------------------------------------------

标 题: 答复
作 者: 十三少
时 间: 2007-10-16 20:58
详细信息:

class A14E68
{
   UnkownClass *cls2D4;
}
class UnkownClass
{
   UnkownClass2 cls32040;
}
class UnkownClass2
{
   virtual void func1();
   virtual void func2();
   virtual void func3(void arg1,void arg2,void arg3);
}

call [edx+8] 等于:
A14E68 test;
test.cls2D4->cls32040.func3(arg1,arg2,arg3);
-------------------------------------------------------------------------------------------------
以上是精华9中的一篇文章,我认为UnkownClass2 cls32040;应该是UnkownClass2  * cls32040;指针才对,因为其mov     edx, [eax+32040h]是使用了[]寻址,大家觉得呢?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 226
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
你错的,我对的
2008-7-1 00:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习了............................................
2008-7-1 05:37
0
雪    币: 228
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
老大,说说原因啊,我一直想不明白
2008-7-1 09:29
0
雪    币: 228
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
ok,明白了

seg000:00443EDE                 mov     eax, ds:dword_A14E68//这里直接传值,所以是对象而不是指针
seg000:00443EE3                 mov     eax, [eax+2D4h]//这里是取变量而不是函数或虚函数表,使用了[],所以是指针
seg000:00443EE9                 mov     edx, [eax+32040h]//这里并不是取变量,而是取虚函数表,所以不是指针,而是对象
seg000:00443EEF                 push    ebx
seg000:00443EF0                 mov     ebx, [ecx]
seg000:00443EF2                 push    esi
seg000:00443EF3                 lea     ecx, [eax+32040h]//传递this指针,这里也是判断的方式之一
seg000:00443EF9                 push    edi
seg000:00443EFA                 call    dword ptr [edx+8]//调用第3个虚函数
2008-7-1 09:47
0
雪    币: 228
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
开始我没想明白,重要是先入为主的将seg000:00443EE9                 mov     edx, [eax+32040h]这句以为是取变量的值,而没注意后面的调用,原来该句是取虚函数表,老大要看到请确认下
2008-7-1 09:49
0
雪    币: 1746
活跃值: (287)
能力值: (RANK:450 )
在线值:
发帖
回帖
粉丝
7
13 重出江湖了
2008-7-1 10:50
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
8
5楼的解释应该也是错的:
seg000:00443EDE                 mov     eax, ds:dword_A14E68//
seg000:00443EE3                 mov     eax, [eax+2D4h]//
seg000:00443EE9                 mov     edx, [eax+32040h]//从这里可以判断出上面一行的[eax+2D4h]是另外一个类的指针
seg000:00443EEF                 push    ebx
seg000:00443EF0                 mov     ebx, [ecx]
seg000:00443EF2                 push    esi
seg000:00443EF3                 lea     ecx, [eax+32040h]//从这里可以判断出[eax+32040h]是类,而不是指针
seg000:00443EF9                 push    edi
seg000:00443EFA                 call    dword ptr [edx+8]//调用第3个虚函数
2008-7-1 12:53
0
雪    币: 226
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
向『虚拟机技术』组长学习
2008-7-1 19:49
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
10
a! 13回来了。
2008-7-1 21:21
0
雪    币: 226
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
怎么这么熟,哪儿见过
2008-7-9 13:29
0
雪    币: 475
活跃值: (1130)
能力值: ( LV9,RANK:1410 )
在线值:
发帖
回帖
粉丝
12
seg000:00443EDE                 mov     eax, ds:dword_A14E68  //取类的起始地址A14E68到eax寄存器.
seg000:00443EE3                 mov     eax, [eax+2D4h] //eax加偏移量(指针变量地址)形成一个新地址,然后按间接寻址模式取出[eax+2D4h]所指单元的内容到EAX,该内容其实是UnkownClass的起始地址.   
seg000:00443EE9                 mov     edx, [eax+32040h] // UnkownClass起始地址加偏移量形成一个新地址, 按照间接寻址方式取出值(UnkownClass2对象的地址)送EDX.
seg000:00443EEF                 push    ebx
seg000:00443EF0                 mov     ebx, [ecx]
seg000:00443EF2                 push    esi
seg000:00443EF3                 lea     ecx, [eax+32040h]
seg000:00443EF9                 push    edi
seg000:00443EFA                 call    dword ptr [edx+8]  //EDX+8形成一个地址,按照间接寻址模式取出函数的入口地址,执行调用.

class A14E68
{
   UnkownClass *cls2D4;       //UnkownClass 类型的指针变量
}
class UnkownClass
{
   UnkownClass2 cls32040;  //UnkownClass2 类型的对象作为UnkownClass的成员.
}
class UnkownClass2
{
   virtual void func1();
   virtual void func2();
   virtual void func3(void arg1,void arg2,void arg3);
}

由此可见,类对象作为成员,进行访问对象时,按照间接寻址模式访问目标.
2008-7-10 16:11
0
雪    币: 228
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
谢谢楼上回答,其实重点不在这里,找址方式等是知道的,关键是传递this和取虚表
2008-7-16 10:14
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
typedef struct tagCOM_VTBL
{
        DWORD        pFunc[1];
}COM_VTBL;

typedef struct  tagCOM_OBJ
{
        COM_VTBL*                vptr;
        DWORD                        Var[1];
}COM_OBJ;

虚表和类对象在内存中的样子
2008-7-17 13:02
0
雪    币: 230
活跃值: (149)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
嗯,类的逆向~~ 如果原始程序使用了模板或者某种设计模式(单一模式、类厂等)以及类的继承,那么你如何逆向还原?

或者在发布时,采用不同的编译器处理不同的模块,在分析时又如何进行?

逆向OO的东东,~~~ 呵呵
2008-7-20 19:31
0
雪    币: 1946
活跃值: (248)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
16
强中自有强中手
2008-7-21 03:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习了.................................
2008-7-21 12:56
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
做逆向本来就不应该老是向着逆出来的跟原来的一摸一样,逆向是逆他的逻辑又不是逆他的代码.
2008-7-24 16:17
0
雪    币: 226
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
seg000:00443EE9                 mov     edx, [eax+32040h]

seg000:00443EF3                 lea     ecx, [eax+32040h]

我觉得这个可能不是thiscall ,而是fastcall调用,欢迎大家讨论
2009-5-12 10:09
0
游客
登录 | 注册 方可回帖
返回
//