分享:关于如何使用反编译器,获取源码清单方法

关于反编译器 
    从概念上讲,反编译器使用起来非常简单。他就是把编译器逆过来用:你给它 .class 文件,它还给你一个源代码文件。

一些比较新的反编译器有精致的图形界面。但在一开始所举的例子中,我们将使用的是 Mocha,它是第一个公开的可利用的反编译器。在本文的最后,我会讨论一下在 GPL 下一个较新的反编译器。(请参阅参考资料,下载
Mocha 并获取 Java 反编译器的清单。)

让我们假设在目录中有一个名为 Foo.class 的类文件。用 Mocha 对它进行反编译非常简单,只要键入以下命令:

$ java mocha.Decompiler Foo.class

这会生成一个新的名为 Foo.mocha 的文件(Mocha 使用 Foo.mocha 这个名字以避免覆盖原文件的源代码)。这个新文件就是 Java 的源文件,并且假设一切顺利的话,您现在就能正常地编译它。只需把它重命名为 Foo.java 就可以开始了。

但是这儿有个问题:如果在一些您已经有所改动的代码上运行 Mocha,您会注意到它生成的代码和源代码不是完全一样的。我举个例子,这样您能明白我的意思。清单 3 所示的原始源代码是来自一个名为 Foo.java 的测试程序。

清单 3. Foo.java 的一小部分原始源代码     private int member = 10;     public Foo() {       int
local = returnInteger();       System.out.println( "foo constructor" );       priv( local );     }

以下是 Mocha 生成的代码

清单 4. Mocha 生成的 Foo.java 的源代码       private int member;       public Foo()       { 
         member = 10;           int local = returnInteger();           System.out.println("foo constructor");           priv(local);       }

这两个代码片段的成员变量 member 被初始化为 10 的位置不同。在原始源代码中,它在与声明的同一行中被表示为一个初始值,而在被反编译后的源代码中,它在一个构造符中被表示为一条赋值语句。反编译后的代码告诉我们一些有关源代码被编译的方法;即它的初始值是作为在构造符中的赋值来被编译的。通过观察其反编译后的输出结果,您能了解到不少
Java 编译器的工作方法。

反编译是困难的:不断重复       虽然 Mocha 的确可以反汇编您的目标代码,但它不会总是成功的。由于困难重重,没有一个反编译器能够准确无误地翻译出源代码,而且每个反编译器处理它们在翻译过程中的漏洞的方式也不同。举例来说,Mocha
有时在输出准确的循环构造的结构方面有一些问题。如果真的这样,它会在最终输出中使用伪 goto 语句,如清单 5 所示。

清单 5. Mocha 不能准确地反编译           if (i1 == i3) goto 214 else 138;           j3 = getSegment(i3).getZOrder(); 
         if (j1 != 1) goto 177 else 154;           if (j3 > k2 && (!k1 || j3 < j2)) goto 203 else 173;           expression 0           if (j3 < k2 && (!k1 || j3 > j2)) goto 203 else 196;           expression 0           if == goto 201           continue; 
         i2 = i3;

撇开 Mocha 的问题不谈,反编译器在通常情况下还是能比较准确地翻译出源代码。一旦知道了某一反编译器的弱点,您可以手工分析和转换反编译后的代码,以使它们能较准确地符合原始源代码。随着反编译器正变得越来越出色,

      我们又碰到了另外一个问题:如果您不想让任何人能反编译您的代码,那该怎么办呢?小编在此友情推荐:爱加密安卓破解技术有哪些?如何防反编译,讲解的还不错:http://www.ijiami.cn/newsInfo?id=289&v=3

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 09:36:15

分享:关于如何使用反编译器,获取源码清单方法的相关文章

关于如何使用反编译器,获取源码清单

关于反编译器      从概念上讲,反编译器使用起来非常简单.他就是把编译器逆过来用:你给它 .class 文件,它还给你一个源代码文件.       一些比较新的反编译器有精致的图形界面.但在一开始所举的例子中,我们将使用的是 Mocha,它是第一个公开的可利用的反编译器.在本文的最后,我会讨论一下在 GPL 下一个较新的反编译器.(请参阅参考资料,下载 Mocha 并获取 Java 反编译器的清单.)        让我们假设在目录中有一个名为 Foo.class 的类文件.用 Mocha

Linux内核源码分析方法

  一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写.编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内.如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码.通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一

获取 + 查看 Android 源码的 方法

Android源码获取方法. 作为一个Android开发者,必要的时候阅读以下源码可以拓宽一下自己的视野和对android的认知程度. Google的Android的源码管理仓库是用的是Git.Android是一个开源手机终端系统,基于Linux内核的. 1.下载一个Git客户端,我使用的是Git-1.7.0.2版本 下载地址:http://code.google.com/p/msysgit/ 2.windows下安装Git的客户端软件很方便,和普通软件一样.安装完成后,我们在电脑上建立一个文件

分享我写的IOCP:源码+思路

首先说明,下面的代码仅是一个IOCP的demo,很多地方的设计非常差,当然也有一些设计还算可以:).此篇仅供对IOCP有些了解但又不深入的.需要一个稍微完整示例的.对网络编程感兴趣的同学参考.点击这里下载代码 整个程序的流程如下: 流程完全是无阻塞的,主线程里,将收到的消息全都一次性取出后,然后派发.所有欲发送的消息都缓存起来,等到更新的时候一起发送.有些地方代码没有完善,比如断开连接后,socket.内存等资源的关闭回收.要注意MAXRECEIVEDBUFFLENGTH这个宏,它是定义每个so

【随笔】从gitHub上获取源码

有时候,需要从gitHub上获取源码,下面介绍几个方法: 1.获取链接: 打开gitHub代码库的页面,能在右边看到这个: 点击红圈里的标记,该链接就会复制下来. 然后,如果安装了小乌龟(TortoiseGit),就可以获取该源码了. 首先点击右键,选择小乌龟的选项: 然后在出现的窗口中粘上刚才复制的链接,以及选择主目录: 点击OK,现在,你就可以用小乌龟来获取源码或者上传源码了. 在Linux中,可以使用命令: git clone https://github.com/ajaxorg/ace.

分享》:关于阅读开源项目的源码思路方法

关于阅读开源项目的源码思路方法:<不喜勿喷> 一般开源项目, 如果这个项目你很熟悉经常用, 那么你直接从 main 入手没问题.. 如果你不熟悉或者代码量很大, 最好从代码的 example 代码 或者 client 的代码入手比较容易. 这些代码直接 gdb 进去就可以调试运行了, 客户端的功能搞清楚了,会用了, 恐惧感就降下去了, 再看服务端就容易了. 看 c 代码要 关注主体核心 struct , 整个server, client 可能都是围绕整个 struct 运行起来的, 这个str

轻松学习linux内核源码的方法

轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件组织:1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心. 本文基于稳定的2.2.5源代码,第二部分的实现平台为 RedHat Lin

Android中关联源码的方法

这里给大家介绍一个很方便的关联源码的方法. 1.打开Android SDK Manager.把你所使用的版本的API给下载下来,如下图所示... 2.关联源码时,将源码关联到对应API的目录,如: E:\开发者工具\android可能工具包\adt-bundle-windows-x86-20130729\sdk\sources\android-18 这时候,就能关联成功了... Android中关联源码的方法

asp.net core结合docker实现自动化获取源码、部署、更新

之前入坑dotnet core,由于一开始就遇到在windows上编译发布的web无法直接放到centos上执行.之后便直接研究docker,实现在容器中编译发布.然后就越玩越大,后来利用git的hooks实现自动实现git源码一收到push就自动化获取新代码并编译发布.最后为了方便复用,直接做成统一配置,因此不需要再次编写复杂的脚本配置.只需要打开配置文件,配置几项值,运行一个脚本就ok. 目前有两个版本,原始版本包括git项目的自动克隆.v1版本则把git的克隆抽了出来需要人工克隆一次.具体