首页
论坛
课程
招聘
[原创]C++逆向学习笔记 一
2009-3-21 22:53 8056

[原创]C++逆向学习笔记 一

2009-3-21 22:53
8056
前话:
为了早日走进逆向工程的大门, 为了某日能达到牛人们一样看反汇编像看源码一样
的境界(这个当然难就哦, ~) , 最近在学习C++的逆向.  以后我会定期上传自己的学
习笔记不断激励自己,希望可以在一个较短的时间内完成.
环境说明: 平台:VC6 SP6 ,一般都是分析Release版本的程序,这样跟接近真实情况.
(除非特殊说明~~)
在我的分析中, 可能难免会出现错误, 或者理解上的失误, 希望各位看官可以即时的
帮我指正, 那样将不胜感激 ~~

        C++逆向笔记一 之 数据类型.

来CPP源码:

#include <stdio.h>
#pragma pack(1)
struct F
{
        char a;
        int  b;
        void fuck();
};
#pragma pack()
struct B
{
        int a;
        int b;
        int c;
        void  add(int,int);
        void f(int);
};

void B::add(int a,int b)
{
        c = a + b ;
}
void B::f(int x)
{
        a += x;
}

void F::fuck()
{
        this->a = 'J' ;
        this->b++;
}

enum EE
{
        red  =3,
        blue ,
        green,
        yellow,
};

int main(int argc, char* argv[])
{

        B sb; F sf; EE ee;
        sb.a = 3;sb.b = 4;sb.c = 5;
        sf.a = 'X' ; sf.b = 0x9999;
        sf.b = green;                               

        __asm int 3                        //跟failwest学的, 呵呵, 感觉不错.
        printf("%d   ",sizeof(sb));
        printf("%d   ",sizeof(sf));
        printf("%d   ",sizeof(ee));
        sb.add(sb.a,sb.b);
        sb.f(4);
        sf.fuck();

        return 0;
}

结构体B ,F 两种抽象数据类型, 默认的话, 其结构体大小为数据成员个数乘以4 .
(如果定义了对齐粒度的话就另当别论).函数不会算到大小里面去(后面的虚函数
除外), 对于一般的结构体, 都是当成一个内存块来处理的. 对于B, F这种抽象数据
类型, 一般都是将ecx保存其指针(以后到了类就是this了).

下面看反汇编调试过程吧.
00401030    55              push ebp
00401031    8BEC            mov ebp,esp
00401033    83EC 14         sub esp,14
00401036    C745 EC 0300000>mov dword ptr ss:[ebp-14],3              ; 从这5行可以看出,在栈里面是按局部变量从小到大排的
0040103D    C745 F0 0400000>mov dword ptr ss:[ebp-10],4
00401044    C745 F4 0500000>mov dword ptr ss:[ebp-C],5
0040104B    C645 F8 58      mov byte ptr ss:[ebp-8],58               ; 这里从8开始一个char
0040104F    C745 F9 9999000>mov dword ptr ss:[ebp-7],9999            ; 从7 开始, 保持和上面的紧挨着.
00401056    90              nop
00401057    6A 0C           push 0C                                  ; 默认自然对齐为4字节, 总共12字节
00401059    68 30704000     push lesson1.00407030                    ; ASCII "%d   "
0040105E    E8 3D000000     call lesson1.004010A0                    ; 这里是printf, 不知为啥不自己显示出来
00401063    6A 05           push 5                                   ; 这里重设了对齐粒度,于是为5
00401065    68 30704000     push lesson1.00407030                    ; ASCII "%d   "
0040106A    E8 31000000     call lesson1.004010A0                    ; printf
0040106F    8B45 F0         mov eax,dword ptr ss:[ebp-10]            ; sb.b
00401072    8B4D EC         mov ecx,dword ptr ss:[ebp-14]            ; sb.a
00401075    83C4 10         add esp,10                               ; 两次的放一起平衡esp.
00401078    50              push eax
00401079    51              push ecx
0040107A    8D4D EC         lea ecx,dword ptr ss:[ebp-14]            ; sb的地址.  相当于寄存器传参.
0040107D    E8 7EFFFFFF     call lesson1.00401000                    ; sb.add(sb.a,sb.b);
00401082    6A 04           push 4
00401084    8D4D EC         lea ecx,dword ptr ss:[ebp-14]            ; sb的地址.
00401087    E8 84FFFFFF     call lesson1.00401010                    ; sb.f(4);
0040108C    8D4D F8         lea ecx,dword ptr ss:[ebp-8]             ; sf的地址
0040108F    E8 8CFFFFFF     call lesson1.00401020                    ; sf.fuck
00401094    33C0            xor eax,eax
00401096    8BE5            mov esp,ebp
00401098    5D              pop ebp
00401099    C3              retn

//
00401000    8B4424 08       mov eax,dword ptr ss:[esp+8]             ; 这里没压ebp, 所以为参数2 : sb.b
00401004    8B5424 04       mov edx,dword ptr ss:[esp+4]             ; 参数一: sb.a
00401008    03D0            add edx,eax
0040100A    8951 08         mov dword ptr ds:[ecx+8],edx             ; 这里ecx就定位了那个sb结构体了.
0040100D    C2 0800         retn 8

枚举类型就很简单了, 跟BOOL一样了, sizeof就是4了, 然后使用中就直接被编译器换成了
数值了,比如 EE ee = red;  直接就是mov dword ptr [ebp – index * 4] , 3 ; 联合体在C++也
用的不多了, 也简单,就不分析了.

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

收藏
点赞0
打赏
分享
最新回复 (13)
雪    币: 6004
活跃值: 活跃值 (1107)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
option 活跃值 2009-3-22 09:43
2
0
能分析一下带模板的简单程序吗?
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
王宇亮 活跃值 2009-3-22 11:32
3
0
逆向学习方法值得借鉴。 C++我好久没用了,温故一下。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mlshxh 活跃值 2009-3-22 12:16
4
0
学习了,学习
雪    币: 1225
活跃值: 活跃值 (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
jackozoo 活跃值 14 2009-3-22 12:24
5
0
现在还没到哪一章,慢慢来.
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lukewang 活跃值 2009-3-28 19:56
6
0
高!向你学习!
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
amsoking 活跃值 2009-3-28 20:42
7
0
我现在也在着手学习 逆向  可不可以交个朋友 我的 QQ 6054769
雪    币: 447
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
士心 活跃值 2009-3-28 21:47
8
0
支持LZ的原创,可以让大家多多学习和交流
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
白轩 活跃值 2009-3-28 23:20
9
0
学了
大家努力
雪    币: 590
活跃值: 活跃值 (23)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wzjok 活跃值 1 2009-3-29 00:06
10
0
楼主,你好,我反汇编后的代码怎么与你的不同啊?
1、比你的多了一个call调用
2、少一个语句(我猜是被VC优化后去掉了):sf.b = 0x9999;

操作系统: Windows XP SP3
编译软件: VC 6.0 SP6
编译目标: Win32 Release
反编软件: OllyDGB 1.10, cao_cong 汉化版

我的代码是这样的:

00401030  /$  55            push    ebp
00401031  |.  8BEC          mov     ebp, esp
00401033  |.  83EC 14       sub     esp, 14
00401036  |.  C745 EC 03000>mov     dword ptr [ebp-14], 3
0040103D  |.  C745 F0 04000>mov     dword ptr [ebp-10], 4
00401044  |.  C745 F4 05000>mov     dword ptr [ebp-C], 5
0040104B  |.  C645 F8 58    mov     byte ptr [ebp-8], 58
0040104F  |.  C745 F9 05000>mov     dword ptr [ebp-7], 5           ;  经过优化后,省略了sf.b = 0x9999; 语句
00401056  |.  CC            int3
00401057  |.  6A 0C         push    0C
00401059  |.  68 30704000   push    00407030                       ;  ASCII "%d   "
0040105E  |.  E8 4D000000   call    004010B0
00401063  |.  6A 05         push    5
00401065  |.  68 30704000   push    00407030                       ;  ASCII "%d   "
0040106A  |.  E8 41000000   call    004010B0
0040106F  |.  6A 04         push    4
00401071  |.  68 30704000   push    00407030                       ;  ASCII "%d   "
00401076  |.  E8 35000000   call    004010B0
0040107B  |.  8B45 F0       mov     eax, dword ptr [ebp-10]
0040107E  |.  8B4D EC       mov     ecx, dword ptr [ebp-14]
00401081  |.  83C4 18       add     esp, 18
00401084  |.  50            push    eax
00401085  |.  51            push    ecx
00401086  |.  8D4D EC       lea     ecx, dword ptr [ebp-14]
00401089  |.  E8 72FFFFFF   call    00401000
0040108E  |.  6A 04         push    4
00401090  |.  8D4D EC       lea     ecx, dword ptr [ebp-14]
00401093  |.  E8 78FFFFFF   call    00401010
00401098  |.  8D4D F8       lea     ecx, dword ptr [ebp-8]
0040109B  |.  E8 80FFFFFF   call    00401020
004010A0  |.  33C0          xor     eax, eax
004010A2  |.  8BE5          mov     esp, ebp
004010A4  |.  5D            pop     ebp
004010A5  \.  C3            retn

00401000  /$  8B4424 08     mov     eax, dword ptr [esp+8]
00401004  |.  8B5424 04     mov     edx, dword ptr [esp+4]
00401008  |.  03D0          add     edx, eax
0040100A  |.  8951 08       mov     dword ptr [ecx+8], edx
0040100D  \.  C2 0800       retn    8

00401010  /$  8B4424 04     mov     eax, dword ptr [esp+4]
00401014  |.  8B11          mov     edx, dword ptr [ecx]
00401016  |.  03D0          add     edx, eax
00401018  |.  8911          mov     dword ptr [ecx], edx
0040101A  \.  C2 0400       retn    4

0040101D      90            nop
0040101E      90            nop
0040101F      90            nop

00401020  /$  8B41 01       mov     eax, dword ptr [ecx+1]
00401023  |.  C601 4A       mov     byte ptr [ecx], 4A
00401026  |.  40            inc     eax
00401027  |.  8941 01       mov     dword ptr [ecx+1], eax
0040102A  \.  C3            retn
雪    币: 311
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
renwoxiao 活跃值 1 2009-9-7 19:36
11
0
问一下,有没有怎么逆向方面的书籍,给我们这些菜鸟推荐一下
雪    币: 100
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ー絆綪秂 活跃值 2009-9-13 23:36
12
0
这样的看起来好
雪    币: 211
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
编程小猪 活跃值 2009-9-21 12:21
13
0
哎,本人菜鸟。

请问下面这个结构体的大小怎么算

struct _tag
{
        char    c;
        short   s;
        long     l;
};
雪    币: 8
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zuccbug 活跃值 2009-9-22 20:54
14
0
在对齐的情况下应为 8 , sizeof(char) == 1, sizeof(short) ==2 ,size(long) =4, 1 + 2 <= 4 ,所以 char 和 short 合起来,总共分配 4,再加上long 的 4 ,结果为 8
游客
登录 | 注册 方可回帖
返回