能力值:
( LV6,RANK:90 )
|
-
-
2 楼
你错的,我对的
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
学习了............................................
|
能力值:
( LV8,RANK:130 )
|
-
-
4 楼
老大,说说原因啊,我一直想不明白
|
能力值:
( 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个虚函数
|
能力值:
( LV8,RANK:130 )
|
-
-
6 楼
开始我没想明白,重要是先入为主的将seg000:00443EE9 mov edx, [eax+32040h]这句以为是取变量的值,而没注意后面的调用,原来该句是取虚函数表,老大要看到请确认下
|
能力值:
(RANK:450 )
|
-
-
7 楼
13 重出江湖了
|
能力值:
( 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个虚函数
|
能力值:
( LV6,RANK:90 )
|
-
-
9 楼
向『虚拟机技术』组长学习
|
能力值:
( LV12,RANK:250 )
|
-
-
10 楼
a! 13回来了。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
怎么这么熟,哪儿见过
|
能力值:
( 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);
}
由此可见,类对象作为成员,进行访问对象时,按照间接寻址模式访问目标.
|
能力值:
( LV8,RANK:130 )
|
-
-
13 楼
谢谢楼上回答,其实重点不在这里,找址方式等是知道的,关键是传递this和取虚表
|
能力值:
( 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;
虚表和类对象在内存中的样子
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
嗯,类的逆向~~ 如果原始程序使用了模板或者某种设计模式(单一模式、类厂等)以及类的继承,那么你如何逆向还原?
或者在发布时,采用不同的编译器处理不同的模块,在分析时又如何进行?
逆向OO的东东,~~~ 呵呵
|
能力值:
(RANK:330 )
|
-
-
16 楼
强中自有强中手
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
学习了.................................
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
做逆向本来就不应该老是向着逆出来的跟原来的一摸一样,逆向是逆他的逻辑又不是逆他的代码.
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
seg000:00443EE9 mov edx, [eax+32040h]
seg000:00443EF3 lea ecx, [eax+32040h]
我觉得这个可能不是thiscall ,而是fastcall调用,欢迎大家讨论
|
|
|