本章用到的工具有:
- AndroidStudio(配合xposed进行分析)
- xposed(对JAVA层的应用进行hook)
- 任意一款js调试工具,我这边用的是WT-JS
- 精易编程助手(只是为了使用里面的一些编码操作,还有一个自带的接口调试工具,用起来比较方便)
- HttpAnalyze(抓包)
上一篇说到了这个课表数据(对某安卓应用进行分析爬取课表数据制作懒人课表(一)),它是一个AES加密。
那我们需要怎么搞他呢?
我们 祭出神器:xposed
xposed怎么配置,这块应该不用多说了
搜一下一搜一大片
ps:由于夜神模拟器不知道这么个原因,xposed装上去就死机,我这边就直接换成了雷电模拟器。
编写xposed的东西 我这边就用到了AndroidStudio
在编写之前。我们要先了解一下在java里面 是怎么实现的aes加密
java的aes加密,在这边文章里面,实现了一个带iv和key加密的方法:JAVA实现AES加密、解密
我在上面那个文章中。扣了一个不带iv的加密方式来进行说明
// 加密
public static String Encrypt(String sSrc, String sKey) throws Exception {
if (sKey == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16位
if (sKey.length() != 16) {
System.out.print("Key长度不是16位");
return null;
}
byte[] raw = sKey.getBytes("utf-8");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
}
在上面的代码中,我们注意到了一个SecretKeySpec的对象。
这个东西传入了一个key。而这个key就是我们需要的东西。
而这个对象是在javax.crypto里面的,属于java层的东西,那我们就可以对这个对象进行hook,把他构造方法里的第一个参数给掏出来看看是个什么玩意
下面开始编写xposed模块
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public class HookMain implements IXposedHookLoadPackage {
public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
XposedBridge.hookAllConstructors(XposedHelpers.findClass("javax.crypto.spec.SecretKeySpec", lpparam.classLoader), new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
byte[] mKey = (byte[]) param.args[0];
int mSize = mKey.length;
byte[] mShit = new byte[mSize];
System.arraycopy(mKey,0,mShit,0,mSize);
String mFlag = Base64.encodeToString(mShit,0);
Log.d("加密","===============================================================");
Log.d("加密","密钥=>" + mFlag);
Log.d("加密","方式=>" +param.args[1].toString());
}
});
}
}
最后编译安装到模拟器里,勾选激活然后重新启动即可。
启动后,直接启动目标应用
然后切换到AndroidStudio里。注意日志框 你会惊讶的注意到,这不是我们写的那个东西吗。没错你hook成功了
我们给他过滤一下。在上面那个框框里面输入加密俩字把我们那些东西过滤出来。
哇这么多密钥。到底是哪一个呢。我们不管 全部给删了先
因为我们需要的目标数据。不是这一块的。我们直接登录目标应用
你发现到,欸 这个密钥怎么长得一模一样。非常可疑
我们去到目标数据那里。抓包然后解一下看看。
由于我们这个雷电模拟器。抓不到https,所以我就采用了另一个抓包工具。叫HttpAnalyze
直接点击开始。就是这么傻瓜
在目标数据下面 发现四个数据包 我们对着响应数据一个一个看看是个什么情况
我会用一个比较方便的js调试工具:WT-JS 来进行aes的解密测试
由于我们打开了这个目标数据的时候
AndroidStudio一直在吐密钥
所以我严重怀疑R8C/jbk8r6+llWUZVPWc7w这个东西就是密钥
我们去试一下
打开wt-js 然后切换到aes的那块 我们会看到 aes有好几个方式 而且有一个key和iv 我们就先测试 ECB模式,因为ECB模式无需IV
记得密钥方式设置成base64
欸 成功解出来了.那我们看看这个最多数据的包解出来是不是有想要的数据
em???纳闷了 为啥子没有
不慌。如果这里没有的话 那就肯定是在刚开始进来的时候就已经加载完毕了,我们就重新打开这个目标应用进行抓包。反正加密的key已经拿到了
注意:目标应用每次重新启动的key都会变动 要时刻注意AndroidStudio的日志输出
本次重新启动 我的key是oON8uRrq7DkdBhfUtaR44g
然后我这次是在登录页面开始抓的 我们来看看数据包
在一个getdata的数据包中 发现了一块很像课表的数据
这块其实也不是我们的课表数据,因为量太少了
我们继续看看
接下来 我在一个monthlyData的表中 看到了一串让我卡到崩溃很长很长的数据。我严重怀疑 课表就放在里面
由于这数据太大了。我们只能无奈的通过手动去请求一次来获取数据
它是一个post请求 我们看一下提交的数据
是加密的。不怕 解出来就好了
嘶,我觉得这是课表无疑了。
直接请求一次看看
然后把返回的数据data拿去解密
成功拿到目标数据。我们来格式化看看
嗯 很棒
我们改下提交的数据 把他改成六月看看
懂了 这是一个一个月课表进行获取的
呼 通过这大费周章的可算把这课表数据提出来了
下一章就是没啥用的懒人课表制作了(ps:手机太卡打开个网页就能看课表。打开软件要卡好一会)