当前位置: 首页 > article >正文

Shopee风控算法逆向 - Unidbg补环境实战解析

1. Shopee风控算法逆向分析入门最近在研究Shopee的风控机制时我发现他们的Native层加密算法特别有意思。作为一个常年和移动安全打交道的开发者今天想和大家分享下使用Unidbg模拟执行Shopee风控算法的完整过程。Shopee作为东南亚头部电商平台其风控系统主要依赖名为libshpssdk.so的Native库。这个库负责生成关键请求参数比如常见的x-sap-ri签名。要逆向这个算法传统动态调试方法会遇到各种反调试检测而Unidbg这个神器就能完美避开这些麻烦。先说说我踩过的坑最开始直接用Frida去Hook发现根本拿不到完整调用链。后来转用Unidbg又遇到各种环境缺失报错。经过两周的折腾终于摸清了整套流程。下面我会从定位算法、补环境到完整调用一步步带大家走通这个逆向过程。2. 定位关键加密函数2.1 从HTTP请求入手首先用抓包工具观察Shopee的API请求会发现每个请求都带有x-sap-ri等加密参数。这些参数明显是客户端生成的我们需要找到生成逻辑的具体位置。我用的方法是Hook HashMap.put方法因为Java层最终都会通过Map来组装请求头。写个Frida脚本Java.perform(function(){ var HashMap Java.use(java.util.HashMap); HashMap.put.implementation function(key, value){ if(key x-sap-ri){ console.log(Java.use(android.util.Log).getStackTraceString( Java.use(java.lang.Throwable).$new())); console.log(x-sap-ri value:, value); } return this.put(key, value); } });运行后会打印出完整的调用栈关键信息如下at com.shopee.shpssdk.SHPSSDK.uvwvvwvvw(Native Method) at com.shopee.shpssdk.SHPSSDK.requestDefense(SHPSSDK.java:95)2.2 分析Native调用链通过JADX反编译APK定位到com.shopee.shpssdk.wvvvuwwu这个类其中有个native方法public static native String vuwuuwvw(byte[] bArr, byte[] bArr2);这就是我们要找的加密入口接下来需要确认对应的so库。通过Hook System.loadLibrary发现加载的是libshpssdk.so。3. Unidbg环境搭建3.1 基础框架搭建先创建一个基础的Unidbg模拟环境public class ShopeeEmulator extends AbstractJni { private final AndroidEmulator emulator; private final VM vm; private final Module module; private final DvmClass cWvvvuwwu; public ShopeeEmulator() { emulator AndroidEmulatorBuilder.for64Bit() .addBackendFactory(new DynarmicFactory(true)) .build(); Memory memory emulator.getMemory(); memory.setLibraryResolver(new AndroidResolver(23)); vm emulator.createDalvikVM(new File(shopee.apk)); vm.setJni(this); vm.setVerbose(true); DalvikModule dm vm.loadLibrary(new File(libshpssdk.so), true); dm.callJNI_OnLoad(emulator); module dm.getModule(); cWvvvuwwu vm.resolveClass(com/shopee/shpssdk/wvvvuwwu); } }3.2 首次运行报错分析直接调用加密函数会抛出异常public void callNative() { byte[] arg1 https://mall.shopee.com.my/api/v4/search/....getBytes(); byte[] arg2 null; StringObject result (StringObject)cWvvvuwwu.callStaticJniMethodObject( emulator, vuwuuwvw([B[B)Ljava/lang/String;, arg1, arg2); System.out.println(result.getValue()); }错误日志显示[WARN] handleInterrupt intno2, NR-127248, svcNumber0x10a这是个JNI调用异常说明缺少必要的环境参数。需要通过补环境来解决。4. 系统性补环境实战4.1 补JNI基础环境首先补上最基础的Android环境Override public DvmObject? callObjectMethodV(BaseVM vm, DvmObject? obj, String signature, VaList vaList) { switch(signature) { case android/app/ActivityThread-getApplication()Landroid/app/Application;: return vm.resolveClass(android/app/Application).newObject(null); case android/content/Context-getPackageName()Ljava/lang/String;: return new StringObject(vm, com.shopee.my); case android/content/pm/PackageManager-getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;: return new StringObject(vm, com.android.vending); } return super.callObjectMethodV(vm, obj, signature, vaList); }4.2 处理SharedPreferences算法会读取SP中的配置信息case android/content/SharedPreferences-getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;: String key vaList.getObjectArg(0).getValue().toString(); if(key.equals(E1YASQpPEEUQWR1CCUwVVVVw)) { return new StringObject(vm, f0VMRgEAAAAIAAAA4BwNgAAAAACAAAAJAAAAAVUUwFVA1JSSlNfXgZKU1BUA0oGVQVXSlYFVVNRBFFQUldQAwMAAAAIAAAAAFRQAQAAAAA); } return vaList.getObjectArg(1);4.3 补全应用信息还需要补全PackageInfo等应用基础信息Override public DvmObject? getObjectField(BaseVM vm, DvmObject? obj, String signature) { switch(signature) { case android/content/pm/PackageInfo-applicationInfo:Landroid/content/pm/ApplicationInfo;: return new ApplicationInfo(vm); case android/content/pm/ApplicationInfo-sourceDir:Ljava/lang/String;: return new StringObject(vm, /data/app/com.shopee.my/base.apk); } return super.getObjectField(vm, obj, signature); }5. 完整调用与结果验证5.1 最终调用代码补全环境后加密调用代码如下public void callNative() { byte[] arg1 https://mall.shopee.com.my/api/v4/search/....getBytes(); byte[] arg2 null; StringObject result (StringObject)cWvvvuwwu.callStaticJniMethodObject( emulator, vuwuuwvw([B[B)Ljava/lang/String;, arg1, arg2); System.out.println(加密结果 result.getValue()); }5.2 结果验证成功获取到如下格式的加密结果{ 253b8c85: hlGD6Ox0ErCcsv0i1q6GFgqetT, x-sap-ri: f4e55b675d1842b8a2f1d01301146b15925ce8c171ea82224c30 }多次调用会发现x-sap-ri每次都会变化说明算法内部有时间戳或随机数参与运算。6. 关键问题解决技巧6.1 常见报错处理JNI调用异常通常是缺少对应的Java环境需要通过AbstractJni补全内存访问错误检查so是否完整加载必要时补全依赖库参数格式错误确保传入的byte[]格式与Java层一致6.2 性能优化建议使用Dynarmic后端加速执行缓存已补的环境对象对固定返回值做内存缓存整个逆向过程中最耗时的部分是补全各种环境参数。建议先通过Frida动态分析获取真实参数再在Unidbg中模拟。遇到问题多看看Unidbg的日志输出里面通常会有明确提示。

相关文章:

Shopee风控算法逆向 - Unidbg补环境实战解析

1. Shopee风控算法逆向分析入门 最近在研究Shopee的风控机制时,我发现他们的Native层加密算法特别有意思。作为一个常年和移动安全打交道的开发者,今天想和大家分享下使用Unidbg模拟执行Shopee风控算法的完整过程。 Shopee作为东南亚头部电商平台&…...

OpenClaw定时任务实践:Qwen3.5-4B-Claude实现凌晨数据备份自动化

OpenClaw定时任务实践:Qwen3.5-4B-Claude实现凌晨数据备份自动化 1. 为什么需要夜间自动化备份 作为一个独立开发者,我经常遇到这样的困境:白天在多个项目间切换开发,晚上关机前才想起忘记备份关键数据。手动执行备份不仅占用休…...

通义千问3-Reranker-0.6B入门指南:app.py核心逻辑解析+自定义路由扩展

通义千问3-Reranker-0.6B入门指南:app.py核心逻辑解析自定义路由扩展 1. 引言 如果你正在寻找一个既轻量又强大的中文重排序模型,那么通义千问3-Reranker-0.6B绝对值得你花时间了解一下。这个只有6亿参数的模型,在文本检索和排序任务上的表…...

揭秘Synopsys EDA中的AI黑科技:DSO.ai如何改变传统芯片设计流程

揭秘Synopsys EDA中的AI黑科技:DSO.ai如何重塑芯片设计范式 当芯片制程迈入3纳米时代,单个晶体管尺寸已接近物理极限,设计复杂度却呈指数级增长。传统EDA工具如同手持计算尺的工程师面对摩天大楼蓝图——方法论需要根本性变革。这正是DSO.ai诞…...

手把手教你用Vivado 2021配置Zynq UltraScale+ GTH回环测试(附工程源码)

Zynq UltraScale GTH回环测试实战指南:从原理到源码解析 在FPGA开发领域,高速串行接口的验证一直是工程师面临的关键挑战。Xilinx UltraScale架构中的GTH收发器以其高达16.3Gbps的线速率,成为医疗成像、雷达信号处理等高性能应用的理想选择。…...

百川2-13B-Chat惊艳效果展示:同一提示词下Temperature=0.3与0.9输出对比

百川2-13B-Chat惊艳效果展示:同一提示词下Temperature0.3与0.9输出对比 你有没有想过,同一个问题问给同一个AI,为什么每次的回答都不太一样?有时候它像个严谨的学者,回答得一丝不苟;有时候又像个天马行空的…...

SpaceClaim流体域实战:从零到一构建仿真计算空间

1. 流体域基础概念与工程价值 第一次接触流体域这个概念时,我正对着电脑屏幕发愁——明明在物理世界里空气无处不在,为什么在仿真软件里非得画个"框"才能计算?这个看似简单的方盒子,后来成了我CFD生涯中最重要的"…...

如何通过Qwen Code多语言功能提升开发效率

如何通过Qwen Code多语言功能提升开发效率 【免费下载链接】qwen-code Qwen Code is a coding agent that lives in the digital world. 项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code Qwen Code作为一款智能编程助手,其强大的多语言支持功能…...

Phi-3-mini-128k-instruct开源镜像:个人学习研究专用+严禁非法用途声明

Phi-3-mini-128k-instruct开源镜像:个人学习研究专用严禁非法用途声明 1. 模型简介 Phi-3-Mini-128K-Instruct是一个38亿参数的轻量级开放模型,属于Phi-3系列的最新成员。这个模型经过精心训练,特别适合需要高质量文本生成和推理能力的应用…...

DLSS Swapper完整指南:高效管理游戏DLSS、FSR与XeSS版本

DLSS Swapper完整指南:高效管理游戏DLSS、FSR与XeSS版本 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专业的游戏性能优化工具,专门用于管理NVIDIA DLSS、AMD FSR和Intel X…...

Vue3实战:5分钟搞定全局WebSocket封装(含心跳检测与断线重连)

Vue3全局WebSocket封装实战:心跳检测与断线重连的最佳实践 WebSocket在现代Web应用中扮演着越来越重要的角色,特别是在需要实时数据更新的场景中。Vue3作为当前最流行的前端框架之一,与WebSocket的结合能够为开发者提供强大的实时交互能力。本…...

无GPU也能用:OpenClaw+Qwen3.5-4B-Claude-GGUF低配设备实测

无GPU也能用:OpenClawQwen3.5-4B-Claude-GGUF低配设备实测 1. 为什么要在低配设备上折腾AI? 去年我入手了一台二手MacBook Air,4GB内存的配置在当下看来确实有些捉襟见肘。但作为一名技术爱好者,我始终对本地运行大模型充满好奇…...

Carla仿真实战:3种高效定位车辆生成点的方法(附代码示例)

Carla仿真实战:3种高效定位车辆生成点的方法(附代码示例) 在自动驾驶仿真开发中,精确控制车辆生成位置是构建测试场景的基础需求。许多开发者在使用Carla时都遇到过车辆"乱跑"的问题——明明指定了坐标,生成…...

别再当黑匣子用了!手把手教你用FastMCP的tool()、resource()和prompt()装饰器,从源码理解到实战避坑

FastMCP装饰器深度解析:从tool()到prompt()的实战进阶指南 1. 为什么需要理解装饰器内部机制? 在Python开发领域,装饰器(Decorator)是一种强大的元编程工具,而FastMCP框架中的tool()、resource()和prompt()装饰器更是将这一理念发…...

RexUniNLU新手入门指南:3步搞定智能家居、金融、医疗场景意图识别

RexUniNLU新手入门指南:3步搞定智能家居、金融、医疗场景意图识别 1. 认识RexUniNLU:零样本意图识别利器 RexUniNLU是一款基于Siamese-UIE架构的轻量级自然语言理解框架,它能让你无需准备标注数据,仅通过简单的标签定义就能完成…...

突破性Unity游戏插件框架实战指南:BepInEx从零到精通的完全手册

突破性Unity游戏插件框架实战指南:BepInEx从零到精通的完全手册 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款专为Unity游戏设计的革命性插件框架&…...

iStore增强插件:从网络优化到智能家居,一站式解决家庭与极客的哪些核心痛点?

1. iStore增强插件:家庭网络优化的全能助手 家里WiFi信号时好时坏?孩子上网课总卡顿?智能设备频繁掉线?这些问题可能困扰过很多家庭用户。iStore增强插件就像给路由器装上了"涡轮增压",它能从多个维度提升家…...

Go语言中的并发模式:从WaitGroup到errgroup

Go语言中的并发模式:从WaitGroup到errgroup 作为一个写了十几年代码的Go后端老兵,我深刻体会到并发编程的重要性。Go语言以其简洁的并发模型著称,通过goroutine和channel,我们可以轻松实现高效的并发程序。今天咱们就聊聊Go语言中…...

RPCS3游戏汉化实战指南:从零构建多语言游戏体验

RPCS3游戏汉化实战指南:从零构建多语言游戏体验 【免费下载链接】rpcs3 PS3 emulator/debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 还在为PS3经典游戏的日文界面而困扰吗?通过RPCS3模拟器的强大补丁系统,您可以…...

FlowState Lab创意作品展:从音乐旋律到光影变化的波动艺术

FlowState Lab创意作品展:从音乐旋律到光影变化的波动艺术 1. 波动艺术的新维度 当数据不再只是冰冷的数字,而是化作跳动的音符、流动的光影和变幻的图形,这就是FlowState Lab带来的创意革命。我们最近完成了一系列跨媒介艺术实验&#xff…...

nli-distilroberta-base在数据库智能查询中的应用:自然语言转SQL实战

nli-distilroberta-base在数据库智能查询中的应用:自然语言转SQL实战 1. 引言:当自然语言遇上数据库查询 "帮我找出上个月销售额超过10万的产品"——这样的需求如果能让数据库直接理解该多好?传统SQL查询需要专业技术人员编写复杂…...

Linux服务器无GPU也能跑!Ollama部署DeepSeek-R1模型存储路径自定义与性能调优指南

Linux服务器无GPU高效部署DeepSeek-R1模型全攻略:从存储路径优化到性能调优 当你在云服务器或老旧设备上尝试运行AI模型时,是否经常遇到存储空间不足或性能低下的困扰?本文将带你深入探索如何在无GPU的Linux环境中,通过Ollama高效…...

别再只盯着ONNX了!用PNNX把PyTorch模型轻松转成ncnn格式(安卓部署实战)

深度学习模型安卓部署实战:PNNX与ONNX转换工具深度对比 在移动端部署深度学习模型时,模型转换环节往往是开发者遇到的第一个技术瓶颈。许多团队习惯性地选择ONNX作为中间格式,却忽视了更高效的替代方案。本文将带您深入探索PNNX这一专为PyTor…...

nRF52832上电启动全解析:从MBR到Bootloader的跳转机制与寄存器配置

nRF52832上电启动全解析:从MBR到Bootloader的跳转机制与寄存器配置 当nRF52832芯片通电瞬间,一场精密的硬件芭蕾在微秒级时间内悄然上演。这颗蓝牙低功耗SoC的启动流程远非简单的"通电即运行",而是涉及存储器分区、寄存器配置和多重…...

Sparse Sinkhorn Attention:点云处理中的高效全局注意力机制

1. 什么是Sparse Sinkhorn Attention? 如果你玩过乐高积木,应该知道把一堆零散的积木块拼成完整模型的过程。点云数据处理就像这个拼积木的过程——我们需要从成千上万个三维坐标点中识别出物体的结构和特征。传统方法就像只用相邻积木块拼装&#xff0c…...

OpenPose终极指南:10分钟掌握人体姿态估计核心技术

OpenPose终极指南:10分钟掌握人体姿态估计核心技术 【免费下载链接】openpose 项目地址: https://gitcode.com/gh_mirrors/op/openpose 想要快速搭建专业级的人体姿态识别系统吗?OpenPose作为业界领先的开源姿态估计库,能够实时检测图…...

告别官方驱动:深入解读ES7210寄存器,打造你自己的ESP32音频采集库

告别官方驱动:深入解读ES7210寄存器,打造你自己的ESP32音频采集库 在嵌入式音频开发领域,ES7210作为一款高性能多通道麦克风ADC芯片,因其出色的信噪比和灵活的配置选项,成为ESP32平台上音频采集的热门选择。然而&#…...

探索式学习:UMA模型在水分解催化中的应用指南

探索式学习:UMA模型在水分解催化中的应用指南 【免费下载链接】ocp Open Catalyst Projects library of machine learning methods for catalysis 项目地址: https://gitcode.com/GitHub_Trending/oc/ocp 突破传统计算瓶颈:UMA模型的核心价值解析…...

OpenClaw+nanobot自动化测试:24小时监控网站可用性

OpenClawnanobot自动化测试:24小时监控网站可用性 1. 为什么需要自动化网站监控 作为个人站长,我经常遇到这样的困扰:半夜网站突然宕机,直到第二天收到用户反馈才发现问题。传统监控方案要么价格昂贵,要么配置复杂&a…...

从零开始:3小时掌握Arduino ESP32开发板完整安装与配置指南 [特殊字符]

从零开始:3小时掌握Arduino ESP32开发板完整安装与配置指南 🚀 【免费下载链接】arduino-esp32 Arduino core for the ESP32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 想要快速上手ESP32物联网开发吗?无论你是…...