与反编译本机x86二进制文件相比,为什么将.NET IL-code反编译为源代码如此容易?(Reflector在大多数情况下都会生成相当好的源代码,而反编译C++编译器的输出几乎是不可能的.)
是因为IL包含大量元数据吗?或者是因为IL是比x86指令更高的抽象?我做了一些研究,发现了以下两篇有用的文章,但它们都没有回答我的问题.
我正在研究以前开发的软件,源代码编译为linux共享库(.so),源代码不存在.有没有可以从linux共享库中提取源代码的工具?
谢谢,拉维
在安全性和设计准则去大篇幅概述的各种方法,使之更加难以攻击者危及应用内结算的实施.
特别值得注意的是.apk,即使通过Proguard进行模糊处理,对文件进行反向工程也是多么容易.因此,他们甚至建议修改所有示例应用程序代码,尤其是"已知入口点和出口点".
我发现缺少的是在单个方法中包含某些验证方法的任何引用,例如Security.verify()返回的静态boolean:一个好的设计实践(减少代码重复,可重用,更容易调试,自我记录等)但是所有攻击者现在需要做的就是找出那种方法并让它始终返回true......所以无论我使用它多少次,延迟或不延迟,随机或不随意,它都无所谓.
另一方面,Java没有像C/C++那样的宏,它允许减少源代码重复,但没有verify()函数的单个退出点.
所以我的问题:
众所周知的软件工程/编码实践与所谓安全设计之间是否存在内在争用?(至少在Java/Android /安全交易的背景下)
可以采取哪些措施来缓解"安全设计"的副作用,这种副作用似乎是"在脚下拍摄"过度复杂的软件,这些软件本来可以更简单,更易于维护和更容易调试?
你能推荐一些好的资料来进一步研究这个课题吗?
不幸的是,我丢失了我使用ProGuard混淆的一个应用程序的源代码.
我仍然有.apkProGuard生成的文件和一些配置文件:
dump.txtmapping.txtseeds.txtusage.txt到目前为止我做了什么?
如果我现在使用JD-Gui查看源代码(.jar文件),我会看到我的混淆代码.像这样的东西:
class c {
TextView a;
TextView b;
TextView c;
TextView d;
CheckBox e;
}
protected List a(Uri[] paramArrayOfUri) { ... }
protected void a(List paramList) { ... }
Run Code Online (Sandbox Code Playgroud)
还有一些循环看起来有点奇怪.我不写无限循环:
while (true) {
if (!localIterator.hasNext())
return localArrayList;
ProviderInfo[] arrayOfProviderInfo = ((PackageInfo)localIterator.next()).providers;
if (arrayOfProviderInfo == null)
continue;
int i = arrayOfProviderInfo.length;
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用任何ProGuard的.txt文件将混淆的代码重新映射到我的原始源代码?我想看看我自己的变量名称/方法签名.
或者这些文件只能用于跟踪崩溃报告堆栈跟踪?
我真的很难找到一个好的工作Lua字节码反编译器.我正在尝试反编译我在游戏中发现的一些脚本文件,但它们似乎是编译的,但似乎无法解码.反编译Lua二进制文件的最佳工具是什么?
我已经反编译了一个使用新的Java 7字符串切换功能的非常简单的类.
班级:
public class StringSwitch {
public static void main(String[] args) {
final String color = "red";
switch (color) {
case "red":
System.out.println("IS RED!");
break;
case "black":
System.out.println("IS BLACK");
break;
case "blue":
System.out.println("IS BLUE");
break;
case "green":
System.out.println("IS GREEN");
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
针对此类运行Java 7"javap",会生成一组有趣的指令(完整的反汇编代码可在此处获得):
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=4, args_size=1
...
12: lookupswitch { // 4
112785: 56
3027034: 84
93818879: 70
98619139: 98
default: 109
}
56: aload_2
57: ldc …Run Code Online (Sandbox Code Playgroud) 考虑这两种方法:
public static void forLoop(int start, int limit) {
for (int i = start; i < limit; i++) {
}
}
public static void whileLoop(int start, int limit) {
int i = start;
while (i < limit) {
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
编译时,它们会产生字节码(这是详细的输出javap):
public static void forLoop(int, int);
descriptor: (II)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=2
0: iload_0
1: istore_2
2: iload_2
3: iload_1
4: if_icmpge 13
7: iinc 2, 1
10: goto 2
13: return
LineNumberTable:
line …Run Code Online (Sandbox Code Playgroud) 这可能是一个新手问题,但我会尝试创建一个有趣的辩论。
我知道有一些用于 API 基本身份验证、API 密钥、OAuth 2.0 的身份验证方法……所有这些方法都会在请求中添加标头或 formData 参数。
尽管您使用 SSL,但破解移动应用程序“通常很容易”(我现在正在考虑使用 Android:反编译应用程序、更改清单以允许自定义 SSL、再次编译并通过 SSL 代理嗅探所有请求)。
在这些请求中,我发现了很多身份验证密钥,我可以在控制台的其他调用中使用它们,毫无问题地模拟应用程序。
所以,现在我已经在移动应用程序中破解了一些 API,我的问题是:有没有办法保护移动应用程序中的 API?
我想知道一个安全层会限制每个“密钥”的请求数量。
我错了吗 ?我错过了什么吗?这是一个愚蠢的问题吗?
任何人都可以推荐一个好的BAML反编译器/查看器,除了反射器的BAML Viewer插件,它不处理路径几何/数据?