免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵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() {// hookjsonvar 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方法好用