一个视频APP的破解,从逆向看代码安全
2019-12-26 14:56:06 Author: bbs.pediy.com(查看原文) 阅读量:412 收藏

[原创]一个视频APP的破解,从逆向看代码安全

20小时前 524

发现一个视频APP,觉得片源不错,想下载下来看看,首先想到的就是用flidder或者anyproxy

这里使用anyproxy,因为可以二次开发。

但是抓取完后,发现数据全是加密的


既然加密,那就没办法,必须去反编译,看看怎么加密

解压APK后,发现居然是360加壳的。先脱壳

网上很多脱壳方法,exposed+fdex2是不错的。解压出来是:


虽然dex都dump出来了,但发现有一个dex没法打开。用010修改一下文件头就可以用了。

使用jd-gui开始分析。接口加密,当然就很容易找到request相关的类




从以上代码发现:

APP随机生成一个aesKey,然后再用RAS加密一次得到key,用aesKey进行AES/CBC/PKCS7Padding加密得到body。

虽然在接口里,能看到加密后的key,但是因为RSA是不对称加密,本地也没有存储私钥,因此本地也就无法解密,无法查看到原始加密字符串是什么。

那就只能通过exposed hook来查看原始内容是什么了。

既然找到了加密方法是cryptoAESKey,cryptoBody。那么可以写方法如下:

XposedHelpers.findAndHookMethod("com.stub.StubApp", classLoader, "ᵢˋ",Context.class, new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
        super.afterHookedMethod(param);
        //获取到360的Context对象,通过这个对象来获取classloader
        Context context = (Context) param.args[0];
        //获取360的classloader,之后hook加固后的代码就使用这个classloader
        ClassLoader classLoader360 = context.getClassLoader();
        //替换classloader,hook加固后的真正代码

        XposedHelpers.findAndHookMethod(fPackageName, classLoader360, fMethodName, String.class, new XC_MethodHook() {

            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                XposedBridge.log(" cryptoAESKey before str:" + param.args[0]);
            }

            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                XposedBridge.log("cryptoAESKey after str:" + param.getResult());
            }
        });
    });

//cryptoBody
XposedHelpers.findAndHookMethod(fPackageName, classLoader360, "cryptoBody", String.class,String.class, new XC_MethodHook() {

    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
        XposedBridge.log("cryptoBody before str1:" + param.args[0]+",str2:"+param.args[1]);
    }

    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
        XposedBridge.log(" cryptoBody after str:" + param.getResult());
    }
});
})

然后就可以看到原始值是什么了:

{

"currentPage": 1,

"pageSize": 5,

"data": 1

}

后面,就可以自己构造数据,进行提交获取数据啦。

小结:

从逆向看代码安全

1. APK本身要混淆加壳

2. 接口安全:Rsa+aes,aes的key通过rsa加密传输,只有客户端本身(客户端本身没法解,但知道rsa加密前的值)和服务端可以解出来。

3. 关键加密代码放在so库里。一些关键的库,可以做签名检验。

[进行中] 看雪20周年庆典12月28日上海举办,LV四级(中级)以上会员免费参与!,同时在校学生免费参加:学生报名链接!


文章来源: https://bbs.pediy.com/thread-256905.htm
如有侵权请联系:admin#unsafe.sh