我工作的地方,我们正在做大量的Java服务和客户用其它各种语言之间的远程对象转移的项目.鉴于我们目前的限制,我已经决定要看看它会采取基于现有的Java类代码.基本上,我需要一个.class文件(或它们的集合)解析字节码,以确定所有的数据成员,或许getter/setter方法,然后写的东西,可以在不同的语言输出的代码来创建一个类具有相同的结构.
我不是在寻找像JAD这样的标准反编译器.我需要能够获取.class文件并创建其数据成员和方法的对象模型.这有可能吗?
我正在努力寻找有助于我的管理层理解对编译的C代码进行逆向工程的难易程度的事实.
之前在这个网站上已经提出了类似的问题(参见例如,是否可以"反编译"Windows .exe?或者至少查看程序集?或者可能反编译用C编写的DLL?),但这些问题的要点是反编译编译的C代码"很难,但并非完全不可能".
为了促进基于事实的答案,我包含了一个神秘函数的编译代码,我建议这个问题的答案通过它们是否可以确定这个函数的作用来衡量所提出技术的成败.这可能是不寻常的,但我认为这是获得这个工程问题的"良好主观"或事实答案的最佳方式.因此,你最好猜测这个功能在做什么,以及如何做?
这是使用gcc在Mac OSX上编译的已编译代码:
_mystery:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movsd LCPI1_0(%rip), %xmm1
subsd %xmm0, %xmm1
pxor %xmm2, %xmm2
ucomisd %xmm1, %xmm2
jbe LBB1_2
xorpd LCPI1_1(%rip), %xmm1
LBB1_2:
ucomisd LCPI1_2(%rip), %xmm1
jb LBB1_8
movsd LCPI1_0(%rip), %xmm1
movsd LCPI1_3(%rip), %xmm2
pxor %xmm3, %xmm3
movsd LCPI1_1(%rip), %xmm4
jmp LBB1_4
.align 4, 0x90
LBB1_5:
ucomisd LCPI1_2(%rip), %xmm1
jb LBB1_9
movapd %xmm5, %xmm1
LBB1_4:
movapd %xmm0, %xmm5
divsd %xmm1, %xmm5
addsd %xmm1, %xmm5
mulsd …Run Code Online (Sandbox Code Playgroud) 我正在使用Intellij Idea 14大型java项目,其中编译了大量代码并且没有源代码.
据我所知Idea,无法在编译代码中进行搜索(如同eclipse),但它可以使用内置程序对单个文件进行反编译fernflower,这也可以通过编译代码进行调试.
有没有办法像Idea那样以同样的方式反编译所有已编译的代码并将其附加到项目中,这样就可以搜索"Project and Libs"而无需在反编译源中丢失调试功能?
我尝试使用Bytecodeviewer不同的fernflower选项,但结果是在附加反编译源后调试被破坏(显示错误的行).
我正在尝试对Android游戏进行逆向工程,以找出其计算背后的逻辑.
提取.apk文件后,/ assets/lua文件夹中有lua脚本,所有文件都有.lua扩展名.但是,如果使用Text/HEX编辑器打开,则它们不是人类可读的.
例如:这个文件
所有文件的内容以"droi.lua"签名结尾,让我觉得这不是LUA脚本,而是Android的某种压缩LUA脚本.而且Android有一种压缩文件用于发布的机制.
有谁之前经历过这个吗?有没有办法让这种文件可读?
是否有任何方法/程序可以解压缩从.apk资产中提取的文件(例如png,lua等)?
那么反编译器真的是一个给出编译/解释代码片段的源码吗?因为对我来说听起来不可能.如果编译它,你将如何得到函数,变量,类等的名称.还是我误解了这个定义?它是如何工作的?制作一个人的一般原则是什么?
我有一个错过了一行代码的.Net dll.我想补丁那个DLL,但我没有源代码.我该怎么办?有谁知道修补这样的快速方法?
我已经在互联网上扫描了各种相关问题(比如http://www.java-decompiler.com/),特别是SO.到目前为止,我只能找到两个声称是最新的Java反编译器--JD-GUI和DJ Java Decompiler.
所有其余的都无法下载或停止使用.
因此,我使用包含AspectJ weaven代码的.class文件,并使用两个可用的反编译器对其进行反编译.观察结果:
JD-GUI:

DJ Java Decompiler:

正如您所看到的,这两个工具都无法使用AspectJ反编译Java代码.
现在我不是太挑剔,我只是习惯了.NET Reflector并在Java反编译器中寻找相同的质量,无论是独立的还是Eclipse插件,免费或商业.
我正在寻找一个实际可行的,并且使用方便.
对我的问题的回答的总体趋势是这样的 - "嗯,你想要什么?虽然,AspectJ创建有效的JVM字节码,但这个字节码不能被翻译成有效的Java".我只能说我不赞成这种观点.
让我向您介绍更多背景信息,我希望您同意这些工具可以而且应该做得更好.
反编译的Java类使用以下方面是weaven:
public abstract aspect LoggingAspect {
declare parents: (@LogMe *) implements ILoggable;
public Logger ILoggable.getLogger() {
LoggerHolderAspect holder = LoggerHolderAspect.aspectOf(this.getClass());
return holder.getLogger();
}
abstract pointcut loggedMethods();
before(ILoggable o): loggedMethods() && this(o) {
logBefore(o.getLogger(), thisJoinPoint);
}
after(ILoggable o) returning (Object result): loggedMethods() && this(o) {
logAfterReturning(o.getLogger(), thisJoinPoint, result);
}
after(ILoggable o) throwing (Exception e): …Run Code Online (Sandbox Code Playgroud) 我用的是VS2012.
我知道如何使用.NET Reflector调试第三方代码并始终使用它.
我想知道是否可以使用JetBrains的dotPeek或没有dotPeek的R#本身.我能够导航到反编译的第三方代码,但不能单步执行它.
有任何想法吗?
有时您需要在应用程序本身中存储密码,例如用于与您自己的服务器通信的用户名/密码.在这些情况下,不可能遵循存储密码的正常过程 - 即散列密码,存储散列,与散列用户输入进行比较 - 因为您没有任何用户输入来比较散列.密码需要由应用程序本身提供.那么如何保护APK中存储的密码呢?如下所示的密码生成功能是否合理安全?
纯文本:
String password = "$()&HDI?=!";
Run Code Online (Sandbox Code Playgroud)
简单的混淆:
private String getPassword(){
String pool = "%&/@$()7?=!656sd8KJ%&HDI!!!G98y/&%=?=*^%&ft4%(";
return pool.substring(4, 7) + pool.substring(20, 24) + pool.substring(8, 11);
}
Run Code Online (Sandbox Code Playgroud)
我知道ProGuard有一些混淆功能,但我很好奇上面的"混淆"技术在编译时会做什么,以及通过查看APK和/或使用其他更复杂的东西来弄清楚它有多难技术?
有没有办法反编译一个DLL和/或.pyd文件,以提取用Python编写的源代码?
提前致谢
decompiling ×10
java ×3
android ×2
c# ×2
dll ×2
.net ×1
assembly ×1
bytecode ×1
c ×1
compression ×1
debugging ×1
decompiler ×1
extraction ×1
lua ×1
obfuscation ×1
pyd ×1
python ×1
resharper ×1
x86 ×1