逆向 x红书 shield
创始人
2025-05-31 16:23:05
0

x红书 shield

版本 7.6.0

charles 抓包 目标字段 shield

在这里插入图片描述

查找调用的so

yang神的 frida_hook_libart

运行 frida -U --pause -f com.xingin.xhs -l hook_art.js
在这里插入图片描述

记录

[NewStringUTF] bytes:XYAAAAAQAAAAEAAABTAAAAUzUWEe0xG1IbD9/c+qCLOlKGmTtFa+lG43EOeuFXTagQk9W2z7Y1Gp2q+rJez8Mj2sR+2fc3RQwbE2eKNbym2Sxh0u1j7GzMl9DV8b5bDqkYIbNd 0xb3986981 libxyass.so!0x73981libxyass.so!0x73981

查找注册函数

运行 frida -U --pause -f com.xingin.xhs -l hook_RegisterNatives.js
在这里插入图片描述

记录

[RegisterNatives] java_class: com.xingin.shield.http.XhsHttpInterceptor name: initializeNative sig: ()V fnPtr: 0xb5594289  fnOffset: 0xb5594289 libshield.so!0x94289  callee: 0xb5510211 libshield.so!0x10211
[RegisterNatives] java_class: com.xingin.shield.http.XhsHttpInterceptor name: intercept sig: (Lokhttp3/Interceptor$Chain;J)Lokhttp3/Response; fnPtr: 0xb55939d9  fnOffset: 0xb55939d9 libshield.so!0x939d9  callee: 0xb5510211 libshield.so!0x10211
[RegisterNatives] java_class: com.xingin.shield.http.XhsHttpInterceptor name: initialize sig: (Ljava/lang/String;)J fnPtr: 0xb55937b1  fnOffset: 0xb55937b1 libshield.so!0x937b1  callee: 0xb5510211 libshield.so!0x10211
[RegisterNatives] java_class: com.xingin.shield.http.XhsHttpInterceptor name: destroy sig: (J)V fnPtr: 0xb5593745  fnOffset: 0xb5593745 libshield.so!0x93745  callee: 0xb5510211 libshield.so!0x10211     initializeNative    fnOffset: 0xb5594289
intercept           fnOffset: 0xb474b465
initialize          fnOffset: 0xb474b279
destroy             fnOffset: 0xb474b225

获取 libxyass.so

libxyass.so 加壳了

yang神的 frida_dump_so

  1. 开启 ./data/local/tmp/frida-server
  2. 运行x红书
  3. 运行 python dump_so.py libxyass.so

在这里插入图片描述

获得 脱壳后的libxyass.so 但是 还是找不到 initializeNative 等函数

向网上大神说的先这样,再那样,可是我就是不行。。。。eom


x红书 shield

版本 6.79.0

查找调用的so

运行 frida -U --pause -f com.xingin.xhs -l hook_art.js记录
[NewStringUTF] bytes:XYAAAAAQAAAAEAAABTAAAAUzUWEe0xG1IbD9/c+qCLOlKGmTtFa+lG43AJdeFURq4Qk9W2z7Y1Gp2q+rJez8Mj2sR+2fc3RQwbE2eKNbym2Sxh0u284QIR/KpIAlrbPG7TIPIl 0xb59929b7 libshield.so!0x109b7libshield.so!0x109b7

查找注册函数

frida -U --pause -f com.xingin.xhs -l hook_RegisterNatives.js记录
[RegisterNatives] java_class: com.xingin.shield.http.XhsHttpInterceptor name: initializeNative sig: ()V fnPtr: 0xb5697289  fnOffset: 0xb5697289 libshield.so!0x94289  callee: 0xb5613211 libshield.so!0x10211
[RegisterNatives] java_class: com.xingin.shield.http.XhsHttpInterceptor name: intercept sig: (Lokhttp3/Interceptor$Chain;J)Lokhttp3/Response; fnPtr: 0xb56969d9  fnOffset: 0xb56969d9 libshield.so!0x939d9  callee: 0xb5613211 libshield.so!0x10211
[RegisterNatives] java_class: com.xingin.shield.http.XhsHttpInterceptor name: initialize sig: (Ljava/lang/String;)J fnPtr: 0xb56967b1  fnOffset: 0xb56967b1 libshield.so!0x937b1  callee: 0xb5613211 libshield.so!0x10211
[RegisterNatives] java_class: com.xingin.shield.http.XhsHttpInterceptor name: destroy sig: (J)V fnPtr: 0xb5696745  fnOffset: 0xb5696745 libshield.so!0x93745  callee: 0xb5613211 libshield.so!0x10211initializeNative fnPtr: 0xb5697289  fnOffset: 0xb5697289 libshield.so!0x94289  callee: 0xb5613211 libshield.so!0x10211
intercept fnPtr: 0xb56969d9  fnOffset: 0xb56969d9 libshield.so!0x939d9  callee: 0xb5613211 libshield.so!0x10211
initialize fnPtr: 0xb56967b1  fnOffset: 0xb56967b1 libshield.so!0x937b1  callee: 0xb5613211 libshield.so!0x10211
destroy fnPtr: 0xb5696745  fnOffset: 0xb5696745 libshield.so!0x93745  callee: 0xb5613211 libshield.so!0x10211

ida

进入 JNI_OnLoad
在这里插入图片描述

进入 sub_1027C
在这里插入图片描述

进入 sub_9342C
在这里插入图片描述

先来分析一下intercept
在这里插入图片描述

进入 sub_939d8 + 1
在这里插入图片描述

进入 sub_40cfc
在这里插入图片描述

进入 sub_40ea8
在这里插入图片描述

frida hook sub_45258

在这里插入图片描述

45258函数的第一个参数的返回值是我们最终的结果,参与计算的是第二个参数v3

function dump(name, addr, legnth) {console.log("======================== " + name + " ============");console.log(hexdump(addr, { length: legnth || 32 }));
}setTimeout(function () {Java.perform(function () {var bptr = Module.findBaseAddress("libshield.so");var ptr_0x45258 = bptr.add(0x45258 + 1);Interceptor.attach(ptr_0x45258, {onEnter: function (args) {this.arg0 = args[0];this.arg2 = args[2];dump("dump 2", args[1], parseInt(args[2]));},onLeave: function (retval) {dump("retval", this.arg0, 200);}})});
}, 100)

查看 sbu_45258

进到45258函数,可以看到很清晰的算法逻辑,先循环后判断,以及byte_A8740的值,可以很容易判断出,这是一个base64
将之前hook到的v3的值做base64,结果与hook到的结果是一致的。

进入 sbu_45258
在这里插入图片描述

进入 byte_a8640
在这里插入图片描述

验证结果
在这里插入图片描述

接下来看一下v3的值是从何而来

回到intercept继续往上看
在这里插入图片描述

进入 sub_406FC
在这里插入图片描述

这里sub_40C74的第三个参数的返回值就是后面传入base64中的值
(少了16位,但是经过不同手机设备不同账号的hook结果,那16位是不变的,所以我就写死了)

进入 sub_40C74
在这里插入图片描述

发现关键函数4A94C,第一个参数是一个很长的值(经过测试,这个值是不变的,换设备和账号也不会变,于是我把它写死。。。)。
第二个参数是一个数(其实就是第三个参数的len),第三个参数是一个拼接的值,里面包含了device_id、build等信息。
第四个参数是用来存储最终结果的。ok进入函数看算法。

没时间弄了,以后有时间再跟

相关内容

热门资讯

A股玻尿酸巨头出手!2700字... 医美龙头巨子生物“成分争议”风波持续发酵。日前,美妆博主大嘴博士(香港大学化学博士郝宇)发文,质疑巨...
计算机组成原理实验1---运算...     本实验为哈尔滨工业大学计算机组成原理实验,实验内容均为个人完成,...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
前端-session、jwt 目录:   (1)session (2&#x...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
EL表达式JSTL标签库 EL表达式     EL:Expression Language 表达式语言     ...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
【Spring Cloud A... 文章目录前言Metadata元数据ClassMetadataSpring中常见的一些元注解Nacos...
React篇-关于React的... 一.简介1.介绍用于构建用户界面的 JavaScript 库2.创建项目(1)手动创建Documen...
win7 Pro 英文版添加中... win7pro x64英文版添加中文语言包1、下载语言包,并解压成lp.cab,复制到...
Android开发-Andro... 01  Android UI 1.1  UI 用户界面(User Interface,...
基于springboot教师人... 基于springboot教师人事档案管理系统【源码+论文】 开发语言:Jav...
编写软件界面的方式 本文重点解决如下问题:编写软件的界面有哪几种方式?通常情形下࿰...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
GO语言小锤硬磕十三、数组与切... 数组用来保存一组相同类型的数据,go语言数组也分一维数组和多维数组。 直接上代码看一下...
三级数据库备考--数据库应用系... 1.数据库应用系统设计包括概念设计、逻辑设计、物理设计3个步骤,每个步骤的设计活动按照...
prometheus数据持久化... https://segmentfault.com/a/1190000015710814 promet...
孩子用什么样的灯对眼睛没有伤害... 现代社会高速发展,越来越多的人开始重视身体健康,尤其是很多家长ÿ...
微软Bing GPT支持AI绘... 我想要一张图片:大象、珊瑚、火山、云朵我想要一张图片:亚特兰蒂斯...