今天给大家分享一下如何逆向分析 Native 层的加密,整个过程的思路值得借鉴,接下来由小帅b的朋友 Houser 给大家进行演示,搞起:

所需设备和环境

设备:

安卓手机(获取root权限)

抓包:

fiddler + xposed + JustTrustMe

反编译:

jadx-gui,ida

抓包

按照惯例,这里隐去 app 的名称,开启 fiddler 抓包后 app 提示连接不到网络,判断是证书验证,开启 xposed 框架,再次请求,成功抓到包,连续请求两次来对比参数变化:

可以看到 x-app-token 这个参数不一样,其他参数都是固定的,先简单看一下 x-app-token 的构成:

这样做了一下换行,有没有发现什么规律?

我一眼就看出来第二行是手机的 deviceID,因为爬虫写多了,这个字符串经常出现,第一行是 32 位,应该就是个 md5, 第三行是个 16 进制数,知道了这些,接下来就来反编译,搜索这个关键字。

反编译

反编译之前先使用 ApkScan-PKID 查一下是否有壳,养成好习惯,这个 app 没有加壳,直接用 jadx 打开,全局搜索 “x-app-token”,只有一处,应该就在这里了:

从框中代码发现 x-app-token 的值就是 as,而 as 是函数 getAS 生成的,按住鼠标左键,点击 getAS 进去看看详情:

它把函数过程写到 native 层中去了,那只好去分析这个名为native-lib 的 so 文件了,解压目标 apk 获取到了如下图这些文件:

so文件就在这个lib文件夹里:

ida中打开这个文件,切换到 Export 导出函数选项卡,先来直接搜索getAS:

没有搜到getAS,倒是搜到了 getAuthString,名字很像,打开看看吧,按 F5 可以把汇编代码转换为伪 c 代码,下拉分析一波,看到了 md5 关键字:

代码有点难懂,连懵带猜 v61 应该是 MD5 加密后的结果,然后 append 似乎是在拼接字符串,看到了“0x”,根据抓包的结果已经知道 x_app_token 的第三行是个 16 进制数,那应该是这里的v86了,向上看看它具体是什么:

v86存的是 v40 的值,而 v40 就是当前的时间戳,那 x-app-token 第三行应该就是时间戳的 16 进制数。接下来看看 md5 的入参为v58,v52,v53,重点来看v52,往上追朔看到其和 v51 是相等的,而 v51 是一个未知字符串经过 base64 编码得到的,先来hook这两个函数,写段脚本:

第1处和2处分别是目标函数的地址,鼠标点到目标函数处,ida左下角会显示,加1是为何,只记得大学时候学过汇编语言讲到段地址,偏移地址,物理地址这些,猜测和这些知识有关,还需研究,这里先这样用,第3处的写法是当这个参数为字符串时的写法,运行一波,看看打印输出:

同时也来抓包:

把v52的值放到在线MD5网站中加密看看:

和抓包得到的结果是一样的,那就证明hook点找对了,那么v49就是base64编码之前的值,v49是什么呢,仔细一看,里面也有deviceID,再来分割一下:

第一行通过两次hook,发现他是固定不变的,第二行是改变的,32位,看起来又是个md5,第六行是包名,返回伪c代码,再来分析看看,在前面又看到了MD5加密的地方:

那来hook这个函数,看看入参:

打印的入参数据为:

S是一个时间戳,拿到MD5加密网站上验证一下,正好和v49中包含的字符串相同:

至此,逆向就完成了,来总结一下x-app-token的获取过程,先是带有把时间戳进行md5,按下图顺序拼接:

然后把拼好的字符串进行base64编码,最后把编码结果进行MD5,得到x-app-token的开头部分,组成如下:

接下来写个脚本来请求数据

请求

代码如下:

运行,成功拿到数据:

总结

今天主要介绍了 native 层 hook 的方法,虽然 so 文件中的伪c代码要有一定的基础才能看懂,但是先不要怕,分析的过程中可以先大胆假设,有 frida 非常强大的 hook 功能,就能一步步验证之前的假设。这两次都是静态分析方法,下次我们再来介绍一下动态调试的方法。

最后,以上内容仅供学习交流,希望对你有帮助,那么我们下回见,peace!

关注公众号:学习 Python 没烦恼

c++ 中文 base64加密_这次有点骚了,破解安卓某 APP 低层加密相关推荐

  1. 看我骚操作‘破解’某查查app的sign以及某眼查的Authorization!

    看我骚操作'破解'某查查app的sign以及某眼查的Authorization!!! 这里要用到的工具/开发语言: 1.Python(2或者3) 2.App爬虫神器mitmproxy 3.按键精灵 4 ...

  2. mysql主从同步加密_教你构建MySQL主从结构,实现基于SSL加密的主从同步机制

    实验环境RHEL6.4 admin1.tuchao.com    192.168.1.201    主服务器 admin2.tuchao.com    192.168.1.202    从服务器 先在 ...

  3. 【iOS app加密】iOS app之游戏加密防破解

    [iOS app加密]iOS app之游戏加密防破解.iOS app游戏类应用有一个很泛滥但被视为鸡肋的问题,那就是iOS app被破解的问题.因为国内大多数游戏靠内购和广告盈利,游戏安装包也只是在早 ...

  4. maven项目密码md5加密_加密Spring Boot中的application.properties

    1 概述 什么?都2020年了还在Spring Boot的配置文件中写明文密码? (虽然是小项目,明文也没人看.) (明文简单快捷方便啊!!! ) (你看直接用户名root密码123456多么简单!! ...

  5. 数据库身份证号加密密码加密_使用密码加密数据

    数据库身份证号加密密码加密 介绍 (Introduction) When we're encrypting data, typically we will create a random key th ...

  6. 猿人学题库十六题——js加密_表情包+sojson6.0——满天坑

    猿人学题库十六题--js加密_表情包+sojson6.0 1.  首先 进入 浏览器的开发者工具, 进去后首先还是 无线debug ,找到 debugg 对应的行数,右击选择 never pause ...

  7. 0宽字符加密_前端AES加密方式分析,及其python实现

    在前端常见的加密方式中AES很少使用,因为相对于非对称的RSA安全性很低,AES是典型的对称加密,密钥就在前端源码里. 案列网站是http://ewt360.com,一个并不复杂的网站,首先抓个包看看 ...

  8. 配置加密_数据库密码配置项都不加密?心也太大了!

    先看一份典型的配置文件 ... 省略 ... ## 配置MySQL数据库连接spring.datasource.driver-class-name=com.mysql.jdbc.Driversprin ...

  9. svgaps绘制时不能用中文命名吗_设计师需要了解的切图命名规范

    2020年8月21日下午4点50分 黄河公园 通常我们在界面设计完成之后要切图给到前端开发.初做UI设计时,把重点都放在设计效果图上,对之后的切图命名规范没有很注重.当时我会有一些疑惑,切图命名的原则 ...

最新文章

  1. Android中修改弹出dialog背景无色透明,弹出时有遮罩
  2. 癌症治疗新曙光:AI助力科学家更好地观察人类活体细胞
  3. Non-interger Area 分类讨论 奇偶 取模 牛客练习赛95
  4. 分享31个非常有用的 HTML5 教程
  5. 快速构建Windows 8风格应用22-MessageDialog
  6. 自定义验证规则ValidationAttribute的使用
  7. JS基础_break和continue
  8. 黑苹果 选择语言 点不了_什么是天然的“黑钻”?—科普贴
  9. 7-1 两个有序链表序列的合并 (15 分)
  10. 三次给你讲清楚Redis之Redis是个啥
  11. 心跳监测器 IHeartBeatChecker
  12. pytorch使用说明2
  13. 1月3日 接触ROS
  14. redhat7linux防火墙开放端口,Redhat7 firewall(防火墙)
  15. 基于javaweb+springboot的企业员工绩效工资管理系统(java+SpringBoot+FreeMarker+Mysql)
  16. P10(1R)单红V706模组32X16 LED显示屏的二十项小实验
  17. 史玉柱的“圈钱”神话3
  18. Hibernate的缓存机制
  19. 考研数据结构填空题整合_做题版
  20. [转载]Shell十三问(入门与提高)

热门文章

  1. javaSE----学习路线
  2. Linux CentOS7 下安装 TeamViewer
  3. ppt给图片增加高斯模糊_【毕业答辩】PPT美化:如何设计毕业答辩的封面
  4. python写一些小代码_#python#自己写的一段小代码
  5. python更新版本会丢失库吗_Python小技巧:如何批量更新已安装的库?
  6. Java判断文件夹是否存在,不存在则新建
  7. SpringBoot 注入的@service为空,运行时报空指针
  8. ActiveMQ运行失败 not running
  9. 社交之后又是资讯,支付宝要用内容吸引流量
  10. Ansible8:Playbook循环【转】