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

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

2008-6-30 16:48
9032
如下
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]是使用了[]寻址,大家觉得呢?

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞7
打赏
分享
最新回复 (18)
雪    币: 226
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
十三少 2 2008-7-1 00:59
2
0
你错的,我对的
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ftrue 2008-7-1 05:37
3
0
学习了............................................
雪    币: 228
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
rageliu 3 2008-7-1 09:29
4
0
老大,说说原因啊,我一直想不明白
雪    币: 228
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
rageliu 3 2008-7-1 09:47
5
0
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个虚函数
雪    币: 228
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
rageliu 3 2008-7-1 09:49
6
0
开始我没想明白,重要是先入为主的将seg000:00443EE9                 mov     edx, [eax+32040h]这句以为是取变量的值,而没注意后面的调用,原来该句是取虚函数表,老大要看到请确认下
雪    币: 1746
活跃值: (292)
能力值: (RANK:450 )
在线值:
发帖
回帖
粉丝
linxer 11 2008-7-1 10:50
7
0
13 重出江湖了
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
thinkSJ 4 2008-7-1 12:53
8
0
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个虚函数
雪    币: 226
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
十三少 2 2008-7-1 19:49
9
0
向『虚拟机技术』组长学习
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
wangdell 6 2008-7-1 21:21
10
0
a! 13回来了。
雪    币: 226
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
njmdk 2008-7-9 13:29
11
0
怎么这么熟,哪儿见过
雪    币: 475
活跃值: (1130)
能力值: ( LV9,RANK:1410 )
在线值:
发帖
回帖
粉丝
qduwg 35 2008-7-10 16:11
12
0
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);
}

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

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

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

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

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

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

我觉得这个可能不是thiscall ,而是fastcall调用,欢迎大家讨论
游客
登录 | 注册 方可回帖
返回