首页
社区
课程
招聘
一个反编译的东东 好玩 玩的过程记录了下
2007-12-3 21:01 8033

一个反编译的东东 好玩 玩的过程记录了下

2007-12-3 21:01
8033
在网上找点项目做做的,未遂,看到一个反编译软件,瞒好玩的,所以测试下,有点效果

文中的工具在 http://www.backerstreet.com/rec/recdload.htm可以下载

一:写了个冒泡排序 = =   见程序1
       WIN32 VC7.0 release方式 编译

二:用工具反编译了下 程序见 程序2  图片见本文末尾

三:刚开始竟然没有看懂 一看就是错的程序吗 但是还是移值到VC++7.0一下   看来多重循环效果查了点,反编译其他的程序,效果还可以,参数什么的都能填出来

四:移植后编译了下,竟然运行正确在release下是正确的 在DEBUG模式下是正确的 具体原因么,自己OD下。

程序1:
int _tmain(int argc, _TCHAR* argv[])
{
        int a[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};

        int temp;

        int i, j;

        for(i = 0; i < 10; i++)
        {
                for(j = i+1; j < 10; j ++)
                {
                        if(a[i] > a[j])
                        {
                                temp = a[i];
                                a[i] = a[j];
                                a[j] = temp;
                        }
                }

        }

        for(i = 0; i < 10; i++)
                printf("%d ", a[i]);
}

程序 2
用工具反编译了下 结果是  

L00401000()
{
        /* unknown */ void  Vc;
        /* unknown */ void  ebx;
        /* unknown */ void  V10;
        /* unknown */ void  esi;
        /* unknown */ void  edi;
        /* unknown */ void  V14;
        /* unknown */ void  V18;
        /* unknown */ void  V1c;
        /* unknown */ void  V20;
        /* unknown */ void  V24;
        /* unknown */ void  V28;
        /* unknown */ void  V2c;
        /* unknown */ void  V30;

    edi = 1;
    Vc = 9;
    V10 = 8;
    V14 = 7;
    V18 = 6;
    V1c = 5;
    V20 = 4;
    V24 = 3;
    V28 = 2;
    V2c = 1;
    V30 = 0;
    edx = & Vc;
    ebx = 0xa;
    do {
        esi = edi;
        if(edi < 0xa) {
            do {
                eax = *(esp + esi * 4 + 0xc);
                ecx = *edx;
                if(ecx > eax) {
                    *edx = eax;
                    *(esp + esi * 4 + 0xc) = ecx;
                }
                esi = esi + 1;
            } while(esi < 0xa);
        }
        edi = edi + 1;
        edx = edx + 4;
    } while(ebx = ebx - 1);
    esi = 0;
    do {
        L004010A7(0x4060fc, *(esp + esi * 4 + 0xc));
        esi = esi + 1;
    } while(esi < 0xa);
    return 0;
}

程序 3
int _tmain(int argc, _TCHAR* argv[])
{
        /* unknown */ int  Vc;
        /* unknown */ int  ebx;
        /* unknown */ int  V10;
        /* unknown */ int  esi;
        /* unknown */ int  edi;
        /* unknown */ int  V14;
        /* unknown */ int  V18;
        /* unknown */ int  V1c;
        /* unknown */ int  V20;
        /* unknown */ int  V24;
        /* unknown */ int  V28;
        /* unknown */ int  V2c;
        /* unknown */ int  V30;
        int eax, ecx;   //把寄存器改成变量 - -
        int *edx;
        int a[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};  // 之所以加这个是因为*(esp + esi * 4 + 0xc);  //这里的 ESP基于堆栈, 要把ESP换成a 数组的首地址。

        int *esp;   
        esp = a;      
    edi = 1;
    Vc = 9;
    V10 = 8;
    V14 = 7;
    V18 = 6;
    V1c = 5;
    V20 = 4;
    V24 = 3;
    V28 = 2;
    V2c = 1;
    V30 = 0;     // 这些东西其实是 ESP+XX的东西 这里用 a[10]代替了 IDA也会分析出来这个 后面有的地方用到这些变量 所以 a[10]不能完全代替 = =
    edx = & Vc;   
    ebx = 0xa;
    do {
        esi = edi;
        if(edi < 0xa) {
            do {
                eax = *(esp + esi * 4 + 0xc);
                ecx = *edx;
                if(ecx > eax) {
                    *edx = eax;
                    *(esp + esi * 4 + 0xc) = ecx;
                }
                esi = esi + 1;
            } while(esi < 0xa);
        }
        edi = edi + 1;
        edx = edx + 4;
    } while(ebx = ebx - 1);  // 这句比较郁闷, 刚开始一看,怎么结束条件是这个,以为肯定错了,幸亏还是移植了下
/*   esi = 0;
    do {
        L004010A7(0x4060fc, *(esp + esi * 4 + 0xc)); // 这个是pintf函数  反编译的效果还是很好的 怕改了  知道就好 下面自己实现
        esi = esi + 1;
    } while(esi < 0xa);*/

    for(int i = 0; i < 10; i++)
           printf("%d ", a[i]);

        return 0;
}
反编译的效果

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

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (8)
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
shoooo 16 2007-12-3 21:36
2
0
貌似不不错
反了几个,感觉反出的C不太纯,摆脱不了寄存器的直接操作
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
Isaiah 10 2007-12-3 23:04
3
0
OOP是最大的敌人.
雪    币: 153
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cumtjh 2008-3-9 03:44
4
0
不错哦学习中
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
华佗 2008-3-9 05:44
5
0
呵呵,同样学习中
雪    币: 100
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hackstone 2008-3-14 23:21
6
0
不错学习学习
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pcwolf 2008-3-17 09:00
7
0
感觉还不错,还知道用到其他地方可否!
雪    币: 274
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
KuGong 2008-3-17 11:00
8
0
好像对大一点的文件分析就不中了。。。。
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ttskying 2008-3-19 16:31
9
0
有意思太有意思了
游客
登录 | 注册 方可回帖
返回