java反编译工具具能反编译出注释吗

当前访客身份:游客 [
当前位置:
关于反编译器& && &从概念上讲,反编译器使用起来非常简单。他就是把编译器逆过来用:你给它 .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 的源代码& && && && & 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& && && &&&& && && &&&i2 = i3;
& && &撇开 Mocha 的问题不谈,反编译器在通常情况下还是能比较准确地翻译出源代码。一旦知道了某一反编译器的弱点,您可以手工分析和转换反编译后的代码,以使它们能较准确地符合原始源代码。随着反编译器正变得越来越出色,
& && &我们又碰到了另外一个问题:如果您不想让任何人能反编译您的代码,那该怎么办呢?小编在此友情推荐:爱加密安卓破解技术有哪些?如何防反编译,讲解的还不错:
共有1个评论
<span class="a_vote_num" id="a_vote_num_
随着反编译器正变得越来越出色,
更多开发者职位上
有什么技术问题吗?
科技创造的其它问题
类似的话题项目过程中需要反编译一个jar包,于是作了一些学习,记录下来。
(JAva&Decompiler)是一个Java的反编译器,可以通过命令行把Java的class文件反编译成源代码。
如果你在使用编写代码的时候遇到找不到源代码的第三方库,而且你又需要看看这个库的具体实现,那么你就需要使用这个东西。而且如果你是使用Eclipse的话,还有一个Eclipse插件,提供一个class文件查看器可以直接打开class文件查看其反编译后的源代码, 太方便了,太方便了!
不过,可惜的是这个开源项目似乎已经关闭了,官方网站已经上不去了,有个叫Tomas Varaneckas的好心人收集了所有的版本提供给大家下载:
而且这个最新的版本也只支持Java 4,不支持Java 5。还有一个叫做的工具支持Java 5的新特性,如enum等,而且它提供独立的GUI程序和基于Eclipse的插件,也很方便。但是对于,作者没有提供下载的链接,他说&Open the sources of JD-Core is not on my roadmap: I spent too many time on this project.&当然后面也有一大篇文章是别人用来骂他的,可以看,蛮有意思。
我的项目中需要将第三方库反编译出来,让后对其进行修改,然后再编译,不仅仅是查看,因此只能用命令行的Jad来做。
使用方法:
[1]&反编译一个class文件:jad example.class,会生成example.jad,用文本编辑器打开就是java源代码
[2]&指定生成源代码的后缀名:jad -sjava example.class,生成example.java
[3]&改变生成的源代码的名称,可以先使用-p将反编译后的源代码输出到控制台窗口,然后使用重定向,输出到文件:jad -p example.class & myexample.java
[4]&把源代码文件输出到指定的目录:jad -dnewdir -sjava example.class,在newdir目录下生成example.java
[5]&把packages目录下的class文件全部反编译:jad -sjava packages/*.class
[6] 把packages目录以及子目录下的文件全部反编译:jad -sjava packages/**/*.class,不过你仍然会发现所有的源代码文件被放到了同一个文件中,没有按照class文件的包路径建立起路径
[7] 把packages目录以及子目录下的文件全部反编译并建立和java包一致的文件夹路径,可以使用-r命令:jad -r -sjava packages/**/*.class
[8] 当重复使用命令反编译时,Jad会提示&whether you want to overwrite it or not&,使用-o可以强制覆盖旧文件
[9] 还有其他的参数可以设置生成的源代码的格式,可以输入jad命令查看帮助,这里有个人做了简单的翻译:
[10] 当然,你会发现有些源文件头部有些注释信息,不用找了,jad没有参数可以去掉它,用别的办法吧。
最后,jad不能直接反编译jar包,直接解压了再反编译吧(这个方法很显然,我实在不好意思写出来)。
阅读(...) 评论()&&&&jd-gui反编译后注释清除工具
jd-gui反编译后注释清除工具
清除jd-gui反编译后注释的工具
图形界面操作方便,在java环境下双击jd-gui-cleaner.jar运行后,先点input,选择源文件文件夹,再点output,选择输出文件文件夹,最后点start运行,运行后会将所有源文件夹中的文件处理后保存到输出文件夹中,并处理且只处理.java文件。
原理很简单,用java的正则表达式清理每个文件中的jd相关的注释。
若举报审核通过,可奖励20下载分
被举报人:
mamaipi124
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
开发技术下载排行为什么有些语言可以被反编译?而有的不能?
按投票排序
要理解这个问题,先要看「正」编译的过程是怎样的。你有一个想法,这是一种人类自然语言可以表达出来的东西。你利用编程技能,把它「翻译」成你熟悉的一种编程语言:然后编译器(compiler)将它翻译成机器所能理解的语言:这中间的每一步都是一个「信息丢失」的过程。比如你说,我要把这些数排个序。然后你轻车熟路地写了个冒泡排序。你的原始动机其实已经一定程度上从你的代码里丢失了——有经验的人可能可以一眼看出你这段代码是在排序,而新手小明看到的只有一些for和if之类的东西。如果是更复杂的功能,那么可能过一段时间你自己都看不懂自己当时是想干什么。从程序语言到机器语言的过程其实也是一样的。这两个过程其实都是把「做什么」转换成「怎么做」的过程,转换完成之后,究竟一开始是要做什么,这个信息已经丢失了。所谓「反编译」,其实就是找回这些丢失的信息的过程。从这个角度上来说,你阅读一段代码的过程,其实就是在将它「反编译」成自然语言。如果要完美地反编译,那只存在一种可能,就是信息完全没有丢失——比如说你阅读的这段代码有充分的注释,或者它使用了一种你所知晓的模式(这也是为什么大家一再强调注释和设计模式的重要性)。对于从机器语言到程序语言的反编译过程,也是一样。比如说有比反编译更低级(非贬义)的过程,叫做反汇编:严格来说汇编语言也是一种编程语言,不过我们在这里把它和我们常说的高级编程语言(包括C语言)区分开。这个步骤里,我在汇编和机器语言里使用的是双向实线箭头,因为它们是可以互相转换的。从汇编语言到机器语言的过程中没有丢失任何信息——因为两者的指令是一一对应的,因此反汇编可以轻松达成。这就是很多程序语言只能反汇编、不能(难以,下同)反编译的原因。一般我们管这种语言叫「编译语言」,又称「原生语言」。代表有C、C++等。那为什么有的语言可以反编译呢?这又要从机器语言说起。就像不同地域的人所用的语言不同一样,不同的机器说的语言也不尽相同。用行话说,叫「指令集不同」。比方说,你的电脑和你的手机,指令集一般是不一样的。一段程序要让不同的机器都能执行,只能分别翻译(编译)成相应的机器语言。这个过程太麻烦了,于是人们想了个办法,搞出了一种叫解释语言的东西(此处未考证解释语言是否就是因此发明的,只是帮助理解)。解释语言的整个流转过程是这样的:解释语言有两种执行方式,这取决于执行端的「解释器」是如何工作的。一种是直接解释执行,中间就没有机器语言什么事情了,但这种方式效率很低。因此现代的解释语言基本上都会采用第二种方式,也就是经由图中上部的路径,先通过JIT编译的方式翻译成机器语言,然后再执行,保证执行效率。JIT编译大致可以理解为「我需要用到什么就编译什么」,这个过程常常是在执行过程中同步进行的。「解释器」的英文interpreter,其实就是名词「翻译」的意思。这好比你国外交部发了封文件到各国大使馆,再由大使馆的工作人员分别翻译成相应的语言,传达给目标国相关部门。代表性的解释语言如Javascript,它要在不同机器的浏览器上都能正确执行,所以采用这种方式。但是这样一来,程序代码就必须提供给每一台执行端机器了。这可是泄密啊。对于防止泄密,最直接的方式自然是加密。有锁就有钥匙,同时也有开锁术;有加密也就有破解。这时候所谓的「反编译」,其实就是破解加密算法。这一点就不展开聊了。后来,人们觉得解释语言执行得实在有点慢,于是又想了一个办法:把一些可以前期做掉的工作先做掉,只留着那些跟目标机器有关的工作,到时候再说。于是程序被处理成了一种叫做「中间语言」,或者叫「字节码」的东西:这个过程一般也叫做编译。中间语言词汇少,比较精炼,执行起来也更快。这些语言一般也会用上JIT技术,进一步把中间语言编译成机器语言(而非解释执行),执行效率也就跟那些原生的编译语言不相上下了。这种语言代表性的有C#、Java等。程序语言可以编译成中间语言,反过来,中间语言也可以在一定程度上反编译成程序语言。这是因为采用这种编译方式的编程语言为了保证它们的高级特性(比如说反射),在编译的过程中保留了源程序的绝大部分信息,只有很少的信息丢失;也正是因为丢失了这一部分信息,中间语言通常不能完美地反编译——最常见的就是反编译出来的程序中局部变量的名字都丢了,被替换成了由反编译器自动生成的名字。但这样反编译出来的程序,结构和功能都是完备的,可读性也有一定的保障。一般来说,我们所说的可以反编译的程序都是指这样一类语言写就的程序。中间语言可以被反编译;加密又会被破解,而且执行前还要解密,会带来额外的性能开销。有没有办法能让代码既能有效执行,又不被截获代码的人所利用呢?这时候人们从一些职业素养很差的程序员那里得到了启发。实现一个相同的功能,可以有无数种形式的代码。你恪尽职守,认认真真地写注释,准确地命名函数和变量, 严格按照规范进行缩进和换行;小明却相反,完全没有注释,变量全部用abcd乃至故意误导别人(var mySon = laowang.Son),缩进换行邋遢,尤其是在大括号前不换行,让大家很不满。于是老板想,我们先把小明开除掉,然后给你发奖金并要求大家按照你的方式写代码,并且开发一个工具,唤作「混淆器」,在发布时再把代码处理成小明写的那种样子:这样代码即使被反编译和解密了,别人看也看不懂,不小心还会被带到坑里去。代码毕竟是写给人看的,只是偶尔让机器跑一跑,所以没有可读性的代码是没有价值的。这种方法一出,广受好评,于是变成了一种非常普遍的做法。注意图中省略了中间代码和JIT的步骤,混淆通常会跟这些技术一起使用。
回答一下一个比较specific的问题:为什么C不容易反编译。首先,明确定义一下问题。反编译的input是可执行程序,在这个帖子里我会叫它binary。output是C代码。binary是电脑执行的一行行指令。所以我们会想,先把binary还原成指令。这个过程叫做disassembling,还原出的指令叫做disassembly。Disassembly是很难全对的。几乎不可能。这个看似简单的动作其实很复杂。一般是两种方法,动态和静态。动态方法是,让计算机跑程序,跑了什么记录下来。但是你怎么知道计算机把程序跑全了呢?静态方法是,不让计算机跑,而是让计算机读这些指令。binary会有entry point,然后你就知道从binary的哪里开始读啦,然后就一行行读呗。但是,仍然会有你读不到的地方。entry point一般是main()的第一行,然后main读完了你读哪里?有些function可能main根本没调用。别说反汇编,即使把一个binary里面的函数都找全找对都很难。在此卖一下自己的paper: . 里面有一个section介绍了万恶的optimization会把function变成什么样的恶心的代码。然后,即使Disassemble完了,之后要做的是还原各种变量。同样很难,目前为止几乎不可能。有两方面的工作要做。一个叫做variable recovery, 一个叫做type recovery。一般做这两部之前会把disassembly再转化成另一种中间语言。这样做的目的是把一些有side effect的指令中那些隐藏信息都explify出来,比如,你在做加法的时候有可能会影响那些flag寄存器,通过中间语言,“这些寄存器可能也会被改变”这样的信息就会明确表达出来。有可能一条disassembly对应几条中间语言的语句。还原完变量和变量的type,就要开始还原程序的真正结构了。还原真正结构还是很难完全正确。比如这样的一个control flow graph:x &-|
|x &-----|
|x_____||v...这种结构只能用goto语句来表达。evaluate反编译的其中一个指标是goto指令。反编译越少使用goto指令,说明结构更明晰,也就被认为反编译的效果更好。但是这个指标是有问题的,稍后再说。类似于上面的很难用for/while循环和if-then-else表达的结构在现实的binary中很多。嗯,最后再说反编译的evaluation问题。首先,goto语句的多少并不能完全客观地衡量反编译的效果如何。有可能源代码自带goto呀,有可能源代码其实写的时候很挫啊,你反编译完还优化了本身的代码能。谁能定夺?其次,很难有自动的办法来评价本来的代码和反编译完的代码是equivalent的。如果原来的代码是while,反编译完的代码用for,是不能说反编译完是错的。所以反编译的evaluation也一直是一个值得探讨推敲的话题。就酱。写得比较散比较跳,大家见谅。
以C语言为例,主要还是因为做编译器的人压根就没想过要把汇编变回源代码。否则,假如设计之初就考虑了做编译器的时候同时做一个反编译器,最后做出一个C语言的编译器和反编译器,这个编译器编译出来的汇编能够较好的还原成源代码,是完全可能的。包含在ELF文件里的符号就有类似这样的功能,能帮助人们更好的调试理解已经编译成二进制的程序。
并不是不能被反编译,只是还没发明一个通用的反编译算法。你把一个东西交给人,人花一些时间,总可以给你还原出代码的
不是有symbol来弥补你调试时的信息吗?
因为写编译器的人把人能看懂的东西翻译成机器语言就已经非常不容易了,而且过程中间丢弃了非常多的信息,没人想过要翻译回来。能反汇编的一般都是跑虚拟机的,有中间语言,所以简单。
这么说吧程序语言,是给人设计的,叫做高级语言机器跑的东西,可以叫做低级语言编译就是高级到低级,从你能看懂,到你看不懂(适合机器执行)反编译,就是从低级到高级举个例子,ceylon -& .java -& .class -& 机器码编译,一般是从人写的语言,到机器语言,这中间的过程中,不但会丢失很多信息(代码结构),有些优化会导致代码语义的改变所以总体来说,在这个链上往回走的越远,越难恢复这是原因12、链上的每一步,抽象级别跨度越大,越难反编译像jvm的二进制码反编译就很容易,但是到了机器码,由于和人能看懂的语言抽象过于不同,所以非常难反编译3、即使有现成的工具和算法,反编译出来的和原来长的大概率是不一样的
c还算好的,在编译语言里面,算是原代码与汇编对应关系比较明确的了。也就是变量的名字擦除了,不过慢慢猜就可以了。你去看看c++,就属于背后的黑魔法比较多的。然后再来看看jvm code。你会发现,它的每个局部变量和参数都有个专用的区域。每个变量的操作都有个load-操作-store的过程。这样每条原代码对应的中间代码就清楚很多。当然c语言也可以那样写,但是性能会下降,语句数量会多一些,就失去本来的优势了。
谢邀,面向一切输入的通用反汇编问题就是停机问题,是做不到的
有些函数存在单值反函数,而有些函数却不存在。
简单说,食物变翔很容易,反之则困难,,当然也有例外,比如金针菇~~
应该先问是不是再问为什么?混小本论文时发现一句话,其实都是可以反编译的,但反编译出来的东西和源头差距有多大就没人知道了。因为它不是个一对一的字典翻译。比如:汇编里一个的跳转表,死啃几个小时发现是个switch case。下次再看另一个却是虚函数表。再比如:跟踪一个烦人的函数半天不知它在做什么,偶然看到它访问的数据内容,才知道它是某开源库里的md5实现。所以,翻译(反编译)到哪种地步才算是到位?哪种程度算“能反编译”,哪种算“不能”?
楼主的意思是解释型语言被混淆之后没法弄回来吧?正常编译软件流程是一个现代编译器的主要工作流程如下:
(source code) →
(preprocessor) → (compiler) →
(assembler)(这两个过程疑似wikipedia写错了) →
(object code) →
(Linker) →
(executables) from 你拿到C++的2进制文件,可以变成汇编文件,但是解释型的语言直到运行的时候才翻译成机器码的,比如python给终端用户的其实是混淆后的代码(简单的打个包)或者根本就是原来的源代码,本来就没被编译过,就无所谓反编译了。
都能被反汇编呀,因为不管用什么技术防破解,一个程序始终是要加载到内存被CPU执行的。然后通过分析汇编代码能(非100%)还原出开发语言的代码。VB反编译工具(VB Decompiler Pro)10.0 绿色汉化破解版-东坡下载
东坡下载:内容最丰富最安全的下载站!|||
→ VB反编译工具(VB Decompiler Pro) 10.0 绿色汉化破解版
VB反编译工具(VB Decompiler Pro)介绍
PS:先双击导入注册表信息即可完成破解。 如果不行请用注册机进行破解注册。由于软件是采用的文本语言资源,所以仅汉化文本语言还是无法达到全部汉化,抱歉!
VB Decompiler Pro Visual Basic能编译程序为p-code或native code形式的EXE, DLL或OCX文件. VB Decompiler Pro 能反编译Visual Basic 5.0/6.0的p-code形式的EXE, DLL 或 OCX文件。对native code形式的EXE, DLL或OCX文件,VB Decompiler Pro 也能给出反编译线索。如果一个程序被编译成native code, 从机器码恢复源代码是几乎不可能的. 但即便是这种情形下VB Decompiler还是可以帮助你分析程序. VB Decompiler包含了一个强大的支持包含MMX和SSE的Pentium Pro指令集的反编译器. 它还包含一个代码分析器, 用于搜索所有API调用,汇编代码中的字符串引用并将结果修改为相应的注释.标准版及专业版VB Decompiler的功能介绍LitePro通用脱壳(支持UPX, NSPack以及一些其他常见的可执行文件压缩壳)反编译窗体(frm和frx)以及用户控制(ctl)对象文件完整的伪代码p-code反编译(解析操作码并转换为标准vb指令,反编译GUID对象)两种伪代码反编译模式(包含堆栈解析或不包含堆栈解析)反汇编native code过程(使用强大的Pentium Pro反汇编器,支持MMX及FPU指令集)反汇编native code过程中的字符串引用以及API调用(使用强大的Pentium Pro反汇编器,支持MMX及FPU指令集)部分反编译native code(使用代码仿真引擎)在反编译的代码中根据语法显示不同的颜色字符串引用列表以及搜索引擎快速反编译VB5/6程序的混淆工具VB5/6程序的修补工具将反编译的数据保存入单个DB文件反编译.Net程序将所有的过程列表保存入, IDC脚本或是HIEW的Names文件价格&
VB反编译相关软件
电脑版相关
手机版相关
(11)个资源
(74)个资源
VB反编译工具(VB Decompiler Pro) 10.0 绿色汉化破解版
黑龙江齐齐哈尔联通 网友 客人 发表于:
牛!就是保存窗体的时候有点问题,建议手动保存吧。
5KB / 06-25 / 1.0 绿色最新版 【含反光滑动特效】
7.7M / 06-03 / 1.0 免费最新版 【2015无广告享vip特权】
38KB / 07-05 / 1.0.9.0 绿色免费版
26KB / 04-25 / 0.5.0.2 中文绿色版
849KB / 08-27 / 1.024 绿色免费版
本类软件排行
装机必备软件
编程编译数据设计}

我要回帖

更多关于 c 反编译工具 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信