前言
最近忙于招聘,尝试了很多途径。发现某招聘软件效果不错,但是噪声有点大。于是觉得既然是个 APP,那我抓出来 API 后,干点我想干的事情(爬虫、自动化管理),岂不是很好?
抓包分析
配合 Charles
代理,我们可以抓到如下 QueryString
对于同一个事件,多尝试几次之后发现:只有sig
和req_time
是变量。而且 V2.0
感觉是写死的字符串,后面的那个怎么看怎么像 MD5
对于这种 MD5
我们不会指望它能在网站上被爆破的。于是摆在眼前的做法,就剩下逆向分析了,然而我手头没有一台越狱的 iPhone,就没法通过擅长的 lldb 断点的方式看到 MD5 加密前的样子,于是我目标改为了 Android
拆包分析 java 源码
apk
改名zip
,解压拿到classes.dex
我们通过
dex2jar
轻松拿到了dex
包所对应的jar
文件。jd-gui
拆包jar
,倒出对应代码。发现这东西做了混淆,但系统API MD5 肯定无法混淆
尝试着 grep 一下:
grep -r "md5" * -i
在一堆代码中,发现那个 V2.0 似曾相识
return "V2.0" + MD5.convert(new StringBuilder().append(com.package.id.config.c.a(paramString)).append(str1).append(str2).toString());
跟到文件中看了一眼:
我们知道了签名是由 config 的一个方法,和经过处理的 参数字典 以及 盐和某个 c.f() 方法构成的。
然而跟了一下 str2 的 c.f() 方法
public static String f()
{ if (!LText.empty(e)) { return e;
} return SP.get().getString("com.package.id.SECRET_KEY", "");
}
发现走入了死胡同,要知道 SECRET_KEY
哪来的,仿佛很麻烦的样子。总想放弃治疗,但又觉得可以抢救一下。联想了一下 iOS,于是开始搜索 Android 有没有像 lldb 断点一样的东西。
毕竟,他的 MD5 都是经过一个叫做 MD5.convert
的方法。于是我下个断点岂不是很好?突然想起来 《Android 软件安全与逆向分析》 里面介绍过可以修改 Smali,添加 Log.d 的方法,尝试一下。
反编译修改 Smali 代码
apktool D xxx.apk,结果出了点小插曲,详情见阅读原文吧。
找到那个
MD5.smali
在 convert 方法中给 .locals +1 并插入 Log 对应代码:
.method public static convert(Ljava/lang/String;)Ljava/lang/String; .locals 4 const-string v3, "hack" invoke-static {v3, p0}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I .prologue
v3
是我声明的 “hack” 字符串,p0
是传入默认参数。apktool b 文件夹名,我这里是:
apktool b app
这时在 app/dist/ 中,可以找到我们打包好的 apk 文件了,但这时候是没法用的,我们需要重新签个名。
用 google 提供的
signapk.sh
签名 APKadb install -r app.apk
启动,闪退。logcat 提示
java.lang.VerifyError: Rejecting class com.monch.lbase.util.MD5 because it failed compile-time verification
查了一下貌似是 ART 的锅。用模拟器跑了一个 4.4 的 rom,adb logcat | grep hack
于是整个 md5 加密前的东西,暴露无遗。配合爬虫,就能抓到一份属于自己的简历库了!