首页
社区
课程
招聘
[原创]一个基于x86的C/C++语言反编译c-decompiler
发表于: 2009-10-2 04:42 135552

[原创]一个基于x86的C/C++语言反编译c-decompiler

2009-10-2 04:42
135552
收藏
免费 7
支持
分享
最新回复 (220)
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
126
root60931讲得有道理,这种情况确实有可能存在。出现这种情况,我上面说的简单办法就失效了

这样检测函数参数个数的方法得改进改进了。
深入到函数内部去,看其对参数的引用情况,再结合外面的Push情况,综合考虑。
但遇到某些变态函数,有参数,但在函数内部就是不使用这些参数。情况又不确定了。。。。。

各位有啥好主意呢?
2009-10-29 11:48
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
127
[QUOTE='day[WG];705258']熬夜一年多?

为楼主捏了一把汗!

还有,楼主的目标真的很强大.[/QUOTE]

没办法,白天上班,只能晚上敲敲代码了。
2009-10-29 11:49
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
128
牛人!!好崇拜啊
2009-10-29 13:03
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
129
基本上没有万金油啊
2009-10-29 14:34
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
130
您指的是确定函数参数个数问题?
root60931提到的情况应该在实际编译器中不会出现吧?????
不确定,目前还没碰到过这种情况。
2009-10-29 15:11
0
雪    币: 234
活跃值: (25)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
131
貌似在两个代码框下就无法再按反编译键,想打开第二个文件还要回到函数列表框里。
鉴于是演示版自然不能要求太高。主要功能实现的不错,再接再厉。
个人期待能开发相应的OD插件,对局部函数代码进行解析。这样意义会更大一些。
毕竟,目前很少会有人想完全逆向一个很复杂的程序,也往往没这个必要。关键代码的解析更实用。
2009-10-29 17:04
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
132
2009-10-29 17:40
0
雪    币: 234
活跃值: (25)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
133
奇怪,我随便用VC6.0编译一段代码,用这个工具就蹦了
代码如下:

#include <stdio.h>

int main()
{
        return 0;
}

编译后的PE文件:

test.rar

测试平台 vista.

烦请楼主解释一下原因,谢谢!
上传的附件:
2009-10-29 18:21
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
134
我用xp平台运行了c-decompier反编译你给出的例子,是没问题的。
c-decompuler是从我的网站上下载的:http://www.c-decompiler.com/C-Decompiler.rar
不知你用的是从哪里下载的。
难道你是在vista环境下运行该反编译器的?
我到是从没在vista运行过,不知道在vista下能正确反编译给出的例子否?
能正确反编译的话,估计反编译你这个例子应该没问题的。

感谢你的测试,下次我得到vista平台运行试试看。
2009-10-29 20:38
0
雪    币: 66
活跃值: (960)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
135
我测试了一下,不支行DLL
2009-10-30 12:37
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
136
To kawar 大大:
    我有一帖【原创】流密码内嵌魔方阵于随机存档之研究-- Magic Square 之神奇篇 ,裡面有 source code C,如果方便的話,請將它 compile 成 exe file,再用 C-decompiler 把 exe 變回 C code,接著再用還原的 C code 去 compile 一次看看,會是正常還是不正常。

或是在 【原创】流密碼內嵌魔方陣於隨機存檔之研究--Utility 裡有一個stream-cipher.rar,把這個 exe 用D-compiler 試一試。
謝謝。
2009-10-30 13:36
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
137
To Rock大牛,
当前版本的c-decompiler运行您这个exe, 挂了

等以后版本稳定了,再帮您试试。
2009-10-30 14:20
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
138
TO dnybz,
确实不支持dll
2009-10-30 14:23
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
139
Ps. 我不是大牛. >.<
那那個 C code 呢?
Compiling C code ----> exe ----> Decompiling exe -----> C code.
我指的是在 http://bbs.pediy.com/showthread.php?t=89799 的那個 source code.
可行嗎?
謝謝。
2009-10-30 14:33
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
140
修掉rock源代码中的编译小错误,编译后生成exe试了一下。
整体流程还在,两个malloc函数给丢失了。。。。
下面是反出来的代码

// Proc: _tmain
int _tmain(int argc, _TCHAR argv)
{
    int loc1;
    int loc2;
    int loc3;
    int loc4;
    int loc5;
    int loc6;
    int loc7; /* esp */
    int loc8; /* eax */
    int loc9; /* ecx */
    int loc10; /* edx */
    int loc11; /* Dmy */
    int loc12; /* ebp */

    loc1 = 2;

    while ((loc1 > 19)) {
        printf ();
        loc7 = (loc7 + 4);
        loc8 = &loc1;
        scanf ();
        loc7 = (loc7 + 8);
    }        /* end of while */
    loc8 = loc1;
    loc8 = (loc8 & 0x80000001);
    if         loc8--;
        loc8 = (loc8 | 0xFFFFFFFE);
        loc8++;
    }
        goto L1;
    }
    else {
        loc8 = loc1;
        loc8 = (loc8 << 2);
        malloc ();
        loc7 = (loc7 + 4);
        loc2 = loc8;
        loc8 = loc1;
        loc8 = (loc8 << 2);
        malloc ();
        loc7 = (loc7 + 4);
        loc9 = loc2;
         = loc8;
        loc8 = loc2;
        printf ();
        loc7 = (loc7 + 8);
        loc3 = 0;
        loc8 = loc1;
        loc8 = (loc8 - 1);
        loc8 = loc8;
        loc8 = (loc8 - loc10);
        loc8 = (loc8 >> 1);
        loc4 = loc8;
        loc5 = 0;

        while ((loc8 < loc1)) {
            loc8 = loc5;
            loc6 = 0;

            while ((loc8 < loc1)) {
                loc8 = loc6;
                loc8 = loc5;
                loc9 = loc2;
                loc10 = ;
                loc8 = loc6;
                 = 0;
                loc8 = loc6;
                loc8 = (loc8 + 1);
                loc6 = loc8;
            }        /* end of while */
            loc8 = loc5;
            loc8 = (loc8 + 1);
            loc5 = loc8;
        }        /* end of while */
        loc8 = loc3;
        loc9 = loc2;
        loc10 = ;
        loc8 = loc4;
         = 1;
        loc5 = 2;

        while ((loc5 <= loc8)) {
            loc8 = loc1;
            loc8 = (loc8 * loc1);
            loc8 = loc1;
            loc9 = loc3;
            loc11 = loc9;
            loc11 = (loc11 + loc8);
            loc11 = (loc11 + 0xFFFFFFFF);
            loc8 = loc11;
            loc11 = loc8;
            loc8 = (loc11 / loc1);
            loc10 = (loc11 % loc1);
            loc3 = loc10;
            loc8 = loc4;
            loc8 = (loc8 + 1);
            loc11 = loc8;
            loc8 = (loc11 / loc1);
            loc10 = (loc11 % loc1);
            loc4 = loc10;
            loc8 = loc2;
            loc9 = ;
            loc10 = loc3;
            loc8 = ;
            loc8 = (loc8 + loc4);
            if                 loc8 = loc3;
                loc8 = (loc8 + 2);
                loc11 = loc8;
                loc8 = (loc11 / loc1);
                loc10 = (loc11 % loc1);
                loc3 = loc10;
                loc8 = loc1;
                loc9 = loc4;
                loc11 = loc9;
                loc11 = (loc11 + loc8);
                loc11 = (loc11 + 0xFFFFFFFF);
                loc8 = loc11;
                loc11 = loc8;
                loc8 = (loc11 / loc1);
                loc10 = (loc11 % loc1);
                loc4 = loc10;
            }
            loc8 = loc3;
            loc9 = loc2;
            loc10 = ;
            loc8 = loc4;
            loc9 = loc5;
             = loc9;
            loc8 = loc5;
            loc8 = (loc8 + 1);
            loc5 = loc8;
        }        /* end of while */
        loc8 = loc1;
        printf ();
        loc7 = (loc7 + 8);
        loc5 = 0;
        loc8 = loc5;
        if (loc8 < loc1) {
            loc6 = 0;

            while ((loc8 < loc1)) {
                loc8 = loc6;
                loc8 = loc2;
                loc9 = ;
                loc10 = loc5;
                loc11 = loc10;
                loc11 = (loc11 * 4);
                loc11 = (loc11 + loc9);
                loc8 = loc11;
                loc9 = loc6;
                loc10 = ;
                printf ();
                loc7 = (loc7 + 8);
                loc8 = loc6;
                loc8 = (loc8 + 1);
                loc6 = loc8;
            }        /* end of while */
            printf ();
            loc7 = (loc7 + 4);
            loc8 = loc5;
            loc8 = (loc8 + 1);
            loc5 = loc8;
        }
        else {
            printf ();
            loc7 = (loc7 + 4);
            loc8 = 0;
            loc9 = loc12;
            loc10 = 0x411D4F;
            loc7 = (loc7 + 264);
            return (loc8);
        }
    }
}
2009-10-30 15:06
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
141
演示版本距离实战还差十万八千里啊
2009-10-30 15:08
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
142
好的開始是成功的一半。
2009-10-30 15:39
0
雪    币: 234
活跃值: (25)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
143
我是在vista下测试的。你给的例子能够反编译。但自己编写的这个例子就不行了。
我就是下载你顶楼提供的那个连接。我又下了一遍,测试结果一样。
出错的地方我截图给你看吧。



上图是运行出错后弹出调试界面的截图。
楼主不妨考虑一下原因,加油吧
上传的附件:
2009-11-1 07:45
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
144
[QUOTE=kaien;706260]我是在vista下测试的。你给的例子能够反编译。但自己编写的这个例子就不行了。
我就是下载你顶楼提供的那个连接。我又下了一遍,测试结果一样。
出错的地方我截图给你看吧。



上图是运行出错后弹出调试界面的截图。
楼主不妨考虑一下原因,加油吧[/QUOTE]

感谢kaien的热心。我这边没有vista平台。但我大概猜到是甚么原因了。
应该是在检测识别Main函数的地方出错了。
VC6,VC2003,VC2005,VC2008 的main函数识别都是在xp平台下进行的。vista平台的main'函数识别可能与XP不一样。
win2000,win2003,vista,win7等等的main函数识别以后再一起加进去了。
2009-11-1 15:11
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
145
2009-11-2 21:15
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
146
非常感谢doking提供该论文。很简短的一篇博士论文(103页)。
连夜拜读,其对应的开源工具在此:http://idc.sourceforge.net/wiki/

自动反编译和交互式反编译相结合是比较好的解决方法。
完全自动反编译理论上是做不到的,某些情况下借助人工交互能起到很好的效果。

大家发现甚么其他资料,一起分享,众人拾柴火焰高!

再次感谢doking
2009-11-3 01:51
0
雪    币: 236
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
147
以前用IDA+手工做过几个大的项目的逆向,感觉要反编译STL难度极大。
像vector, set, map, list 等容器类, 对象直接嵌入其中,所以不同的对象
就会产生不同的代码,而且不同的编译器版本,优化等,产生的代码差异也会
很大。
2009-11-3 09:34
0
雪    币: 233
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
148
路漫漫。。 祝 幸运常伴!
2009-11-5 09:30
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
149
To QQQWLX,
STL的反编译确实难度极大。正在想办法解决中。有兴趣的话,咱两交流交流。第一帖有我的邮箱。
2009-11-5 09:54
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
150
谢谢cxjin
2009-11-5 09:55
0
游客
登录 | 注册 方可回帖
返回
//