前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于反编译的搜索

【原创】一个基于x86的C/C++语言反编译c-decompiler [文字模式] - 看雪安全论坛 看雪安全论坛 > Windows > 『软件调试逆向』 > 【原创】一个基于x86的C/C++语言反编译c-decompiler PDA 查看完整版本 : 【原创】一个基于x86的C/C++语言反编译c-decompiler 页 : [1] 2 3 4 5 kawar2009-10-02, 04:42:30一个基于x86的C/C++语言反编译器的演示版本c-decompiler。 目前C语言的基本反编译功能已完成,C++部分刚刚开了个头,正在开发中。此版本非常不稳定,仅做演示用!它能很好的反编译自带的56个测试例子,但对于大家自己提供的测试例子可能会有问题!大家若进行测试,建议使用简单例子,可以修改56个例子反编译出来的结果,重新编译生成新的测试例子。 56个例子中,绝大部分是采用VC2003进行编译的,有debug版本和release版本。VC6,VC2005,VC2008各有4个测试例子,分别是采用向导生成的console和win32程序,分为debug版本和release版本, 测试平台为WinXP。 发布该演示版本,听听大牛们的看法和意见! 我的邮箱:kawarchen@gmail.com 网站: http://www.c-decompiler.com 任何更新会在该网站发布。 期待大家的意见和技术方面的讨论!:): 该演示版本有9MB左右,无法上传。 请大家到我的网站上下载:http://www.c-decompiler.com/C-Decompiler.rar forgot2009-10-02, 06:15:05自带的endless崩了,常数传播好像不彻底,比如出现 loc2 = 0; return (loc2); nevergone2009-10-02, 08:36:02支持一下.:cool: endless在我机器也崩溃了 wasking2009-10-02, 08:48:03强人,我来看神仙。 vivid2009-10-02, 09:14:16好东西,收藏了!:3: 刘国华2009-10-02, 10:47:42太强了,膜拜牛人 kawar2009-10-02, 17:38:01版主起得很早啊 6:15分! 还是熬通宵? 都很辛苦啊。 endless崩溃问题已经修正,请大家重新到我网站上下载:http://www.c-decompiler.com/C-Decompiler.rar 常数传播不彻底问题,主要是因为传值给eax. eax经常做为函数的返回值,所有我做了些特殊处理。生成的高级语言代码看起来还可以,不影响阅读。 至于其他寄存器的常数传播或者变量传播,都已做好。 另外,请教大家,标准模版库STL的识别,大家有啥好想法。我现在正在做这一块。 初步想法是:对于每个版本的STL,做个类似库签名的操作,然后匹配识别。 有个问题是这样的,库签名可以直接解析库。STL是在编译的时候Include进去的,处理起来比较麻烦。 achillis2009-10-03, 07:15:35太强大了,我来膜拜~ boywhp2009-10-03, 07:59:53看起来很cool 哈哈 ccgto2009-10-03, 08:29:48能做成od插件就太好了 就好象ida f5那样 jerrynpc2009-10-03, 08:37:11能做成od插件就太好了 就好象ida f5那样 支持楼上的,膜拜除了whp以外的大牛:o: nbw2009-10-03, 09:15:38版主起得很早啊 6:15分! 还是熬通宵? 都很辛苦啊。 endless崩溃问题已经修正,请大家重新到我网站上下载:http://www.c-decompiler.com/C-Decompiler.rar 常数传播不彻底问题,主要是因为传值给eax. eax经常做为函数的返回值,所有我做了些特殊处理... 另外很多不同版本的要处理完也是个问题 kawar2009-10-03, 09:54:07支持楼上的,膜拜除了whp以外的大牛:o:... 该反编译器的目标是做成一个独立的反编译器。专攻反编译这一块。 术业专攻,与IDA, Ollydbg直接竞争。 IDA的反编译插件Hex-Rays,反编译出来的结果对着汇编代码来看,有助于理解,但还不是真正的反编译器。 真正的反编译器是输入可执行文件,直接输入与最初源代码相似且功能一样的代码。 还在为这目标努力着。。。。 kawar2009-10-03, 09:54:48能做成od插件就太好了 就好象ida f5那样... 该反编译器的目标是做成一个独立的反编译器。专攻反编译这一块。 术业专攻,与IDA, Ollydbg直接竞争。 IDA的反编译插件Hex-Rays,反编译出来的结果对着汇编代码来看,有助于理解,但还不是真正的反编译器。 真正的反编译器是输入可执行文件,直接输入与最初源代码相似且功能一样的代码。 还在为这目标努力着。。。。 cntrump2009-10-03, 09:58:26不错的工具,是不是做强大以后就要收费了? 发现一个有趣的问题,自己也能反编译自己:cool: kawar2009-10-03, 09:59:36另外很多不同版本的要处理完也是个问题... 另外很多不同版本的要处理完也是个问题 ?? 不知你指的是哪方面? 不同版本的编译器吗? 市场上主流的编译器就那么几个,VC, BC, intel compiler...... 而且需要针对不同的编译器做的事情不是很多。 该反编译器可以做成编译器无关的。 boywhp2009-10-03, 11:24:50不知道逆向大型项目会表现如何,期待楼主的完善,如果有必要我倒是可以出点力气 就是不晓得楼主能否信任我了:o:毕竟我名声不是很好,DM上的朋友可能知道,娃哈哈 QQ:343435488 Email:boywhp@126.com zapline2009-10-03, 11:32:03膜拜一下... forgot2009-10-03, 11:59:01完全反汇编是停机问题,相当于完全优化,是不可能的。独立backend设计的话,不知道IR怎么定义的? nnhy2009-10-03, 13:47:18很感兴趣,只是我很久没用C++了,这几天都用C# nnhy2009-10-03, 13:48:19晕,打错字,是几年,不是几天…… 名叫教主2009-10-03, 14:25:33太强大了,又有心东西了 xacker2009-10-03, 17:42:53只能逆附带的例子啊 自己随便编译一个 就逆不了了 :(: 期待完善版 doking2009-10-03, 19:46:04楼主能否大概的讲讲由汇编转化为C语言?? kawar2009-10-03, 20:06:30不错的工具,是不是做强大以后就要收费了? 发现一个有趣的问题,自己也能反编译自己:cool:... 做强大后,确实要考虑一些现实问题,毕竟付出的努力总要有些回报才行。 当前版本没有加入任何抗反编译功能,而且给出的这个版本还是debug版。 这是当前这个演示版本还没有能力反编译这么大的一个可执行文件:cool: 因此无所谓了。 呵呵,等功能强大后,一些抗反编译功能也得加进去了。 kawar2009-10-03, 20:23:38不知道逆向大型项目会表现如何,期待楼主的完善,如果有必要我倒是可以出点力气 就是不晓得楼主能否信任我了:o:毕竟我名声不是很好,DM上的朋友可能知道,娃哈哈 QQ:343435488 Email:boywhp@126.com... 过阵子我可能会成立一个工作室,扩大研发团队,到时候会招聘几个人一起搞。放出该演示版本就是为了看看大家的反应,结交一些朋友,有机会的话,大家到时候一起搞搞。:D: 逆向大型项目?还没开始测试过。但我用XP自带的Notepad.exe测试过,效果还可以。(该演示版本不能反编译Notepad.exe). 该反编译器的方向是手工反编译与自动反编译相结合。这点将向IDA看齐。 kawar2009-10-03, 20:41:52完全反汇编是停机问题,相当于完全优化,是不可能的。独立backend设计的话,不知道IR怎么定义的?... 完全反编译,确实无法应用于所有的程序,但对于大部分程序来说,是可以全自动反编译的。 对于那些无法全自动反编译的情况,可以考虑内嵌汇编的形式或者手工进行反编译。 该反编译器以后会考虑自动和手工相结合的方式。 backend正在加入对C++的支持,IR与Christina Cifuentes的dcc类似。 kawar2009-10-03, 20:45:34只能逆附带的例子啊 自己随便编译一个 就逆不了了 :(: 期待完善版... 呵呵,确实是这样的。 不知你编译了什么程序,稍微修改附带的例子的反编译结果,应该是没问题。 kawar2009-10-03, 20:50:32楼主能否大概的讲讲由汇编转化为C语言??... 你可以参考一下1994年Christina Cifuentes发表的博士论文“Reverse Compilation Techniques” 该论文的中译本在看雪上也应该有。搜一下。 该论文讲了反编译的一些基本理论。值得看看 histimes2009-10-04, 08:25:40相对于已有的反编译工具,或已有的反编译算法,有什么独到之处? kawar2009-10-04, 11:30:45相对于已有的反编译工具,或已有的反编译算法,有什么独到之处?... 控制流分析和数据流分析这两块做了较多的研究,应用了很多新的算法。另外,后端加入了对C++的支持。 hustphoto2009-10-05, 00:09:15膜拜 :3: 静行源2009-10-05, 07:57:27好东西饿,谢谢提供 kawar2009-10-08, 17:17:33自己顶一顶。 这方面有研究的朋友,交流交流吧 kawar2009-10-08, 19:13:28熬夜一年多,终于把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 在密码学版的朋友,理论研究比较多。反编译这块的理论研究还没完全成熟,期待这方面有研究的朋友来交流交流。 boywhp2009-10-08, 20:12:19友情帮**下,呵呵 rockinuk2009-10-08, 20:46:36熬夜一年多,终于把C/C++语言反编译器的演示版本搞出来了! 目前C语言的基本反编译功能已完成,C++部分刚刚开了个头,正在开发中。此版本非常不稳定,仅做演示用!它能很好的反编译自带的56个测试例子,但对于大家自己提供的测试例子可能会有问题!大家若进行测试,建议使用简单例子,可以修改56个例... 1) 建議補上 readme 的中文版。 2) 建議 source code 也一併放上來。 謝謝。 kawar2009-10-08, 20:57:52呵呵,以下是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。多谢版主帮忙上传! kawar2009-10-08, 21:00:14:(:本反编译器非开源。。。。。。 或许以后会考虑考虑 rockinuk2009-10-08, 21:03:37:(:本反编译器非开源。。。。。。 或许以后会考虑考虑 沒開源? 意思是沒有 release 出來嗎? 請問有什麼困難 or 難言之隱? kawar2009-10-08, 21:12:32当前只是个演示版本,其主要目的是验证我提出的一些反编译算法。等成熟后,将考虑商业化问题,因此无法开源,还望见谅。 rockinuk2009-10-08, 21:33:41既然是演示版,就不涉及專利或是商業機密~ 我個人建議, kawar 可以放出大部份內容,關鍵技術可以保留不用釋出。 但我個人尊重 kawar 作者的想法。 kawar2009-10-08, 21:53:31谢谢rockinuk:): kanxue2009-10-08, 22:41:401) 建議補上 readme 的中文版。 2) 建議 source code 也一併放上來。 謝謝。 谢谢rockinuk转到本地! 期待kawar的作品越来越完善! rockinuk2009-10-08, 22:45:5632857 請看中間,decompile 的技術與觀念。 rockinuk2009-10-08, 22:50:25Example 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 kawar2009-10-08, 23:20:37rockinuk给的网站大家值得看看。 http://www.debugmode.com/dcompile/disc.htm 我的网站风格就是模拟它的。呵呵 kawar2009-10-08, 23:23:10感谢kanxue老大置为总顶!!! kawar2009-10-08, 23:28:04一些反编译方面的资料,供有兴趣的朋友看看: 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/ 大家看看,有问题的话,一起讨论讨论 kawar2009-10-08, 23:31:20c. ExetoC: http://exetoc.sourceforge.net/ 是liutaotao大牛的作品 vBulletin&reg; v3.8.7,Copyright &copy;2000-2014,vBulletin Solutions Inc.