那么反编译器真的是一个给出编译/解释代码片段的源码吗?因为对我来说听起来不可能.如果编译它,你将如何得到函数,变量,类等的名称.还是我误解了这个定义?它是如何工作的?制作一个人的一般原则是什么?
我在网上发现了一个Flash程序,非常适合我正在进行的项目.显然,通过Web内容,您通常可以使用浏览器查看您可能正在查看的任何HTML,PHP等的源代码.但是当谈到Flash时,我们似乎在查看源代码方面处于黑暗状态.
有没有办法查看您下载的Flash swf的源代码?
注意:至于窃取Flash代码是否在道德上应该受到谴责,或许这更适合于另一个问题.
背景: 我们已经获得了一个在Visual Studio中构建为32位Windows应用程序的软件产品.我们希望将此应用程序移植到64位.
此代码的关键任务组件是最初由第三方使用gFortran构建的黑盒静态库(.a文件).原来的开发人员已经过世了,我们能够获得的Fortran源代码不完整,而不是该库构建的版本(并且包含编译库中不存在的关键错误).他们没有使用VCS.
问题: 我想创建一个64位静态库,其代码在功能上等同于我们拥有的32位静态库.
我试过的:
IntelliJ 结合了 Fernflower,一个由 JetBrains 制作的 Java 反编译器。
在其GitHub 页面上,您可以阅读以下内容:
Fernflower 是第一个实际工作的 Java 分析反编译器,一般来说可能是一种高级编程语言。
这是什么意思?什么是解析反编译器?它与其他类型的反编译器有何不同?
考虑这个(恕我直言)简单的例子:
public class DecompilerTest {
public static void main(String[] args) {
Object s1 = "The", s2 = "answer";
doPrint((Object) "You should know:");
for (int i = 0; i < 2; i++) {
doPrint(s1);
doPrint(s2);
s1 = "is";
s2 = new Integer(42);
}
System.out.println();
}
private static void doPrint(String s1) {
System.out.print("Wrong!");
}
private static void doPrint(Object s1) {
System.out.print(s1 + " ");
}
}
Run Code Online (Sandbox Code Playgroud)
在没有调试信息的情况下用源/目标级别1.1编译它(即不应存在局部变量信息)并尝试对其进行反编译.我尝试过Jad,JD-GUI和Fernflower,他们都至少有一个错误的调用(即程序打印"错误!"至少一次)
真的没有java反编译器可以推断出正确的强制转换,以便它不会调用错误的重载吗?
编辑:目标级别1.1,以便不存在特定于Java6的快速验证信息.这可能会给反编译器一个线索,即s1已被声明为Object而不是String.即使没有这些信息,反编译器也应该能够反编译代码(不一定得到原始变量类型,但显示相同的行为),特别是因为许多混淆器也将它剥离.
反编译器出了什么问题:
(Object)在第一次通话中错过了演员.s1要String …我在一个运行Java应用程序的平台上工作.这些应用程序经常被混淆,大多数都使用ProGuard,这使得我们平台的调试问题非常困难.
目前我正在使用JD(http://java.decompiler.free.fr/)对这些应用进行反编译.JD做得不错,但有时候生成的代码太难理解了.
这似乎主要是因为混淆工具利用较少约束的JVM字节码规范来生成有效的字节码,而不会映射回有效的Java代码(例如:积极的重载).
所以,我的问题是:是否有专门用于处理混淆字节码的反编译器?
我试图在反编译代码中设置一个条件断点,但Eclipse不断给我错误:
条件断点有编译错误
原因:评估必须包含表达式或格式良好的语句块
我的情况非常简单,只是尝试与字符串值进行比较.我已经尝试了以下所有内容,但每个单独出错都会出错:
myObj.toString() == "abc123"
myObj.toString().equals("abc123")
if(myObj.toString() == "abc123"){ return true; }
true == true
Run Code Online (Sandbox Code Playgroud)
我也尝试过在行尾添加或不使用分号的每种组合,以及间距和换行符的每种组合以及包含或不包含{}的每种组合.基本上,我不知道为什么这不起作用......
我试图调试的代码是在一个用JD-Eclipse反编译的jar中.正常断点在此代码中正常工作.
有谁知道这里发生了什么?
我看到一些java反编译器可以将字节码反编译成可读的java源代码,我想知道来自java(不是其他JVM语言)的所有字节码是否可以再次反编译为java源代码?
更新
对不起,让我更清楚地提出问题.
刚谈谈JVM上的普通Java代码(没有Android,没有字节码增强,没有AOP,没有混淆),我实际上希望字节码可以被反编译.但是我不知道是否有编译成字节码的java代码形式,永远不能被反编译成可读的java源代码.
我正在为一种简单的脚本语言编写一个反编译器.这就是我所做的:
基本块
创建了一个基本块的集合,如下所述:
http://www.backerstreet.com/decompiler/basic_blocks.php
控制流图,支配树和循环集
由此我可以创建控制流图.
http://www.backerstreet.com/decompiler/control_flow_graph.php
从CFG我创建了支配树,这反过来允许我在CFG中找到循环集,如下所述:
http://www.backerstreet.com/decompiler/loop_analysis.php
这是一张包含我目前所有数据的图片:

构造循环
我的下一步应该是:
http://www.backerstreet.com/decompiler/creating_statements.php
这就是我的问题所在,因为我完全陷入困境.在我给定的数据中,结构化循环算法将如何应用?我不明白为什么它首先尝试将所有内容组织为do while循环 - 在我的示例中,这意味着块3中的"temp5_14 = temp5_14 + 16"将始终至少执行一次,这不是原始代码所执行的操作一点都不
这怎么可能,以及将它从do-while转换为while循环的下一步如何实际工作?对于在块6中结束的循环3,这看起来应该是一段时间(true) - 但是当它的head块是if语句时,它如何与算法一起工作?
TL; DR - 有人请举例说明"结构化循环"算法是如何工作的.
据我所知,apktool 和 baksmali 都能够从 .apk (.dex) 文件中生成 smali 代码,而 apktool 使用了 dexlib2。它们都是APK打包/解包工具
但是我仍然不清楚apktool 和 smali/baksmali 之间的主要区别是什么。在 .dex 文件和扩展功能的功能方面?
PS:我刚刚发现的一个区别是 apktool 能够处理一个 apk 中的多个 dex 文件,而 baksmali 不能(至少目前是这样)
我确实尝试过阅读源代码,但由于缺乏经验,我无法真正理解这两个工具的工作流程。如果有人可以建议一些阅读材料或流程图等,我将不胜感激。
谢谢!
decompiler ×10
java ×4
bytecode ×2
decompiling ×2
32bit-64bit ×1
android ×1
apache-flex ×1
apktool ×1
assembly ×1
breakpoints ×1
c++ ×1
debugging ×1
eclipse ×1
flash ×1
jad ×1
jvm ×1
proguard ×1
smali ×1
x86-64 ×1