跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

闲鱼 x-sign 生成算法逆向分析

闲鱼 x-sign 签名生成涉及 Native 层加密逻辑,逆向分析通常结合 Frida 与 unidbg 工具。通过内存读写追踪定位 JNI 调用点,利用 Debugger Hook 捕获关键入参,可逐步还原算法流程并实现模拟请求。

晚风叙旧发布于 2026/2/9更新于 2026/9/1196 浏览
闲鱼 x-sign 生成算法逆向分析

在之前的研究中,我们接触过多次阿里系算法内容,通常停留在某一点或关键位置的处理方法和策略。此次将探讨闲鱼 App 的 x-sign 生成过程,以及 Native 层的一些关键数据。

unidbg 环境搭建

要想探究 Native 层的奥秘,目前最方便的工具是 Frida 和 unidbg。Frida 倾向于现写现用,而 unidbg 更适合对底层函数进行逆向分析。虽然 XPosed 在 Hook 持久性上有优势,但在 Native 层的灵活调试和算法研究方面存在明显不足。

unidbg 的代码配置较为成熟,这里不再展开说明。

图片

追踪 x-sign 的读写位置

根据生成签名的位置,追踪内存的写入情况。例如以下生成的 x-sign,trace 这块内存的写入记录如下:

azU7Bc002xAAJ1j6L+zCsGD9Ijno51j3Wp3y0dj3WPdbxnL/4W9aBqSdKkp+fh5TrmXZo0wH1f8o/Z+DCO2f8wlDDmdY51j3WOdY91 最后 3 次写入为: // 开始写入 x-sign [23:00:48 332] Memory WRITE at 0x4051e260, data size = 4, data value = 0x37557a61, PC=RX@0x401335d0[libmain.so]0x1335d0, LR=RX@0x40132c68[libmain.so]0x132c68 [23:00:48 332] Memory WRITE at 0x4051e264, data size = 4, data value = 0x30306342, PC=RX@0x401337e8[libmain.so]0x1337e8, LR=RX@0x40132c68[libmain.so]0x132c68 [23:00:48 332] Memory WRITE at 0x4051e268, data size = 4, data value = 0x41417832, PC=RX@0x401337e8[libmain.so]0x1337e8, LR=RX@0x40132c68[libmain.so]0x132c68 0x37557a61 小端序字符即为:azU7 0x30306342 小端序字符即为:Bc00 0x41417832 小端序字符即为:2xAA 

查看当前函数,发现是最终的 JNI 函数 (*env)->NewStringUTF。

图片

修改参数类型后,可以更清楚地看出该函数的作用。

图片

方法正确但效率较低。如果能大胆猜测算法中使用的函数(如 MD5),可以通过关键信息、魔数等查找关键位置,过滤无用数据,多试几次即可定位到真正的函数位置。

使用 unidbg trace 工具

unidbg 对于静态逆向跟踪最友好的工具是 trace。它包含三个主要功能:

  • traceCode:记录特定位置的机器码及寄存器信息,便于静态阅读。
  • traceRead:记录特定位置内存的读取,包括函数位置、地址和内容。
  • traceWrite:记录写内存的操作。

配合 setRedirect 方法保存记录到本地,可极大提高逆向效率。

图片

图片

图片

关键位置 Debugger Hook

追踪到关键函数位置后,可以使用 Debugger 来 Hook 并查看入参内容。

attach.addBreakPoint(breakPoint, new BreakPointCallback() {
    @Override
    public boolean onHit(Emulator<?> emulator, long l) {
        count++;
        logger.debug("Hit 0x{} - {} 次", Long.toHexString(point), count);
        RegisterContext context = emulator.getContext();
        int intByRegR0 = context.getIntByReg(Arm_const.ARM_REG_R0);
        int intByRegR1 = context.getIntByReg(Arm_const.ARM_REG_R1);
        int intByRegR2 = context.getIntByReg(Arm_const.ARM_REG_R2);
        ...
    }
});

获取到 x-sign 的入参(如前面某个函数 16 字节的结果 + 41 个字节的 byte 拼接)后,可以编写代码获取关键位置的字符拼接:

byte[] bytes = UnidbgPointer.pointer(emulator, intByReg).getByteArray(0, 112);
Inspector.inspect(bytes, "x-sign");

图片

经过长时间的学习,将关键函数全部摸清后,核心逻辑已清晰可见。

图片

目录

  1. unidbg 环境搭建
  2. 追踪 x-sign 的读写位置
  3. 使用 unidbg trace 工具
  4. 关键位置 Debugger Hook

更多推荐文章

查看全部
  • 滑动窗口算法核心思路与四道经典题解
  • Git Push 失败?配置 SSH Key 实现代码推送
  • 前端开发一天通常能完成多少个页面?
  • AXURE 11 结合 AI 的智能原型设计体验
  • Android 工程师面试准备指南:核心知识点与实战技巧
  • LeetCode 390 消除游戏 Swift 算法解析
  • GitHub 热门 LLM 公开资料与大模型入门教程
  • Pix4Dmapper 大疆无人机影像数据处理流程
  • DREAM 数据库:脑电与梦境配对研究的新里程碑
  • Llama Factory GPU 利用率低:算力优化实战部署案例
  • AI 原生应用开发:Llama 模型 10 个高级用法
  • 解决 AI 生成前端同质化:Anthropic frontend-design Skill 实战
  • OpenClaw 自动化 AI 助理使用指南与技能配置详解
  • Midjourney 官网地址与语言支持说明
  • NASA 火星任务软件测试:AIGC 模拟环境攻击技术
  • 2024 年中国 AI 大模型场景应用趋势与行业分析报告
  • Flutter modular_core 在鸿蒙 HarmonyOS 上的架构适配与依赖注入实践
  • Flutter webfeed 库在鸿蒙系统的适配指南与 RSS 解析实战
  • 《Agent Runtime 工程化》第八章 Checkpoint、Resume、Rollback:导读
  • 《Agent Runtime 工程化》第十一章 源码研读方法:11.3 读项目入口

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online