我曾经使用 dex2jar 反编译了某一个Android 应用.
然后,导入 Jar,然后一些类可以正常使用,OK
但是,仔细检查发现了问题:
就是反编译后的结果与应用之前计算的结果不同.
比如如下反编译后的EncryptUtil 类中方法:
public static String toParam(String var0, String var1) {
try {
String var3 = "param=" + of_encrypt(var0, var1) + "¶m2=" + getMd5_2(var0);
return var3;
} catch (Exception var4) {
return "param=error¶m2=error";
}
}
对于以下代码:
System.out.println("myAllParams="+EncryptUtil.toParam(originalParam1,xxdm));
System.out.println("myAllParams2="+EncryptUtil.toParam(originalParam1,xxdm));
System.out.println("myParam2_1="+EncryptUtil.getMd5_2(param));
System.out.println("myParam2_2="+EncryptUtil.getMd5_2(param));
按道理,也就是 toParam 方法调用之后的 param2的结果, 应该与 直接调用 getMd5_2的结果一样,
可以结果确不是一样的.
上面代码输出如下:
myAllParams=param=2tb3nq2qay2o2s45ch2mqawf2twpf52pqe5m1vc4lm1ltd391o6vsm1oseh62ojcs92ridda1tjxn41r68rl1pz0hl2qbqoo2s4j8q2hdhkv291ui72il9zc003erq¶m2=6d749a8bf841a5d3d772832367d5c0e6
myAllParams2=param=2tb3nq2qay2o2s45ch2mqawf2twpf52pqe5m1vc4lm1ltd391o6vsm1oseh62ojcs92ridda1tjxn41r68rl1pz0hl2qbqoo2s4j8q2hdhkv291ui72il9zc003erq¶m2=6d749a8bf841a5d3d772832367d5c0e6
myParam2_1=7aac8cb9cdf9898077a262d324dd86b5
myParam2_2=7aac8cb9cdf9898077a262d324dd86b5
但是其实上面对于 param2的计算都是错误的
正确的计算结果 ,也就是原来应用的计算结果是:
param2=338f3b6b250342cc5b1117a6346b0c89
直接从反编译出来的代码看不出是什么导致了问题:
但是感觉 调用toParam 跟直接调用 getMd5_2有差别
于是尝试分析最原始的 toParam 的 smali 代码
如下:
.method public static toParam(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
.locals 3
.param p0, "as_str" # Ljava/lang/String;
.param p1, "as_key" # Ljava/lang/String;
.prologue
.line 34
:try_start_0
new-instance v1, Ljava/lang/StringBuilder;
const-string v2, "param="
invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-static {p0, p1}, LEncryptUtil;->of_encrypt(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, "¶m2="
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-static {p0}, LEncryptUtil;->getMd5_2(Ljava/lang/String;)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
:try_end_0
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0
move-result-object v1
.line 37
:goto_0
return-object v1
.line 36
:catch_0
move-exception v1
move-object v0, v1
.line 37
.local v0, "e":Ljava/lang/Exception;
const-string v1, "param=error¶m2=error"
goto :goto_0
.end method
还是没有发现可疑的地方
欢迎任何线索,指点
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.