《x嘟牛App登录认证机制的技术实现分析》

郑重声明:本文所涉及的所有内容,纯粹以技术研究和学习交流为目的,绝不可用于任何商业用途、侵权行为或违反法律法规及平台规定的活动。请读者严格遵守所在国家和地区的法律法规,以及相关平台的使用条款,切勿将文中内容付诸实际操作。对于因不当使用本文内容而导致的任何法律责任和后果,作者及本平台概不承担。

一、配置及应用

  • 手机: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进行复现

图十一:

图十二:

图十三:

得到的响应结果:

图十四:

将得到的返回结果放入解密函数中得到的返回值为:

图十五:

至此全篇讲述完毕,希望大佬帮忙解决一下遗留问题!

可以私聊进行讨论!

相关推荐
Whisper_Sy16 小时前
Flutter for OpenHarmony移动数据使用监管助手App实战 - 应用列表实现
android·开发语言·javascript·flutter·php
北海屿鹿17 小时前
【MySQL】内置函数
android·数据库·mysql
臻一17 小时前
rk3576+安卓14 ---上电时序调整
android
踢球的打工仔18 小时前
typescript-接口的基本使用(一)
android·javascript·typescript
2501_9159184119 小时前
如何在iPad上找到并打开文件夹的完整指南
android·ios·小程序·uni-app·iphone·webview·ipad
臻一21 小时前
rk3576+安卓14---uboot
android
2501_9445215921 小时前
Flutter for OpenHarmony 微动漫App实战:主题配置实现
android·开发语言·前端·javascript·flutter·ecmascript
2501_944521591 天前
Flutter for OpenHarmony 微动漫App实战:动漫卡片组件实现
android·开发语言·javascript·flutter·ecmascript
知1而N1 天前
电脑上运行APK文件(Android应用程序包),需要借助特定的软件或功能,因为Windows/macOS/Linux系统无法原生直接运行安卓应用
android·macos·电脑
代码s贝多芬的音符1 天前
HttpURLConnection post多个参数和一个图片
android·httpurlconn