首页
社区
课程
招聘
[原创]一个基于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 )
在线值:
发帖
回帖
粉丝
26
过阵子我可能会成立一个工作室,扩大研发团队,到时候会招聘几个人一起搞。放出该演示版本就是为了看看大家的反应,结交一些朋友,有机会的话,大家到时候一起搞搞。

逆向大型项目?还没开始测试过。但我用XP自带的Notepad.exe测试过,效果还可以。(该演示版本不能反编译Notepad.exe).

该反编译器的方向是手工反编译与自动反编译相结合。这点将向IDA看齐。
2009-10-3 20:23
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
完全反编译,确实无法应用于所有的程序,但对于大部分程序来说,是可以全自动反编译的。
对于那些无法全自动反编译的情况,可以考虑内嵌汇编的形式或者手工进行反编译。
该反编译器以后会考虑自动和手工相结合的方式。

backend正在加入对C++的支持,IR与Christina Cifuentes的dcc类似。
2009-10-3 20:41
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
呵呵,确实是这样的。
不知你编译了什么程序,稍微修改附带的例子的反编译结果,应该是没问题。
2009-10-3 20:45
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
你可以参考一下1994年Christina Cifuentes发表的博士论文“Reverse Compilation Techniques”
该论文的中译本在看雪上也应该有。搜一下。
该论文讲了反编译的一些基本理论。值得看看
2009-10-3 20:50
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
相对于已有的反编译工具,或已有的反编译算法,有什么独到之处?
2009-10-4 08:25
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
控制流分析和数据流分析这两块做了较多的研究,应用了很多新的算法。另外,后端加入了对C++的支持。
2009-10-4 11:30
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
膜拜  
2009-10-5 00:09
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
好东西饿,谢谢提供
2009-10-5 07:57
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
自己顶一顶。
这方面有研究的朋友,交流交流吧
2009-10-8 17:17
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
熬夜一年多,终于把C/C++语言反编译器的演示版本搞出来了!
   目前C语言的基本反编译功能已完成,C++部分刚刚开了个头,正在开发中。此版本非常不稳定,仅做演示用!它能很好的反编译自带的56个测试例子,但对于大家自己提供的测试例子可能会有问题!大家若进行测试,建议使用简单例子,可以修改56个例子反编译出来的结果,重新编译生成新的测试例子。
  56个例子中,绝大部分是采用VC2003进行编译的,有debug版本和release版本。VC6,VC2005,VC2008各有4个测试例子,分别是采用向导生成的console和win32程序,分为debug版本和release版本。
    孤军奋战很累,发布该演示版本,只为广交志同道合的朋友,寻求合作机会,并听听大牛们的看法和意见。
    我的邮箱:kawarchen@gmail.com
    网站: http://www.c-decompiler.com  任何更新会在该网站发布。

该演示版本有9MB左右,无法上传。
请大家到我的网站上下载:http://www.c-decompiler.com/C-Decompiler.rar

    期待大家的意见和技术方面的讨论!

该贴最初发表在调试逆向版本:
http://bbs.pediy.com/showthread.php?p=694765#post694765
在密码学版的朋友,理论研究比较多。反编译这块的理论研究还没完全成熟,期待这方面有研究的朋友来交流交流。
2009-10-8 19:13
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
36
友情帮**下,呵呵
2009-10-8 20:12
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
37
1) 建議補上 readme 的中文版。
2) 建議 source code 也一併放上來。

謝謝。
上传的附件:
2009-10-8 20:46
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
呵呵,以下是readme的中文版本:
C-Decompiler是一个基于x86的C/C++语言反编译器原型,它读取pe文件,产生对应的C/C++代码.

本目录包含4个主要文件:      
C-Decompiler.exe             反编译器原型
TestSample文件夹             37个测试例子
                             库原型文件ProtoType.dat
                             C语言运行库libc.lib和libcd.lib

mfc71d.dll, msvcp71d.dll和 msvcr71d.dll是运行C-Decompiler.exe的三个支持库

C-Decompiler.exe 使用说明
1. 双击运行C-Decompiler.exe
2. 点击第一个按钮(或者点击菜单File,然后点击Open),选择要反编译的exe文件。
3. 点击第二个按钮(或者点击菜单File,然后点击Decompile),进行反编译
   该程序会在TestSample目录下生成对应的以.a结尾汇编代码文件和以.c结尾的C语言文件。
   这时候,左边的视图窗口会显示该exe文件包含的各个函数名
   双击任何一个函数名,会分别在第二个,第三个视图窗口显示相关的汇编代码和C语言代码
   点击函数名AllFunc,会显示出所有的的汇编代码和C语言代码
4. 点击第三个按钮(或者点击菜单File,然后点击Exit)或者右上角的关闭按钮,退出程序。

版主权限确实高。我上传的附件限制为1000KB。多谢版主帮忙上传!
2009-10-8 20:57
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
本反编译器非开源。。。。。。

或许以后会考虑考虑
2009-10-8 21:00
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
40
沒開源?
意思是沒有 release 出來嗎?
請問有什麼困難 or 難言之隱?
2009-10-8 21:03
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
当前只是个演示版本,其主要目的是验证我提出的一些反编译算法。等成熟后,将考虑商业化问题,因此无法开源,还望见谅。
2009-10-8 21:12
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
42
既然是演示版,就不涉及專利或是商業機密~
我個人建議, kawar 可以放出大部份內容,關鍵技術可以保留不用釋出。
但我個人尊重 kawar 作者的想法。
2009-10-8 21:33
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
谢谢rockinuk
2009-10-8 21:53
0
雪    币: 47147
活跃值: (20460)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
44
谢谢rockinuk转到本地!
期待kawar的作品越来越完善!
2009-10-8 22:41
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
45

請看中間,decompile 的技術與觀念。
上传的附件:
2009-10-8 22:45
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
46
Example of Decompilation
We illustrate the decompilation of a fibonacci program (see Figure 4). Figure 1 illustrates the relevant machine code of this binary. No library or compiler start up code is included. Figure 2 presents the disassembly of the binary program. All calls to library routines were detected by dccSign (the signature matcher), and thus not included in the analysis. Figure 3 is the final output from dcc. This C program can be compared with the original C program in Figure 4.

--------------------------------------------------------------------------------

         55 8B EC 83 EC 04 56 57 1E B8 94 00 50 9A
   0E 00 3C 17 59 59 16 8D 46 FC 50 1E B8 B1 00 50
   9A 07 00 F0 17 83 C4 08 BE 01 00 EB 3B 1E B8 B4
   00 50 9A 0E 00 3C 17 59 59 16 8D 46 FE 50 1E B8
   C3 00 50 9A 07 00 F0 17 83 C4 08 FF 76 FE 9A 7C
   00 3B 16 59 8B F8 57 FF 76 FE 1E B8 C6 00 50 9A
   0E 00 3C 17 83 C4 08 46 3B 76 FC 7E C0 33 C0 50
   9A 0A 00 49 16 59 5F 5E 8B E5 5D CB 55 8B EC 56
   8B 76 06 83 FE 02 7E 1E 8B C6 48 50 0E E8 EC FF
   59 50 8B C6 05 FE FF 50 0E E8 E0 FF 59 8B D0 58
   03 C2 EB 07 EB 05 B8 01 00 EB 00 5E 5D CB
Figure 1 - Machine Code for Fibonacci.exe

--------------------------------------------------------------------------------

                proc_1  PROC  FAR                        
000 00053C 55                  PUSH           bp         
001 00053D 8BEC                MOV            bp, sp      
002 00053F 56                  PUSH           si         
003 000540 8B7606              MOV            si, [bp+6]  
004 000543 83FE02              CMP            si, 2      
005 000546 7E1E                JLE            L1         
006 000548 8BC6                MOV            ax, si      
007 00054A 48                  DEC            ax         
008 00054B 50                  PUSH           ax         
009 00054C 0E                  PUSH           cs         
010 00054D E8ECFF              CALL  near ptr proc_1      
011 000550 59                  POP            cx         
012 000551 50                  PUSH           ax         
013 000552 8BC6                MOV            ax, si      
014 000554 05FEFF              ADD            ax, 0FFFEh  
015 000557 50                  PUSH           ax         
016 000558 0E                  PUSH           cs         
017 000559 E8E0FF              CALL  near ptr proc_1      
018 00055C 59                  POP            cx         
019 00055D 8BD0                MOV            dx, ax      
020 00055F 58                  POP            ax         
021 000560 03C2                ADD            ax, dx      
023 00056B 5E             L2:  POP            si         
024 00056C 5D                  POP            bp         
025 00056D CB                  RETF                       
026 000566 B80100         L1:  MOV            ax, 1      
027 000569 EB00                JMP            L2         
                proc_1  ENDP                              
                                                         
                main  PROC  FAR                           
000 0004C2 55                  PUSH           bp         
001 0004C3 8BEC                MOV            bp, sp      
002 0004C5 83EC04              SUB            sp, 4      
003 0004C8 56                  PUSH           si         
004 0004C9 57                  PUSH           di         
005 0004CA 1E                  PUSH           ds         
006 0004CB B89400              MOV            ax, 94h     
007 0004CE 50                  PUSH           ax         
008 0004CF 9A0E004D01          CALL   far ptr printf      
009 0004D4 59                  POP            cx         
010 0004D5 59                  POP            cx         
011 0004D6 16                  PUSH           ss         
012 0004D7 8D46FC              LEA            ax, [bp-4]  
013 0004DA 50                  PUSH           ax         
014 0004DB 1E                  PUSH           ds         
015 0004DC B8B100              MOV            ax, 0B1h   
016 0004DF 50                  PUSH           ax         
017 0004E0 9A07000102          CALL   far ptr scanf      
018 0004E5 83C408              ADD            sp, 8      
019 0004E8 BE0100              MOV            si, 1      
021 000528 3B76FC         L3:  CMP            si, [bp-4]  
022 00052B 7EC0                JLE            L4         
023 00052D 33C0                XOR            ax, ax      
024 00052F 50                  PUSH           ax         
025 000530 9A0A005A00          CALL   far ptr exit        
026 000535 59                  POP            cx         
027 000536 5F                  POP            di         
028 000537 5E                  POP            si         
029 000538 8BE5                MOV            sp, bp      
030 00053A 5D                  POP            bp         
031 00053B CB                  RETF                       
032 0004ED 1E             L4:  PUSH           ds         
033 0004EE B8B400              MOV            ax, 0B4h   
034 0004F1 50                  PUSH           ax         
035 0004F2 9A0E004D01          CALL   far ptr printf      
036 0004F7 59                  POP            cx         
037 0004F8 59                  POP            cx         
038 0004F9 16                  PUSH           ss         
039 0004FA 8D46FE              LEA            ax, [bp-2]  
040 0004FD 50                  PUSH           ax         
041 0004FE 1E                  PUSH           ds         
042 0004FF B8C300              MOV            ax, 0C3h   
043 000502 50                  PUSH           ax         
044 000503 9A07000102          CALL   far ptr scanf      
045 000508 83C408              ADD            sp, 8      
046 00050B FF76FE              PUSH  word ptr [bp-2]      
047 00050E 9A7C004C00          CALL   far ptr proc_1      
048 000513 59                  POP            cx         
049 000514 8BF8                MOV            di, ax      
050 000516 57                  PUSH           di         
051 000517 FF76FE              PUSH  word ptr [bp-2]      
052 00051A 1E                  PUSH           ds         
053 00051B B8C600              MOV            ax, 0C6h   
054 00051E 50                  PUSH           ax         
055 00051F 9A0E004D01          CALL   far ptr printf      
056 000524 83C408              ADD            sp, 8      
057 000527 46                  INC            si         
058                            JMP            L3         ;Synthetic inst
                main  ENDP
Figure 2 - Code produced by the Disassembler

--------------------------------------------------------------------------------

/*                                                            
* Input file   : fibo.exe                                    
* File type    : EXE                                         
*/                                                           
                                                              
int proc_1 (int arg0)                                         
/* Takes 2 bytes of parameters.                              
* High-level language prologue code.                        
* C calling convention.                                      
*/                                                           
{                                                            
int loc1;                                                     
int loc2; /* ax */                                            
                                                              
    loc1 = arg0;                                             
    if (loc1 > 2) {                                          
        loc2 = (proc_1 ((loc1 - 1)) + proc_1 ((loc1 + 0xFFFE)));  
    }                                                         
    else {                                                   
        loc2 = 1;                                             
    }                                                         
    return (loc2);                                            
}                                                            
                                                              
                                                              
void main ()                                                  
/* Takes no parameters.                                       
* High-level language prologue code.                        
*/                                                           
{                                                            
int loc1;                                                     
int loc2;                                                   
int loc3;                                                     
int loc4;                                                     
                                                              
    printf ("Input number of iterations: ");                  
    scanf ("%d", &loc1);                                      
    loc3 = 1;                                                
    while ((loc3 <= loc1)) {                                 
        printf ("Input number: ");                           
        scanf ("%d", &loc2);                                 
        loc4 = proc_1 (loc2);                                 
        printf ("fibonacci(%d) = %u\n", loc2, loc4);         
        loc3 = (loc3 + 1);                                    
    } /* end of while */                                      
    exit (0);                                                
}
Figure 3 - Code produced by dcc in C

--------------------------------------------------------------------------------

#include <stdio.h>                                            
                                                              
int main()                                                   
{ int i, numtimes, number;                                    
  unsigned value, fib();                                      
                                                              
   printf("Input number of iterations: ");                    
   scanf ("%d", &numtimes);                                   
   for (i = 1; i <= numtimes; i++)                           
   {                                                         
      printf ("Input number: ");                              
      scanf ("%d", &number);                                 
      value = fib(number);                                    
      printf("fibonacci(%d) = %u\n", number, value);         
   }                                                         
   exit(0);                                                   
}                                                            
                                                              
unsigned fib(x)                 /* compute fibonacci number recursively */
int x;                                                        
{                                                            
   if (x > 2)                                                
      return (fib(x - 1) + fib(x - 2));                       
   else                                                      
      return (1);                                             
}
Figure 4 - Initial C Program

Source from http://www.itee.uq.edu.au/~cristina/dcc.html
2009-10-8 22:50
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
rockinuk给的网站大家值得看看。
http://www.debugmode.com/dcompile/disc.htm

我的网站风格就是模拟它的。呵呵
2009-10-8 23:20
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
感谢kanxue老大置为总顶!!!
2009-10-8 23:23
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
49
一些反编译方面的资料,供有兴趣的朋友看看:
1994年Christina Cifuentes的博士论文“Reverse Compilation Techniques” 中译本:
http://bbs.kanxue.com/printthread.php?t=44518&pp=40

2007年Mike Van Emmerik的博士论文“Static Single Assignment for Decompilation”
大家可以搜一下

三个开源反编译器:
    a. Dcc:              http://www.itee.uq.edu.au/~cristina/dcc.html
    b. Boomerang:   http://boomerang.sourceforge.net/
    c. ExetoC:          http://exetoc.sourceforge.net/

大家看看,有问题的话,一起讨论讨论
2009-10-8 23:28
0
雪    币: 303
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
50
c. ExetoC:          http://exetoc.sourceforge.net/
是liutaotao大牛的作品
2009-10-8 23:31
0
游客
登录 | 注册 方可回帖
返回
//