Crack App | 某猫小说必读榜加密参数 sign 分析

咸鱼学Python

共 6566字,需浏览 14分钟

 ·

2022-11-29 14:58

友情提示:本文章仅供学习交流,请勿用于非法用途!如果侵犯贵司请及时联系删除

本次分析的是七猫小说中的七猫必读榜的接口,关键参数 sign ,接口是  /api/v1/must-read ,将app脱入到jadx中进行分析,直接搜索 must-read 参数,

发现可疑参数,跟进去看一下

上面一个参数跟我们抓包得到的参数是一致的,但是唯独缺少了sign,怀疑可能是后续进行添加的,接着搜索sign参数

发现可疑的节点,addQueryyParameter,极大可能是利用这个方法添加sign参数,直接上frida进行hook验证一下我们的猜想

发下sign参数和抓包的参数是一致的,那我们就去跟踪 Encryption.sign 这个方法,先用frida hook一下入参的str

看的结果像是md5,到本地去验证一下

结果发现对不上,那我们值接调用这个方法加密 123456 试一下,加密123456得到的结果是 8c3d25f82b40f42281ae47ed2ca937ad加密可能是经过魔改或者是参数进行加盐,接着跟具体的加密算法

是so层的加密,那我们要找到他是加载的哪一个so文件,可以看到在定义 native方法的这个位置并没有加载so文件的方法 System.loadLibrary  我们往上层看 在Encryption 这个类中有个init方法是有点可疑的,那我们直接看他的用例,果然在用例中发现了System.loadLibrary

public class dk extends zx0 {
    @Override // defpackage.yx0
    public void run() {
        Context context = this.b;
        Encryption.init(context, context.getResources().getString(R.string.app_md5_key));
        try {
            try {
                r5.b(this.b, "common-encryption");
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception unused) {
            System.loadLibrary("common-encryption");
        }
    }
}

确定我们需要的so文件时 common-encryption ,直接上IDA进行解析,但是经过IDA解析之后没有发现我们需要的sign方法

我们再使用frida-trace 看一下内存中是不是有这一个方法,按照静态加载的格式拼接好sign方法

frida-trace -U -i  "Java_com_km_encryption_api_Security_sign"  -p 8845
                                                               -p 获取线程id
frida-trace -UF -i "Java_com_km_encryption_api_Security_sign"   com.kmxs.reader
                                                               根据包名

果然找到在内存中trace到了方法,但是我们还是在IDA中找不到这个方法。这个时候我们利用一段脚本来找到方法的偏移地址(脚本来自于: 马到成功https://blog.csdn.net/weixin\_56039202/article/details/126376536?spm=1001.2014.3001.5501[1])

function hook_func_from_exports(){
    var module = Process.findModuleByName("libcommon-encryption.so")
    var funcs = module.enumerateExports()
    funcs.forEach(function(func){
        if(func.name.indexOf("Java_com_km_encryption_api_Security_sign")>=0){
            console.log("sign offset-->0x" + (func.address-module.base).toString(16))
        }
    })
    
}


setImmediate(hook_func_from_exports)

>sign offset-->0x15620

得到方法的偏移地址之后到IDA中进行搜索,搜索发现15620 竟然指向的是Java_com_km_encryption_api_Security_token

那我们就直接分析token,整个加密算法是这样的

发现到一个比较可疑的方法, MessageDigestAlgorithm::toStr((MessageDigestAlgorithm *)v23); ,那我们来hook一下v23的值,直接上frida代码

function hook_MessageDigestAlgorithm_toStr() {
    var libcommon = Process.findModuleByName("libcommon-encryption.so")
  Interceptor.attach(libcommon.base.add(0x15778), {
        onEnter: function (args) {
            console.log("---toStr---");
            console.log(hexdump(this.context.x1, {
                offset: 0,
                length: 128,
                header: true,
                ansi: true
            }));
        }
    })
}

在入参的时候我们最好能够把入参固定一下,我们直接把上面的hooksign的方法拿过来用

  Java.perform(function(){
        let Encryption = Java.use("com.qimao.qmsdk.tools.encryption.Encryption")
        Encryption.sign.implementation = function(str1){
            console.log(`[Encryption.sign HOOK] 入参:${str1}`)
            let result = this.sign("123456");
            console.log(`[Encryption.sign HOOK] 返回值:${result}`)
            return result;
        }
    });

用这段代码固定住入参的加密参数,来看下结果

可以看到MD5是加了盐的,到加密工具中测试一下

[Encryption.sign HOOK] 返回值:8c3d25f82b40f42281ae47ed2ca937ad

再恢复正常的参数进行测试

接下来放到python中请求一下,完美成功,当然heders中还有qm-params  sign,多次抓包分析这些参数是不会变得,这篇文章就完结撒花啦!

这个文章是参考马到成功这个大佬的文章写的,大佬的文章写的是登录接口后面还有其他的参数,如果有需要可以到大佬的博客看下,本文是我的第一篇安卓逆向的文章,写的不好还请各位看官海涵!

参考资料

[1]

https://blog.csdn.net/weixin_56039202/article/details/126376536?spm=1001.2014.3001.5501: https://blog.csdn.net/weixin_56039202/article/details/126376536?spm=1001.2014.3001.5501


浏览 167
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报