百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

如何获取一个APP的所有接口API和参数签名信息?

haoteby 2025-08-26 17:20 4 浏览

先给出所需的工具:

步骤工具/技术
抓包Charles、Fiddler、Wireshark、tcpdump
反编译Jadx、JEB、Apktool
动态调试Frida、IDA Pro、Unidbg/Unicorn(模拟执行)
加密分析JEB(DES/MD5识别)、IDA Pro(Native层分析)
模拟请求Postman、curl、Reqable、Python(requests库)、


(声明:本文章仅用于技术交流学习,所有用到的代码和数据均做了脱敏处理,请勿用于非法用途)

第一步:抓包分析,网络请求

1,抓包分析:通过Charles、Fiddler或Wireshark等工具捕获应用的HTTP/HTTPS请求,分析请求URL、参数、头部信息及响应内容。

Charles/Fiddler: 更易用的界面,但仅限HTTP/HTTPS

fiddler

注意:【若客户端校验证书(部分APP),可能导致Charles无法捕获流量,需通过逆向绕过证书绑定,如Xposed模块】

Wireshark:适合分析底层协议(如TCP握手、TLS版本),但需手动过滤HTTP流量。

wireshark

2,分析关键点:重点关注加密参数(如Encrypt字段)、动态Token、签名机制等,记录多次请求中变化的参数。

第二步: 静态分析, 反编译与代码解析

1,脱壳与反编译

若应用加壳,需先通过脱壳脚本提取DEX文件(如使用Frida、Xposed模块或自定义脚本)。

针对主流加固方案(如360加固宝),可使用脱壳工具(如Frida-Dump,BlackDEX等)提取DEX。

或可以自己分析壳的加载机制,定位原始DEX内存地址:

// 核心函数:Hook libart.so的OpenMemory方法function hook_dex_dump(packageName) {    var libart = Module.findBaseName('libart.so');    var symbols = ['_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_',                   '_ZN3art13DexFileLoader10OpenCommonEPKhjS2_jPKNS_10OatDexFileEbbPS9_PNS0_12VerifyResultE'];        symbols.forEach(function(symbol) {        var openMemory = Module.findExportByName('libart.so', symbol);        if (openMemory) {            Interceptor.attach(openMemory, {                onEnter: function(args) {                    // 获取DEX起始地址和大小                    var dex_begin = is64bit() ? this.context.x1 : args[1];                    var dex_size = is64bit() ? this.context.x2 : args[2];                                        // 校验magic头                    var magic = Memory.readUtf8String(ptr(dex_begin), 4);                    if (magic.indexOf('dex') === 0) {                        // 生成唯一文件名                        var timestamp = new Date().getTime();                        var savePath = "/sdcard/Download/" + packageName + "_" + timestamp + ".dex";                                                // 内存转储                        var dexData = Memory.readByteArray(ptr(dex_begin), dex_size);                        var file = new File(savePath, "wb");                        file.write(dexData);                        file.close();                                                console.log("[+] Dumped DEX to: " + savePath);                    }                },                onLeave: function(retval) {                    // 可选:处理返回结果                }            });        }    });} // 判断CPU架构function is64bit() {    return Process.arch.indexOf('64') !== -1;} // 启动脱壳Java.perform(function() {    var currentPackage = Java.use("android.app.ActivityThread").currentApplication().getPackageName();    hook_dex_dump(currentPackage);    console.log("[*] Hooking libart.so for package: " + currentPackage);});

脱壳完成后,使用Jadx、JEB或Apktool反编译APK,分析Java/Smali代码及资源文件。

2,静态分析:

在代码中搜索网络请求相关类(如OkHttpClient、Retrofit、HttpURLConnection),定位发送/接收函数(如execute()、onResponse())。

通过字符串搜索接口URL或参数名,或通过正则表达式匹配URL模式。

第三步: 动态分析,定位加密与参数生成逻辑

1,加密算法分析:

若参数被加密(如MD5、DES、AES),需在代码中定位加密函数,通常通过搜索关键词(如Cipher、SecretKey)或Hook加密方法验证逻辑。

常用算法清单:

算法名称类型密钥长度/摘要长度特点常见模式/填充
AES对称加密128/192/256位高效安全,广泛用于数据加密;需关注分组模式(如CBC、ECB)和填充方式模式:CBC、ECB、CFB等;填充:PKCS5Padding、PKCS7Padding、NoPadding
RSA非对称加密1024/2048位公钥加密、私钥解密;用于密钥交换或数字签名;需结合摘要算法(如SHA)填充:PKCS1Padding、NoPadding
DES对称加密56位安全性低,易受暴力破解;已逐渐被淘汰,常见于遗留系统模式:ECB、CBC;填充:PKCS5Padding
3DES对称加密112/168位DES的增强版,三次加密提升安全性;性能较低,适用于兼容性场景模式:CBC、ECB;填充:PKCS5Padding
MD5消息摘要(哈希)128位生成固定长度哈希值;存在碰撞漏洞,仅用于校验数据完整性无模式或填充
SHA系列消息摘要(哈希)SHA-1(160位)等安全性高于MD5(如SHA-256);用于签名、数据完整性校验无模式或填充
Base64编码将二进制数据转为ASCII字符串;常用于加密后数据的传输或存储标准编码/URL安全编码
Hex编码二进制数据以十六进制表示;便于调试和显示无特殊模式
ECC非对称加密256/384/521位基于椭圆曲线理论,安全性高且密钥短;适用于移动设备等资源受限环境模式:ECDSA(签名)、ECDH(密钥交换);填充:无

对于Native层加密,需用IDA Pro分析SO库,定位JNI函数或JNI_OnLoad。

2,参数构造逻辑:

分析参数拼接方式(如时间戳、设备ID、签名),常见于工具类或拦截器(如Interceptor)。

动态调试(如Frida、Xposed)跟踪参数生成过程,验证加密算法与密钥。

3,代码混淆应对:

通过字符串解密工具或动态调试还原关键类名/方法名。

分析Proguard/R8规则(如mapping.txt)还原符号。

第四步: 提取API接口及参数

1,接口提取方法:

从抓包结果直接提取URL及参数结构。

在代码中搜索API配置类(如ApiConstants),或通过全局Map结构存储的接口路径。

分析RESTful接口设计,结合HTTP方法(GET/POST)及资源路径(如/user/{id})。

2,参数类型推断:

通过代码分析参数数据类型(如JSON字段、表单数据)及校验逻辑(如非空检查、格式校验)。

若参数为动态生成(如设备指纹),需结合设备信息(IMEI、MAC地址)分析生成逻辑

第五步: 动态验证与模拟请求

1,Hook验证:

使用Frida Hook网络请求函数(如OkHttp的Interceptor),打印完整请求参数。

修改参数值测试接口响应,验证参数合法性。

Java.perform(function() {    // 获取OkHttp核心类    var OkHttpClient = Java.use('okhttp3.OkHttpClient');    var Request = Java.use('okhttp3.Request');    var Buffer = Java.use('okio.Buffer');    // Hook OkHttpClient的newCall方法     OkHttpClient.newCall.overload('okhttp3.Request').implementation = function(request) {        // 解析请求信息        var url = request.url().toString();        var method = request.method();        var headers = request.headers().toString();        var body = request.body();        var bodyContent = '';        // 读取请求体内容 [[4, 16]]        if (body) {            try {                var buffer = Buffer.$new();                body.writeTo(buffer);                bodyContent = buffer.readUtf8();                buffer.$dispose();            } catch(e) {                bodyContent = '无法解析的请求体类型';            }        }        // 打印请求信息        console.log('\n=== 请求捕获 ===');        console.log(`URL: ${url}`);        console.log(`Method: ${method}`);        console.log(`Headers: ${headers}`);        console.log(`Body: ${bodyContent}`);        console.log('================\n');        // 执行原始调用        return this.newCall(request);    };    // Hook响应处理    var Response = Java.use('okhttp3.Response');    Response.body.implementation = function() {        var body = this.body();        try {            var content = body.string();            console.log('\n=== 响应捕获 ===');            console.log(`Status: ${this.code()} ${this.message()}`);            console.log(`Response Body: ${content}`);            console.log('================\n');            // 重建body对象避免消费问题            return Java.use('okhttp3.ResponseBody')                .create(body.contentType(), content);        } catch(e) {            return body;        }    };});

2,模拟请求:

根据分析结果,用Python(requests库)或Postman/Curl命令模拟请求,复现加密逻辑。

对比模拟结果与真实请求,确保参数生成正确性。

如何用Curl模拟请求:

a, 从Charles导出cURL命令:右键点击抓包的请求,选择“Copy cURL Command”。

b, 调整命令:可能需处理特殊符号(如^需转义为^^\^


最后,整理并输出API文档:

整理接口URL、请求方法(GET/POST)、参数列表(名称、类型、是否必填)、加密方式及示例请求。

标注敏感参数(如签名、Token)的生成规则。

(----------下面给个示例---------)

a. 用户登录接口

接口功能:用户身份认证,获取访问令牌
URL[https://api.wolfcard.com/v2/auth/login](https://api.wolfcard.com/v2/auth/login)
请求方法:POST
参数列表

参数名类型是否必填说明敏感参数
usernameString用户名
passwordStringSHA256加密后的密码
timestampLong当前时间戳(毫秒)
nonce_strString16位随机字符串
signatureString请求签名(见生成规则)

加密方式

  • 密码加密password = SHA256(原始密码 + timestamp)
  • 签名生成规则(需逆向获取):
  1. 拼接参数:raw_str = username + "|" + password + "|" + timestamp + "|" + nonce_str
  2. 加盐计算:signature = HMAC_SHA256(raw_str, key="s3cr3tK3y")
  3. 结果转为大写:signature = signature.toUpperCase()

示例请求

POST /v2/auth/login HTTP/1.1Content-Type: application/json{  "username": "test_user",  "password": "A3F291B8D45C...",  "timestamp": 1735689200000,  "nonce_str": "7x9a2b4c6d8e0f1",  "signature": "E9D3A1B5F7C8..."}


b. 订单查询接口

接口功能:获取用户订单列表
URL[https://api.wolfcard.com/v3/orders/list](https://api.wolfcard.com/v3/orders/list)
请求方法:GET
参数列表

参数名类型是否必填说明敏感参数
user_idString用户ID(登录后返回)
start_timeLong查询起始时间(毫秒)
end_timeLong查询结束时间(毫秒)
tokenString登录令牌
signString动态签名(见生成规则)

加密方式

  • 签名生成规则(基于逆向分析):
  1. 按参数名升序排列:sorted_params = end_time, start_time, token, user_id
  2. 拼接键值对:raw_str = "end_time=1735689200000&start_time=1735602800000&token=xxxx&user_id=1001"
  3. 加盐计算:sign = MD5("secretPrefix" + raw_str + "secretSuffix")
  4. 结果转为大写:sign = sign.toUpperCase()


示例请求

GET /v3/orders/list?user_id=1001&start_time=1735602800000&end_time=1735689200000&token=eyJhbGci...&sign=8D7A2B4C6E9F0... HTTP/1.1


c. 数据加密接口(Native层)

接口功能:敏感数据加密传输
URL[
https://api.wolfcard.com/native/encrypt](https://api.
wolfcard.com/native/encrypt)
请求方法:POST
参数列表

参数名类型是否必填说明敏感参数
dataString原始JSON数据
encrypt_vString加密版本(如v1/aes)
request_idString请求唯一标识

加密方式(逆向发现):

  • AES加密流程
  1. 生成随机IV:iv = Random(16 bytes)
  2. 加密密钥:key = SHA256(device_id + imei).substring(0, 32)
  3. 加密数据:encrypted_data = AES_CBC_PKCS7(data, key, iv)
  4. 组合结果:final_data = base64(iv + encrypted_data)


示例请求

POST /native/encrypt HTTP/1.1Content-Type: application/octet-stream{  "data": "5tC1oP3x...",  // Base64编码的加密数据  "encrypt_v": "aes_v2",  "request_id": "req_20250417001"}


声明:本文章仅用于技术交流学习,所有用到的代码和数据均做了脱敏处理,请勿用于非法用途!


相关推荐

Chrome OS 41 用 Freon 取代 X11_chrome os atom

在刚发布的ChromeOS41里,除了常规的Wi-Fi稳定性提升(几乎所有系统的changelog里都会包含这一项)、访客模式壁纸等之外,还存在底层改变。这一更新中Google移除...

苹果iPad Pro再曝光 有望今年六月发布

自进入2015年以后,有关大屏iPad的消息便一直不绝于耳,之前就有不少媒体猜想这款全新的平板电脑将会在三月发布,不过可惜的是我么只在那次发布会上看到了MacBookPro。近日@Ubuntu团队便...

雷卯针对香橙派Orange Pi 5 Max开发板防雷防静电方案

一、应用场景高端平板、边缘计算、人工智能、云计算、AR/VR、智能安防、智能家居、Linux桌面计算机、Linux网络服务器、Android平板、Android游戏机...

Ubuntu Server无法更新问题解决_ubuntu server not found

上周老家的一台运行UbuntuServer的盒子无法连接上了,中秋这两天回来打开,顺手更新一下发现更新报错。提示`E:Releasefileforhttps://mirrors.aliyun...

虚幻引擎5正式版发布:古墓丽影&巫师新作采用、新一代实时渲染

机器之心报道编辑:杜伟、陈萍虚幻引擎5的目标是「助力各种规模的团队在视觉领域和互动领域挑战极限,施展无限潜能」。...

AMD Milan-X双路霄龙7773X平台基准测试曝光 CPU缓存总量超1.5GB

OpenBenchmarking基准测试数据库刚刚曝光了AMDMilan-X双路霄龙7773X平台的跑分成绩,虽然很快就被撤下,但我们还是知晓了高达1.6GB的总CPU缓存。早些时...

ROS机器人建模_ros机器人硬件搭建

...

全网最新的Dify(1.7.2)私有化离线部署教程(ARM架构)

Hello,大家好!近期工作中有涉及到Dify私有化离线部署,特别是针对于一些国产设备。因此特别整理了该教程,实测有效!有需要的小伙伴可以参考下!本文主要针对Dify1.7.2最新版本+国产操作系...

在ubuntu下新建asp.net core项目_创建ubuntu

本文一步步讲述在ubuntu下用visualstudiocode创建asp.netcore项目的过程。step1:环境操作系统:virtualbox下安装的lubuntu。请不要开启“硬件...

在晶晨A311D2处理器上进行Linux硬件视频编码
在晶晨A311D2处理器上进行Linux硬件视频编码

在KhadasVIM4AmogicA311D2SBC上,我更多的时间是在使用Ubuntu22.04。它的总体性能还不错,只不过缺少3D图形加速和硬件视...

2025-08-26 17:22 haoteby

Nacos3.0重磅来袭!全面拥抱AI,单机及集群模式安装详细教程!

之前和大家分享过JDK17的多版本管理及详细安装过程,然后在项目升级完jdk17后又发现之前的注册和配置中心nacos又用不了,原因是之前的nacos1.3版本的,版本太老了,已经无法适配当前新的JD...

电影质量级渲染来了!虚幻引擎5.3正式发布:已开放下载

快科技9月8日消息,日前,Unrealengine正式发布了虚幻引擎5.3,带来了大量全方位的改进。...

2025如何选购办公电脑?极摩客mini主机英特尔系列选购指南

当下,迷你主机的性能越来越强,品类也越来越多。但是CPU是不变的,基本都是AMD和英特尔的。有一个小伙伴在评论区提问,我应该如何在众多机器中选购一台符合自己的迷你主机呢?那今天我们优先把我们的系列,分...

ubuntu 20.04+RTX4060 Ti+CUDA 11.7+cudnn

ububtu添加国内源sudocp/etc/apt/sources.list/etc/apt/sources.list.backupsudovim/etc/apt/sources.lis...

Linux Mint 18将重新基于Ubuntu 16.04 带来更好硬件支持

项目负责人ClementLefebvre在本月6日披露了关于LinuxMint18“Sarah”操作系统的大量信息,包括带来全新扁平化体验的Mint-Y主题。而现在,这款将于年底之前上线的操作...