郑重声明:本文所涉及的所有内容,纯粹以技术研究和学习交流为目的,绝不可用于任何商业用途、侵权行为或违反法律法规及平台规定的活动。请读者严格遵守所在国家和地区的法律法规,以及相关平台的使用条款,切勿将文中内容付诸实际操作。对于因不当使用本文内容而导致的任何法律责任和后果,作者及本平台概不承担。
一、配置及应用
- 手机:google pixel6 定制系统
- 电脑:windows 系统
- app:x嘟牛
- 手机端工具:frida、SocksDroid
- 电脑端工具:Charles、jadx、WebStorm
二、关于app的介绍
该款app应该是被刚入门的Android逆向的同学们都玩过一遍了,属于那种无加固,无混淆,无难点,当作一个入门级练手项目刚好,然后慢慢的网上就有很多大佬们来普及这个app如何去过请求,最后人家app不要面子的嘛?结果给来了个《360加固》,这下好了,总不能刚入门就干脱壳吧,所以这篇文章先使用老版本的apk(即无加固的版本的apk)来进行演示。
图一:
首先我们去下载一个老版本的apk 使用adb命令安装到手机上:
adb
adb install xxx.apk
需要注意的是老版本的apk在使用adb命令进行安装的时候可能会报错,出现类似于apk版本太低等类似的错误,这个时候不要慌,一行命令就解决了!
adb
adb install--bypass-low-target-sdk-block xxx.apk
感谢大佬分享:blog.csdn.net/li_5033/art...
这个时候我们就解决了apk的安装问题
三、抓包
图二:

点击登录进行抓包!
图三:

只有一个接口login,很显然这个就是我们想要的,查看请求头部分并没有什么加密,请求参数部分就只有一个字典,里面只有一个键值对,键值对如下: {"Encrypt":"NIszaqFPos1vd0pFqKlB42Np5itPxaNH//FDsRnlBfgL4lcVxjXii/UNcdXYMk0EOzeKm2E2Df1/\nS37RfshySn1BDhdQ6KS5FHJqA1l1aiOVOs8+QAGx318Jr4L1Y8/w9I3qk0831dBXpcenKo21/AwO\n5iWxbpvs+dphVu6w6/BaYI7RFBOvcS1I08BrQHoe1VAFt76TlV41yD3xC2IIVtyZ1W8u03gG\n"} 返回值也是加密的数据。 至此,我们已经抓到了包,并且已经找到了加密的数据,以及需要解密的数据。
四、源码中探索真相
jadx进行apk的反编译
关于如何定位我想说:
- 可以搜索参数中没有加密的部分(例如本案例加密数据对应的键[Encrypt]),也可以去搜索起的没有加密的参数(例如{"Encrypt": "xxx", "content":"xxx"}, 去搜索[content])
- 可以在搜索的参数加冒号(:)、引号("xx")。
- 可以搜索系统常用的加密函数
- 可以搜索url链接(部分即可,例如本案例的[user/login])
- 多分析、多怀疑、多hook推翻
可以去尝试搜索["Encrypt"]
图四: 
一共有24条搜索结果,但是与我们app相关的只有两条,这不是一下子就明了起来了嘛?一个一个点进去看一下。
分析第一个结果:
图五:
嘶,乍一看这个不就是我们的请求加密参数嘛,put对象方法,添加一个键值对,就是这,一定是这里了!咋能这样,我们是程序员,需要严谨一些,肯定要拿出让自己信服的数据来证明啊,这个时候就需要hook来验证自己的猜想了!
图六:
函数是void没有返回值,hook出来了传进去的参数,有数值,不说百分之一百把,百分之七八十应该就是这个函数没跑了,但是我们还有一个搜索结果,秉承着严谨的态度,我们也去分析hook一下第二个搜索结果。
分析第二个结果:

发现好像也有与第一个结果相似的东西,毕竟好像更加详细一点,如果先看结果二会不会更加相信结果二了呢?来,我们hook一下看看结果。

hook代码注入之后,点击登录并没有返回结果,所以我们基本上可以排除这一个结果了(除非第一个也没有结果返回,不然先不用往更深层次考虑,比如函数名被修改了,反编译的函数名不对等等)。
继续分析第一个结果:
通过分析图五,我们会发现,其实加密的参数的值就是先得到code,将code、key、iv放入到xxxDesMap这个函数中,就得到了我们想要的加密值,这个时候我们就应该分析如果得到code
先去分析 paraxxx这个函数
图六: 
最终返回的结果就是addMap这个对象,进行排序转json返回,先去hook这个函数
图七:
发现他的返回值有一些手机相关的、时间戳、usa、pwd,唯一的加密的地方就是sign,但是sign在图六中可以看到,就是checkCode的值,而checkCode就是通过md5来的,所以我们要去分析md5这个函数,hook md5函数
图八: 
我们发现通过传入参数,进行md5加密返回的结果与想要的sign的值是一样的(图六中有转大写的操作) 至此我们的code已经得到了,key、iv都是明文,可以查看的到! 传入我们的xxxDesMap函数中,进行加密
图九:
首先我们是对key、iv进行操作得到DesSecurity ds,然后在调用encrypt64就可以得到我们想要得到加密的值了,ok先去hook一下这个函数!

点击登录之后就会发现并没有任何结果返回,对于新手的我,在这个地方也踩了好久的坑,各种方法都试了,比如说去查看调用堆栈,查看是否存在这个函数,发现确实存在这个函数,实在没有办法(有没有大佬帮我解疑一下),我就另行它路,通过hook图五那一个函数去换一个的角度来得到该函数的返回值,发现真让我做到了,所以我们的思路是没有问题的,找的函数也没错至于出不来的原因,就等以后在研究咯。
图十:

通过分析这个类中的方法,知道对key、iv进行了什么操作,我们就可以去复现喽!
五、使用python进行复现
图十一:

图十二:
图十三:

得到的响应结果:
图十四:

将得到的返回结果放入解密函数中得到的返回值为:
图十五: 
至此全篇讲述完毕,希望大佬帮忙解决一下遗留问题!
可以私聊进行讨论!