《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进行复现

图十一:

图十二:

图十三:

得到的响应结果:

图十四:

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

图十五:

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

可以私聊进行讨论!

相关推荐
三少爷的鞋2 小时前
Repository 方法设计:suspend 与 Flow 的决选择指南(以朋友圈为例)
android
阿里云云原生3 小时前
Android App 崩溃排查指南:阿里云 RUM 如何让你快速从告警到定位根因?
android·java
cmdch20175 小时前
手持机安卓新增推送按钮功能
android
攻城狮20155 小时前
【rk3528/rk3518 android14 kernel-6.10 emcp sdk】
android
何妨呀~5 小时前
mysql 8服务器实验
android·mysql·adb
QuantumLeap丶6 小时前
《Flutter全栈开发实战指南:从零到高级》- 25 -性能优化
android·flutter·ios
木易 士心7 小时前
MVC、MVP 与 MVVM:Android 架构演进之路
android·架构·mvc
百锦再7 小时前
国产数据库的平替亮点——关系型数据库架构适配
android·java·前端·数据库·sql·算法·数据库架构
走在路上的菜鸟7 小时前
Android学Dart学习笔记第十三节 注解
android·笔记·学习·flutter
介一安全8 小时前
【Frida Android】实战篇15:Frida检测与绕过——基于/proc/self/maps的攻防实战
android·网络安全·逆向·安全性测试·frida