16.安卓逆向-frida基础-HOOK类方法2

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:图灵Python学院

本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:15.安卓逆向-frida基础-HOOK类方法1

上一个内容里hook了一些逆向时常用类和方法,本次接着继续

有一个app,如下图是通过青花瓷抓的包,它的参数加密了,就用它来进行实战

然后对它进行HOOK,它的参数可能会出现在解析json的时候,使用HashMap的时候

首先HOOK HashMap,可以看到下面两个图,HOOK它之后可以看到明文、密文、接口返回值

代码

function demo6() {
    var hashMap = Java.use("java.util.HashMap");
    hashMap.put.implementation = function (a, b) {
        console.log('输出-》',a,b);
        return this.put(a, b)
    }

}

Java.perform(function (){ // 调用java代码也就是getCalc方法
    // demo1()
    // demo2()
    // demo5()
    demo6()
})

然后下图是密文的k,所以用Encrypt它做一个判断,如果等于Encrypt的时候查看它的调用栈

打印调用栈的代码

function showStacks() {
    Java.perform(function (){
        console.log(Java.use("android.util.Log").getStackTraceString(
            Java.use("java.lang.Throwable").$new()
        ))
    })
}

实战:下图把调用栈打印了出来,然后可以逆向了

function demo6() {
    var hashMap = Java.use("java.util.HashMap");
    hashMap.put.implementation = function (a, b) {
        if(a == 'Encrypt'){
            showStacks();
        }
        console.log('输出-》',a,b);
        return this.put(a, b)
    }

}

function showStacks() {
    Java.perform(function (){
        console.log(Java.use("android.util.Log").getStackTraceString(
            Java.use("java.lang.Throwable").$new()
        ))
    })
}

Java.perform(function (){ // 调用java代码也就是getCalc方法
    // demo1()
    // demo2()
    // demo5()
    demo6()
})

有了调用栈开始逆向分析,打开jadx-gui-1.4.7.exe并把apk拖进去进行反编译

然后下图红框是HashMap put的位置,这里是java提供的所以这里不用看,然后下图皇框里是json库里的方法所以也不用看,然后下图绿框是自己写的

不确定是不是自己写的就把下图红框位置,就是前面三个部分复制一下去百度,如果能百度到那就不是自己写的

然后如下图,搜索

双击下图红框进入类

双击之后

然后来到116行,来到之后如下图看到它添加加密数据的位置了,然后开始分析

然后看到加密的数据从 RequestUtil.encodeDesMap(code, this.desKey, this.desIV); 得到的,所以接下来去encodeDesMap里看

按住CTRL鼠标左键单机下图红框位置,就可以跳转进去了

然后就来到下图红框位置

然后右击选择复制为frida片段,也就是它会给我们生成frida的HOOK代码并复制,HOOK之后看它的入参

然后粘贴的代码

然后执行 frida -UF -l 指令执行hook代码,如下图可以看到它的明文和用来加密的字符

然后如下图红框,它里面有个 sign 的值也被加密了

通过Python代码加密,发现它的key有问题,与上图加密内容不一样

然后再回到apk反编译的代码,如下图红框,它把key放到了DesSecurity里

进入 DesSecurity 里,如下图红框,可以看到它对key进行了加密,所以用hook得到的key进行加密,它是可以加密但是加密的结果不对

然后分析InitCipher里面逻辑,不认识的代码可以复制去百度搜,加密的后面再写,这里先这样

然后分析 sign,sign在下图红框位置添加的

然后 Config.BASE_APPEND 的值是 sdlkjsdljf0j2fsjk

然后进入paraMap方法里分析,对sign进行了md5加密

进入md5方法里,如下图红框,它是标准md5加密

然后现在需要知道md5方法的入参是什么,所以要hook它,让他给我们生成代码

下图红框是要加密的数据,也就是sign的值

使用在线的md5加密,结果与它的加密一样

然后这个字符串值的来源如下图,sdlkjsdljf0j2fsjk来自于Config.BASE_APPEND(上面有找到)

HOOK JSON

function hookjson() {// hookjson
    var JSONObject = Java.use("org.json.JSONObject");
    JSONObject.put.overload('java.lang.String','java.lang.Object').implementation=function (key, value) {
        console.log('Hook JSONObjdect.put')
        console.log(`key:${key}`)
        console.log(`value:${value}`)
        return this.put(key, value)
    }

    JSONObject.getString.overload('java.lang.String').implementation=function (key) {
        console.log('Hook JSONObjdect.getString')
        console.log(`key:${key}`)
        var res = this.getString(key)
        return res;
    }
}

Java.perform(function (){ // 调用java代码也就是getCalc方法
    // demo1()
    // demo2()
    // demo5()
    // encodeDesMap()
    // wmd5()
    hookjson()
})

它有时候HOOK之后没反应,感觉还是HOOK map的put方法好用


img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值