精华内容
下载资源
问答
  • Reverse是一个用来解析二进制文件的逆向工程工具,而且它可以生成更具可读性的代码(类C语言)并带有彩色标识的语法,便于研究人员进行阅读代码。目前,其交互模式仍在做进一步开发。使用环境要求1、python 版本需要在...

    9277ccd23ba9f002d5b7724d7d860592.gif

    Reverse是一个用来解析二进制文件的逆向工程工具,而且它可以生成更具可读性的代码(类C语言)并带有彩色标识的语法,便于研究人员进行阅读代码。目前,其交互模式仍在做进一步开发。

    7f09582a1f8392e627bde9089a8c2a1f.png

    使用环境要求1、python 版本需要在 3.4及以上版本;2、具备capstone反汇编框架,其能提供丰富的反汇编指令;3、具备python-pyelftools模块,用于解析ELF文件(ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等)以及DWARF调试信息,详细请点击链接:pyelftools;4、具备python-pefile模块,以用于解析PE文件(如exe、dll、vxd、sys和vdm等),详细请点击链接:PEfile;5、具备python-msgpack模块,用于序列化运算,详细请点击链接:msgpack;6、具备256色终端;可以通过运行requirements.sh检测是否符合所有的要求反编译功能因为二进制文件中包含了符号型的main,所以其中的-x main是可选的。具体使用如下,$ ./reverse.py tests/server.bin交互模式在此模式下有更多的命令可以使用(da,db等),当然我们也可以通过help查看更多的命令。TODO列表1、添加命令:setbe/setle rawbase(用于原文件格式);2、如果从shell获取的文件为raw文件,则进行加载。视觉模式在交互模式中,我们可以通过使用命令 v 来切换到视觉模式。但该模式需要ncurses动态库的支持。1、代码/功能的定义2、内联注释3、外部参照TODO列表1、当分析器修改代码时,自动进行重载;2、多行注释;3、创建数据/数组;4、符号重命名;5、堆栈变量;6、结构、枚举;7、提高分析器的性能。分析shellcode其中对于每一个Int 0×80,该工具都会尝试通过参数检测syscall函数$ ./reverse.py --raw x86 tests/shellcode.bin

    dc7f422e84414ac4d6810e8405e82513.png

    文章来源及下载:

    https://github.com/plasma-disass ... b/master/reverse.py

    afd79f74511ce6d74caf65e91e2ba2cb.png

    你可能喜欢

    逆向工程师手中的利器-Sublime Text中的模糊匹配

    安卓源码逆向

    c46ab305330eb3b8f0d3b361ddb1c7e6.png

    展开全文
  • 反编译c语言工具

    2015-08-05 08:52:33
    这是一款反汇编c语言工具,可以将由c++工具编译出来的软件反编译成c代码,非常实用
  • exe反编译工具

    2012-12-12 13:46:17
    一个的exe 反编译工具。可将exe文件反编译成c语言。至于反编译后的代码质量就自己看啦
  • 反编译工具下载

    2019-01-24 14:56:03
    汇编代码反编译C语言代码,代码逻辑是对的,看起来比较像是伪代码,
  • 我之前推送过Java代码的编译与反编译,其中简单的介绍了Java编译与反编译相关的知识,最近给GitChat写《深入分析Java语法糖》的时候,又用到了很多反编译相关的知识,遂发现哪篇文章已有些过时。于是,这篇文章就...

    我之前推送过Java代码的编译与反编译,其中简单的介绍了Java编译与反编译相关的知识,最近给GitChat写《深入分析Java语法糖》的时候,又用到了很多反编译相关的知识,遂发现哪篇文章已有些过时。于是,这篇文章就这样呈现在你的面前了~

    编程语言

    在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language)。编程语言(Programming Language)分为低级语言(Low-level Language)和高级语言(High-level Language)。

    机器语言(Machine Language)和汇编语言(Assembly Language)属于低级语言,直接用计算机指令编写程序。

    而C、C++、Java、Python等属于高级语言,用语句(Statement)编写程序,语句是计算机指令的抽象表示。

    举个例子,同样一个语句用C语言、汇编语言和机器语言分别表示如下:

    e7c64b7f77c5af38d65a6489c077d062.png

    计算机只能对数字做运算,符号、声音、图像在计算机内部都要用数字表示,指令也不例外,上表中的机器语言完全由十六进制数字组成。最早的程序员都是直接用机器语言编程,但是很麻烦,需要查大量的表格来确定每个数字表示什么意思,编写出来的程序很不直观,而且容易出错,于是有了汇编语言,把机器语言中一组一组的数字用助记符(Mnemonic)表示,直接用这些助记符写出汇编程序,然后让汇编器(Assembler)去查表把助记符替换成数字,也就把汇编语言翻译成了机器语言。

    但是,汇编语言用起来同样比较复杂,后面,就衍生出了Java、C、C++等高级语言。

    什么是编译

    上面提到语言有两种,一种低级语言,一种高级语言。可以这样简单的理解:低级语言是计算机认识的语言、高级语言是程序员认识的语言。

    那么如何从高级语言转换成低级语言呢?这个过程其实就是编译。

    从上面的例子还可以看出,C语言的语句和低级语言的指令之间不是简单的一一对应关系,一条a=b+1;语句要翻译成三条汇编或机器指令,这个过程称为编译(Compile),由编译器(Compiler)来完成,显然编译器的功能比汇编器要复杂得多。用C语言编写的程序必须经过编译转成机器指令才能被计算机执行,编译需要花一些时间,这是用高级语言编程的一个缺点,然而更多的是优点。首先,用C语言编程更容易,写出来的代码更紧凑,可读性更强,出了错也更容易改正。

    将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻译为计算机能解读、运行的低阶机器语言的程序的过程就是编译。负责这一过程的处理的工具叫做编译器

    现在我们知道了什么是编译,也知道了什么是编译器。不同的语言都有自己的编译器,Java语言中负责编译的编译器是一个命令:javac

    javac是收录于JDK中的Java语言编译器。该工具可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。

    当我们写完一个HelloWorld.java文件后,我们可以使用javac HelloWorld.java命令来生成HelloWorld.class文件,这个class类型的文件是JVM可以识别的文件。通常我们认为这个过程叫做Java语言的编译。其实,class文件仍然不是机器能够识别的语言,因为机器只能识别机器语言,还需要JVM再将这种class文件类型字节码转换成机器可以识别的机器语言。

    什么是反编译

    反编译的过程与编译刚好相反,就是将已编译好的编程语言还原到未编译的状态,也就是找出程序语言的源代码。就是将机器看得懂的语言转换成程序员可以看得懂的语言。Java语言中的反编译一般指将class文件转换成java文件。

    有了反编译工具,我们可以做很多事情,最主要的功能就是有了反编译工具,我们就能读得懂Java编译器生成的字节码。

    Java反编译工具

    本文主要介绍3个Java的反编译工具:javapjadCFR

    javap

    javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。javap和其他两个反编译工具最大的区别是他生成的文件并不是java文件,也不像其他两个工具生成代码那样更容易理解。拿一段简单的代码举例,如我们想分析Java 7中的switch是如何支持String的,我们先有以下可以编译通过的源代码:

    public class switchDemoString { public static void main(String[] args) { String str = "world"; switch (str) { case "hello": System.out.println("hello"); break; case "world": System.out.println("world"); break; default: break; } }}

    执行以下两个命令:

    javac switchDemoString.javajavap -c switchDemoString.class

    生成代码如下:

    public class com.hollis.suguar.switchDemoString { public com.hollis.suguar.switchDemoString(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #2 // String world 2: astore_1 3: aload_1 4: astore_2 5: iconst_m1 6: istore_3 7: aload_2 8: invokevirtual #3 // Method java/lang/String.hashCode:()I 11: lookupswitch { // 2 99162322: 36 113318802: 50 default: 61 } 36: aload_2 37: ldc #4 // String hello 39: invokevirtual #5 // Method java/lang/String.equals:(Ljava/lang/Object;)Z 42: ifeq 61 45: iconst_0 46: istore_3 47: goto 61 50: aload_2 51: ldc #2 // String world 53: invokevirtual #5 // Method java/lang/String.equals:(Ljava/lang/Object;)Z 56: ifeq 61 59: iconst_1 60: istore_3 61: iload_3 62: lookupswitch { // 2 0: 88 1: 99 default: 110 } 88: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream; 91: ldc #4 // String hello 93: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 96: goto 110 99: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream; 102: ldc #2 // String world 104: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 107: goto 110 110: return}

    我个人的理解,javap并没有将字节码反编译成java文件,而是生成了一种我们可以看得懂字节码。其实javap生成的文件仍然是字节码,只是程序员可以稍微看得懂一些。如果你对字节码有所掌握,还是可以看得懂以上的代码的。其实就是把String转成hashcode,然后进行比较。

    个人认为,一般情况下我们会用到javap命令的时候不多,一般只有在真的需要看字节码的时候才会用到。但是字节码中间暴露的东西是最全的,你肯定有机会用到,比如我在分析synchronized的原理的时候就有是用到javap。通过javap生成的字节码,我发现synchronized底层依赖了ACC_SYNCHRONIZED标记和monitorenter、monitorexit两个指令来实现同步。

    jad

    jad是一个比较不错的反编译工具,只要下载一个执行工具,就可以实现对class文件的反编译了。还是上面的源代码,使用jad反编译后内容如下:

    命令:jad switchDemoString.class

    public class switchDemoString{ public switchDemoString() { } public static void main(String args[]) { String str = "world"; String s; switch((s = str).hashCode()) { default: break; case 99162322: if(s.equals("hello")) System.out.println("hello"); break; case 113318802: if(s.equals("world")) System.out.println("world"); break; } }}

    看,这个代码你肯定看的懂,因为这不就是标准的java的源代码么。这个就很清楚的可以看到原来字符串的switch是通过equals()和hashCode()方法来实现的

    但是,jad已经很久不更新了,在对Java7生成的字节码进行反编译时,偶尔会出现不支持的问题,在对Java 8的lambda表达式反编译时就彻底失败,比如会直接

    CRF

    jad很好用,但是无奈的是很久没更新了,所以只能用一款新的工具替代他,CFR是一个不错的选择,相比jad来说,他的语法可能会稍微复杂一些,但是好在他可以work。

    如,我们使用cfr对刚刚的代码进行反编译。执行一下命令:

    java -jar cfr_0_125.jar switchDemoString.class --decodestringswitch false

    得到以下代码:

    public class switchDemoString { public static void main(String[] arrstring) { String string; String string2 = string = "world"; int n = -1; switch (string2.hashCode()) { case 99162322: { if (!string2.equals("hello")) break; n = 0; break; } case 113318802: { if (!string2.equals("world")) break; n = 1; } } switch (n) { case 0: { System.out.println("hello"); break; } case 1: { System.out.println("world"); break; } } }}

    通过这段代码也能得到字符串的switch是通过equals()和hashCode()方法来实现的结论。

    相比Jad来说,CFR有很多参数,还是刚刚的代码,如果我们使用以下命令,输出结果就会不同:

    java -jar cfr_0_125.jar switchDemoString.classpublic class switchDemoString { public static void main(String[] arrstring) { String string; switch (string = "world") { case "hello": { System.out.println("hello"); break; } case "world": { System.out.println("world"); break; } } }}

    所以--decodestringswitch表示对于switch支持string的细节进行解码。类似的还有--decodeenumswitch、--decodefinally、--decodelambdas等。在我的关于语法糖的文章中,我使用--decodelambdas对lambda表达式警进行了反编译。 源码:

    public static void main(String... args) { List strList = ImmutableList.of strList.forEach( s -> { System.out.println(s); } );

    java -jar cfr_0_125.jar lambdaDemo.class --decodelambdas false反编译后代码:

    public static /* varargs */ void main(String ... args) { ImmutableList strList = ImmutableList.of((Object)"Hollis
    展开全文
  • 反编译工具的使用

    千次阅读 2017-11-17 13:47:09
    反编译工具的图文配置 1、编译: 在编程入门时学习C语言,都知道GCC编译C语言源码时有四个步骤 预处理:编译前的步骤,编译器将代码中头文件处理进来,包括宏定义等的处理; 编译:编译原理中此步骤包括(1)语言和...

    反编译工具的图文配置

    一、前言

    1-1. 编译

        在编程入门时学习C语言,我们都知道GCC编译C语言源码时有四个步骤

    • 预处理:
        编译前的步骤,编译器将代码中头文件处理进来,包括宏定义等的处理;
    • 编译:
         编译原理中此步骤包括(1)语言和文法、(2)词法分析、(3)语法分析、(4)语法制导翻译、(5)中间代码生成、(6)存储管理、(7)代码优化和(8)目标代码生成这些工作;在这个过程中编译器主要工作就是词法分析、语法分析、语义分析等,将代码翻译成汇编语言。
    • 汇编:
        这个过程是把汇编语言转换为机器语言也就是二进制0101010;
    • 链接:
        结果为可执行文件;

    1-2. 反编译

        以Java开发为例,简单的说:

    编译是将*.java文件转换为*.class文件的过程;

    那么反编译就是将*.class文件转换为*.java文件的过程。

    二、反编译工具的作用

        刚接触开发的时候经常遇到下面的情况

        某些源码是看不了的,打开文件后是下图所示的这种情况。此时跟踪代码时或者分析某些逻辑时就比较麻烦,不直观,非常影响开发效率。

    而反编译工具就是能够将源码转换为Java文件,能够使我们更直观的了解代码逻辑。


    图:HttpRemoteChannel.class源码图



    图:反编译HttpRemoteChannel.class源码图

    三、反编译工具的使用

    这里是基于开发工具Eclipse的图文演示

    3-1. Install New Software

        首先菜单栏选中Help下的Install New Software功能选项


    3-2. Add Name And Location

        点击Add在弹出框内填写信息,单击OK保存

    属性名称 属性值
    Name jd-eclipse_update_site
    Location http://jd.benow.ca/jd-eclipse/update



    3-3. Install Java Decompiler Eclipse Plug-in

        然后选择出现的资源,单击Next即可;

        如果资源已经安装在开发工具上则会给出提示。





    3-4. Restart Eclipse

        一路Next最后Finish完成,会弹出提示框建议重启开发工具。点击重启即可。

    3-5. 配置*.class文件的打开方式

        打开后选择菜单栏 Window 下的 Preferences 打开 Preferences

        选择 General - Editors - File Associations

        选中 *.class 文件 default 默认文件打开方式为 Class File Editor


        保存设置后,再打开源码*.class文件,就被反编译工具编译过了;

        效果如下:





    批量去除注释

    END


    展开全文
  • Reflector 7反编译工具

    2012-12-02 10:10:57
    只能针对托管代码进行反编译,对于一些c语言编写的不能
  • 下述所用的工具包含:IDA pro,Dev C++ 以下介绍两种方法 开始操作之前,需要知道的几个小前提 一个可执行文件包含多个字段(field), text段是程序代码段,包含着要运行程序的指令。shellcode像你说的,转成汇编...

    下述所用的工具包含:IDA pro,Dev C++
    以下介绍两种方法
    开始操作之前,需要知道的几个小前提

    • 一个可执行文件包含多个字段(field), text段是程序代码段,包含着要运行程序的指令。shellcode像你说的,转成汇编语言很容易,因为shellcode本质就是一段恶意的机器码——cpu指令
    • 逆向工程(reverse engineering)常用到的分析工具大体有两个:ollydbg、ida pro(当然如果是安全方面的话还会用到更多的工具比如immunity debugger等)前者是动态分析工具,如果不懂汇编的话就不管了。ida里有一个巨强大的功能,f5之后可以将一个函数反编译成c代码。
    • nop,就是空指令,运行这条指令,cpu不做任何事情。它的机器码是0x90

    所以这里的思路就是:【c代码写一个程序,多了不用写就一个main函数就可以】——>【修改编译出程序的text段即修改代码段】——>【ida反汇编接着再反编译成c代码】
    这里我用一个用cmd打开calc.exe的shellcode作为例子:
    在这里插入图片描述
    这是直接利用的c代码,效果图如下:
    在这里插入图片描述
    接着切入正题,我们需要在主函数返回之前插入我们的shellcode,所以说需要在return 0之前留空使得在保证原有程序大小的情况下插入shellcode。

    这里就需要用nop来填充,对于dev中用汇编语言和在VC++中用汇编是不一样的,如下图:
    在这里插入图片描述
    总之要多写一些nop…
    接着把程序拖到ida:
    在这里插入图片描述
    打开hex-view:
    在这里插入图片描述
    90是nop指令的机器码,所以直接在90这里改代码,按f2编辑,将shellcode填上。成果图:

    之后就是在main函数上点f5,然后就完成了!这个方法比较复杂


    (*(void(*)())&shellcode)();
    

    这里涉及一句代码,函数指针指向shellcode字符串首地址,然后调用这个shellcode首地址的这个函数。虽然看起来挺复杂的,但换成汇编语言就一条指令:

    call shellcode
    

    所以就很简单了:
    在这里插入图片描述
    找到shellcode函数f5,完成。
    以下是最后成果
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 反编译软件

    2014-09-05 10:11:04
    最好用的反编译工具c语言 二进制 Decompiler 数据结构 Decompiler 是一个反编译器,用来读取二进制应用程序,反编译他们,推断数据类型和结构化的C源代码排放
  • C语言函数速查工具

    2011-11-12 18:08:55
    这是一个方便查询C语言函数的小程序。考虑到很多网站提供的已编译html文档格式的C语言函数资料不支持动态查询,不支持基于功能内容查询,所以用...严禁反编译此程序。 【绿色软件,经测试可以在Windows XP/7正常运行】
  • so文件反汇编反编译到C源码

    千次阅读 2017-09-15 16:08:31
    动态库*.so在linux下用c和c++编程时经常会碰到,下面我来介绍一下怎么把so文件反编译C语言 so文件反汇编、反编译主要借助工具IDA Pro,下面简单介绍其使用步骤。 打开IDA Pro;将so文件拖入刚打开的窗口,点击...
  • 1、用PEID等工具查看程序有没有加壳,一般都会有壳的,有专用脱壳工具的就省得麻烦... delphi反编Delphi程序delphi反编译ded译dede2、运行脱壳后的程序,看有无自校验2. 12岁创业CEO田众和之谜c语言编程软件视频...
  • 后续我们会首先显示*.o的汇编,然后使用反编译后的C语言再比较最后的汇编结果。 通过IDA打开的汇编语言如下图: 接下来我们通过汇编来进行一步步的分析: 1、我们不能通过开始给R6,R5,R4的赋值操作确定其具体的...
  • 汇编工具

    2013-02-07 09:24:00
    反汇编工具, MAC版本,在MAC系统下安装,可以实现把BIN文件反编译C语言文件。
  • C语言高级

    2020-08-19 21:59:33
    进行语法、语义、词法分析,最终把C语言程序编译成汇编语言程序。 3.汇编: 进行语法、语义、词法分析,最终把汇编语言程序汇编成机器码。 4.链接: 将程序的段内偏移地址重定位为线性地址,根据符号表链接静态...
  • 一、拿到一个软件,我们cracker首先要做的是检测壳的类型,并知道... 12岁创业CEO田众和之谜c语言编程软件视频(0),没有的就手动相关工具可以在找到  三、根据编制语言来选择调试工具来分析,一般用wdasm或idad...
  • 假如目前有三个文件a.c、b.c、ab.lds: 1.arm-none-eabi-gcc arm-none-eabi-gcc --help 查看帮助信息。...arm-none-eabi-gcc -g -c a.c生成a.o文件,-g使得如果汇编可对应C语言显示。 arm-none-eabi-gcc -c..
  • C语言宏详解

    千次阅读 2018-11-17 16:14:00
    宏仅仅是在C预处理阶段的一种文本替换工具编译完之后对二进制代码不可见。基本用法如下: 1. 标示符别名 #define BUFFER_SIZE 1024 预处理阶段,foo = (char *) malloc (BUFFER_SIZE);会被替换成foo = (char *...
  • C语言本与末》

    2007-05-18 16:17:45
    本书与其它大部分C语言的书有所不同,它并不是一本严格介绍C语言语法的书,而是以C语言工具,描述了对信息、编译、数据结构、算法、其它语言、网络、数据库、文件系统等概念,提出了对它们的理解和思考,过来再...
  • C语言讲义.doc

    2018-01-27 10:41:43
    1.10 C语言编译过程,GCC参数简介 16 1.10.1 C语言编译过程 16 1.10.2 -E预编译 16 1.10.3 -S汇编 16 1.10.4 -c编译 16 1.10.5 链接 16 1.11 操作系统结构 17 1.11.1 用户模式 17 1.11.2 内核模式 17 1.12 64位,32位...
  • C语言删除文件夹下的目录

    千次阅读 2012-10-26 11:34:39
    前几天使用Android反编译工具反编译了360 的软件,Xml文件不可以用,但是每个xml都对应的编译出了一个.txt文件 恢复的办法就是删除.xml然后重命名.txt文件,文件很多 打算写个小工具,想着尝试用C 语言写下,中间...
  • c语言之宏定义

    2018-05-03 22:16:50
    一、概念 宏是工作在c预处理阶段的一种文本替换工具编译后对二进制代码不可见; 由于是纯替换所以不会对其进行语法检测建议多用();二、用法(1)、#define main(a,b) a<b?a:b main(int a,int b)在...
  • 作为C语言的初学者,选取的开发工具一要符合C语言的最新标准;二要简单易用,集成编译器、编辑器和调试器于一身。所以我推荐Dev-c++ 5.11,它是免费的。它自带TDM-GCC 4.9.2编译器,包含32位和64位,支持最新的C11...
  • 之前我也尝试用用交叉编译工具链中的工具定位错误,但这有个问题就是嵌入式平台不一定支持这些丰富的调试工具,所以最好的前提就是开发者注意双目标开发,注重软件在平台的可移植性。 参考:...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决了,是吗? 1.4 新的64位机上的64位类型...
  • 宏仅仅是在C预处理阶段的一种文本替换工具编译完之后对二进制代码不可见。基本用法如下: 标示符别名 #define BUFFER_SIZE 1024 预处理阶段,foo = (char *) malloc (BUFFER_SIZE);会被替换成foo = (char *) ...

空空如也

空空如也

1 2 3 4 5 6
收藏数 120
精华内容 48
关键字:

c语言反编译工具

c语言 订阅