首页
社区
课程
招聘
[求助]逆向字符串代码
发表于: 2007-11-14 10:21 6946

[求助]逆向字符串代码

2007-11-14 10:21
6946
如下代码:

.text:00439B99                 mov     ecx, [ebp+8]
...
.text:00439B9F                 lea     eax, [ebp+0Ch]   ; [ebp+0ch]是一个字符串地址
.text:00439BA2                 push    eax
.text:00439BA3                 call    sub_4026A0        ; 调用程序见下
.text:00439BA8                 jmp     short loc_439BB2
------------------------------------------------------------------------------------------

.text:004026A0 sub_4026A0      proc near               ; CODE XREF: sub_405030+306p
.text:004026A0
.text:004026A0 arg_0           = dword ptr  4
.text:004026A0
.text:004026A0                 mov     eax, [esp+arg_0]
.text:004026A4                 mov     eax, [eax]
.text:004026A6                 push    esi
.text:004026A7                 sub     eax, 10h                ;字符串地址偏移10个字节 <***
.text:004026AA                 push    eax
.text:004026AB                 mov     esi, ecx
.text:004026AD                 call    sub_402640        ;调用程序见下
.text:004026AD
.text:004026B2                 add     eax, 10h
.text:004026B5                 mov     [esi], eax
.text:004026B7                 add     esp, 4
.text:004026BA                 mov     eax, esi
.text:004026BC                 pop     esi
.text:004026BD                 retn    4
.text:004026BD
.text:004026BD sub_4026A0      endp ; sp =  4

------------------------------------------------------------------------------------------
.text:00402640 sub_402640      proc near               ; CODE XREF: sub_4026A0+Dp
.text:00402640
.text:00402640 arg_0           = dword ptr  8
.text:00402640
.text:00402640                 push    esi
.text:00402641                 mov     esi, [esp+arg_0]                ;上面传来的 : 字符串地址偏移10个字节处的数据
.text:00402645                 mov     ecx, [esi]                ;
.text:00402647                 mov     eax, [ecx]
.text:00402649                 call    dword ptr [eax+10h]        ;调用虚函数
.text:0040264C                 mov     edx, [esi+0Ch]
.text:0040264F                 test    edx, edx
.text:00402651                 lea     ecx, [esi+0Ch]
.text:00402654                 jl      short loc_402667
.text:00402654
.text:00402656                 cmp     eax, [esi]
.text:00402658                 jnz     short loc_402667
.text:00402658
.text:0040265A                 mov     eax, esi
.text:0040265C                 mov     edx, 1
.text:00402661                 lock xadd [ecx], edx
.text:00402665                 pop     esi
.text:00402666                 retn
...

这是一个VC7.0的程序,在操作字符串时,经常先将其地址偏移10h个字节,然后作为参数再调用一个虚函数,不知在源码中这是一个什么样类型的字符串数据?

字符串地址偏移10h字节处是一个什么数据?从代码上看,好像是一个类对象的地址的地址,双指针?

请高手指点指点...谢谢!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 1746
活跃值: (287)
能力值: (RANK:450 )
在线值:
发帖
回帖
粉丝
2
哎,又获得了一次使用asm2c的机会

没看明白楼主咋会把[ebp+0Ch]当前字符串的

.text:00402641                 mov     esi, [esp+arg_0]
.text:00402645                 mov     ecx, [esi]    ;
.text:00402647                 mov     eax, [ecx]
.text:00402649                 call    dword ptr [eax+10h]  ;调用虚函数
从上面四行看,很明显是在调用虚函数,因此esp+arg_0这个地方放的就是类对象的指针,这个地方会给人错觉,觉得作者调用这个函数时,传的是指针的指针,其实不是

.text:00439B9F                 lea     eax, [ebp+0Ch], 看这行代码就知道是编译器在捣鬼,这里编译器自己引入了一层指针,因此作者编程时用的是类对象的指针

.text:00402641                 mov     esi, [esp+arg_0] 这个参数是下面代码传过来的

.text:004026A7                 sub     eax, 10h
.text:004026AA                 push    eax   /********就是这里传的对象指针*/

很明显这里就是多重继承了,否则不可能把对象指针移动后 还指向一个对象

因此 根本就不是楼主所说的字符串指针,而是一个比较复杂类对象的指针

由于楼主给出的代码有限(有少量代码我也不想去理解了),加上C++编译器编译时信息的丢失,这里大致给出这段代码的原始框架

class class_base_a
{
public:
        class_base_a() {};
        virtual ~class_base_a(){};

        virtual void a_fun(){};
        virtual void b_fun(){};
        virtual void c_fun(){};
        virtual void d_fun(){};

        int a_para;
        int b_para;
        int c_para;
};

class class_base_b
{
public:
        class_base_b(){};
        virtual ~class_base_b(){}

        int d_para;
};

class class_derive : public class_base_a, public class_base_b
{
public:
        class_derive(){}

        int e_para;
};

class class_calling
{
public:
        void sub_4026A0(class_base_b * pDerive)
        {
                sub_402640((class_base_a *)(class_derive *)pDerive);
        }
        void sub_402640(class_base_a * pBase)
        {
                pBase->d_fun();
        };
};

void fun(class_calling *pCalling, class_base_b * pDerive)
{
        pCalling->sub_4026A0(pDerive);
}

int main()
{
        class_derive *pDerive = new class_derive();

        class_calling aCalling;

        fun(&aCalling, pDerive);

        delete pDerive;

        return 0;
}
2007-11-14 22:35
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
哇。。。。。。
2007-11-14 22:45
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=linxer;381355]哎,又获得了一次使用asm2c的机会

没看明白楼主咋会把[ebp+0Ch]当前字符串的

.text:00402641                 mov     esi, [esp+arg_0]
.text:00402645                 mov     ecx,...[/QUOTE]

顶一个。唉,不知何时才能达到linxer水平,看汇编代码像C源程序一样。
我一直也找不出类,对象指针什么的。
发两个菜鸟教程吧。
2007-11-14 22:53
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
5
首先,非常感谢linxer老大的指点

.text:00439B9F                 lea     eax, [ebp+0Ch]   

这里: ebp+0ch 的确是一个字符串地址,这通过OD动态跟踪程序可以看出来。

.text:00439BA2                 push    eax
.text:00439BA3                 call    sub_4026A0         

call    sub_4026A0 很明显就是要对这个字符串进行相关操作,但跟进去后就发现是对字符串地址往上偏移10h个字节进行相关操作。

用OD跟踪,看不出什么明堂,call sub_4026A0执行完毕后,字符串也没有变化。由于这个程序中有很多处代码都是类似的代码。所以,我怀疑这是一个类似于VC的CString类型的数据,CString字符串前面不是绑定了3个DWORD数据吗?

这里字符串前面是不是绑定了4个DWORD数据?sub_4026A0和sub_402640会不会是VC的内联函数代码?

注:这个程序用PEID侦测是用VC 7.0编写的,VC7.0是不是引入了新的字符串数据类型,或者VC 6.0中有某种字符串数据类型,我还不知道?
2007-11-14 23:59
0
雪    币: 29366
活跃值: (7910)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
6
asm2c。。
无语。。。
无比强大。。
2007-11-15 00:19
0
雪    币: 1746
活跃值: (287)
能力值: (RANK:450 )
在线值:
发帖
回帖
粉丝
7
那就是我看差了,看跟多重继承很象

当时看到这行代码  我也比较纳闷
.text:00439B9F                 lea     eax, [ebp+0Ch]  怎么有这种代码

I am sorry!
2007-11-15 00:25
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=linxer;381390]那就是我看差了,看跟多重继承很象

当时看到这行代码  我也比较纳闷
.text:00439B9F                 lea     eax, [ebp+0Ch]  怎么有这种代码

I am sorry![/QUOTE]

sorry, 我在5楼描述有误,让linxer老大误解了。

应该说是 [ebp+0ch] 是一个字符串地址


lea     eax, [ebp+0Ch]
push    eax
call    sub_4026A0   
则类似于这种类型函数调用:void fun1(CString &str1)

我基本上已经分析出这个数据类型,内存结构如下:

---------------------------------------------------------------------
| 虚函数表地址 |   长度1  |  长度2    |    计数      | 字符串缓冲区 |
|   (DWORD)    |  (DWORD) |  (DWORD)  |   (DWORD)    |    char[]    |
---------------------------------------------------------------------
很像CString数据类型,但CString没有虚函数表,而且计数值放在两个长度数据前面。

这个类感觉好奇怪,在调用其虚函数时,是从字符串地址往回推10h 个字节,然后得到虚函数表地址。

而不是像一般类那样,直接根据[ECX]就可以得到其虚函数表的地址。也许,这不是一个类???

00439B9F  |.  8D45 0C       LEA EAX,DWORD PTR SS:[EBP+C]
00439BA2  |.  50            PUSH EAX
00439BA3  |.  E8 F88AFCFF   CALL XELoader.004026A0

当执行到 00439BA2 时,当前寄存器值为:

ESP=0012D1D8  EBP=0012E200  ECX=0012E22C  EAX=0012E20C

内存数据如下:
00A66EA8  00 4E 45 00 39 00 00 00 - 3A 00 00 00 01 00 00 00  .NE.9...:......
00A66EB8  45 3A 5C 48 41 52 54 20 - 53 6F 66 74 20 52 65 6C  E:\HART Soft Rel
00A66EC8  65 61 73 65 5C 52 65 6C - 65 61 73 65 5C 4D 43 55  ease\Release\MCU
00A66ED8  5C 31 31 35 31 5F 56 34 - 39 58 5C 68 74 33 6B 5F  \1151_V49X\ht3k_
00A66EE8  56 34 2E 39 35 2E 61 78 - 65 00 EE AB AB AB AB AB  V4.95.axe.瞰
00A66EF8  AB AB AB FE EE FE EE FE - 00 00 00 00 00 00 00 00  铪铪........

而 [EAX]=[0012E20C]=00A66EB8, 正是上面字符串"E:\HART Soft..." 地址,而00A66EA8处就是虚函数表地址

不知是VC中已存在了这种类型的数据结构,还是作者自已从CStringData结构派生出来的一个字符串类?
2007-11-15 09:34
0
雪    币: 226
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
人肉asm2c
2007-11-15 13:01
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
10
据说那个插件要联网,怀疑linxer跟ida的关系
2007-11-15 14:33
0
游客
登录 | 注册 方可回帖
返回
//