逆向工程 --- APP 逆向实战技巧精华总结
一、核心逆向思维
逆向工程的核心是 “大胆假设,小心求证”。你看到一个加密参数,需要根据经验假设它可能如何产生,然后用工具去验证你的假设。本文提供的技巧就是为了让你的“假设”更准,“求证”更快。
二、关键词搜索技巧(静态分析)
当你在抓包中看到一个加密参数(如 sign, token, pwd)时,在 Jadx 等反编译工具中如何快速定位?
搜索优先级(从高到低):
URL 路径片段 (最高效):
例如,请求地址是
https://api.example.com/v1/user/login。优先搜索
/user/login或user/login。这能直接定位到处理该接口的类和方法(尤其是使用 Retrofit 时),极大缩小范围。
参数映射关键字:
搜索
"pwd"(带引号,避免匹配到变量名)、put("pwd"、@Field("pwd")、@Query("pwd")。这能直接找到参数被放入请求体或 URL 的位置。
参数名本身:
直接搜索
pwd。但这会匹配到大量无关代码,需结合上下文仔细筛选。
技巧:优先搜索独一无二的字符串(如 URL 路径、特殊的参数名),再搜索常见参数名。
三、数据持久化存储分析
App 经常需要将服务器下发的关键数据(如 Token、SessionID、用户信息)保存到本地,以供后续请求使用。常见存储方式及逆向查看方法:
1. SharedPreferences (XML 存储):
代码特征:
javaSharedPreferences sp = getSharedPreferences("sp_token", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("token", tokenValue); // 保存操作
editor.apply(); // 或 .commit()逆向查看方法:
bashadb shell
su
cd /data/data/<包名>/shared_prefs # 进入应用的数据存储目录
ls # 查看所有.xml文件
cat sp_token.xml # 查看文件内容重要性:Token 等关键信息常在此处。App 启动时优先从这里读取,无需重新登录。分析这里的数据对理解认证流程至关重要。
2. 其他存储方式:
数据库 (SQLite): 路径一般为
/data/data/<包名>/databases/,可使用sqlite3命令或图形化工具查看。文件存储: 可能保存在
/data/data/<包名>/files/或内置存储(/sdcard/)目录下。
四、网络层拦截分析(Interceptor)
现代 Android App 广泛使用 OkHttp 作为网络库,其强大之处在于拦截器 (Interceptor) 机制。加密、签名、添加通用请求头等操作通常在这里完成。
1. 拦截器的作用:
添加通用头:如
User-Agent,Authorization: Bearer <token>,Content-Type。统一加密/签名:对所有请求的 Body 或参数进行加密,生成
sign签名参数。统一解密:对返回的响应体(Response Body)进行解密。
2. 如何定位拦截器?
关键词搜索:在 Jadx 中直接搜索
Interceptor、implements Interceptor、okhttp3.Interceptor。这是最快的方法。Hook 大法(动态验证):
如果搜索不到,或者想确认所有拦截器,可以 Hook OkHttp 的 Builder 类:javascriptJava.perform(function () {
var OkHttpClient_Builder = Java.use("okhttp3.OkHttpClient$Builder");
OkHttpClient_Builder.addInterceptor.overload('okhttp3.Interceptor').implementation = function (interceptor) {
console.log("[+] 发现拦截器: " + interceptor.$className);
return this.addInterceptor(interceptor); // 继续执行原方法
};
});运行此脚本后,观察 App 的网络请求,所有被添加的拦截器类名都会被打印出来,然后你就可以在 Jadx 中重点分析这些类。
五、Retrofit 框架识别与利用
Retrofit 是基于 OkHttp 的 RESTful 网络请求库,通过接口和注解来定义请求,极大简化了代码。
代码特征:
javapublic interface ApiService {
@POST("/login")
@FormUrlEncoded
Call<ResponseBody> login(@Field("username") String user, @Field("password") String pwd); @GET("/user/info")
Call<ResponseBody> getUserInfo(@Query("uid") String userId);
}逆向价值:
接口地图:Retrofit 的接口类就像一个接口地图,直接展示了所有 API 的URL、请求方法(GET/POST)、参数名。这比你盲目搜索要高效得多。
搜索捷径:在 Jadx 中搜索
@POST、@GET、/login等注解或 URL 路径,能让你瞬间定位到网络请求的发起位置,是逆向分析非常理想的切入点。
总结与工作流建议
当你拿到一个 App,面对加密参数时,可以遵循以下流程:
抓包:确认目标接口和加密参数。
搜 URL:在 Jadx 中优先搜索接口 URL 路径,尝试直接定位到 Retrofit 接口或相关类。
搜参数:搜索加密参数名(如
sign),寻找其被赋值的地方。查存储:查看
/data/data/<包名>/shared_prefs/下的 XML 文件,获取 Token 等关键信息。挖拦截器:搜索
Interceptor或 HookaddInterceptor方法,定位统一的加密/签名逻辑。动态验证:编写 Frida Hook 脚本,对疑似加密函数进行动态调试,验证你的猜测。
这些技巧是连接静态反编译代码和动态网络行为之间的桥梁,熟练掌握能极大提升你的逆向分析效率。
逆向工程 --- APP 逆向实战技巧精华总结的更多相关文章
- iOS逆向实战与工具使用(微信添加好友自动确认)
iOS逆向实战与工具使用(微信添加好友自动确认) 原文链接 源码地址 WeChatPlugin-iOS Mac OS 版微信小助手(远程控制.消息防撤回.自动回复.微信多开) 一.前言 本篇主要实现在 ...
- Hybrid App开发实战
Hybrid App开发实战 作者 李秉骏 发布于 九月 04, 2013 | [引言]近年来随着移动设备类型的变多,操作系统的变多,用户需求的增加,对于每个项目启动前,大家都会考虑到的成本,团队成员 ...
- [转帖]APP逆向神器之Frida【Android初级篇】
APP逆向神器之Frida[Android初级篇] https://juejin.im/post/5d25a543e51d455d6d5358ab 说到逆向APP,很多人首先想到的都是反编译,但是单看 ...
- 关于《精通移动App测试实战:技术、工具和案例》图书勘误信息
首先,对由于我们工作的疏忽向<精通移动App测试实战:技术.工具和案例>读者朋友们表示歉意,同时已将这些问题反馈给了出版社编辑同志,再版时将会统一修正: 其次,勘误信息请参看附件pdf文档 ...
- Android实战技巧:深入解析AsyncTask
AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...
- iOS开发——开发必备OC篇&彩票实战之精华讲解
彩票实战之精华讲解 在这段时间自己研究并学习关于彩票项目开发的时候遇到各种坑,各种技术点以前或许之前用过但是却用起来不是那么熟悉,所以没遇到一个重点的地方我就会记录一下,希望不会再有下次. 本文主要讲 ...
- Unity User Group 北京站图文报道:《Unity虚拟现实实战技巧》
时间来到了盛夏,北京UUG活动也来到了第八期.本次活动的主题为<Unity虚拟现实实战技巧>,为此我们邀请了4位资深的行业大神.这次我们仍然在北京市海淀区丹棱街5号微软大厦举行活动,在这里 ...
- 逆向实战干货,快速定位自动捡阳光Call,或者标志
逆向实战干货,快速定位自动捡阳光Call,或者标志 注意: 关于CE和OD的使用,这里不再多说,快速定位,默认大家已经有了CE基础,或者OD基础. 第一种方法,找Call 第一步,打开CE,搜索阳光值 ...
- 逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复
逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复 首先我们要知道这个OD的Bug是什么. 我们调试一个UNICODE的窗口,看下其窗口过程. 一丶查看OllyDbg 的Bug 1.1spy++ ...
- 一文了解安卓APP逆向分析与保护机制
"知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...
随机推荐
- MySQL报'Access denied for user 'root'@'localhost' (using password: NO)'错误的解决--九五小庞
当在命令提示符下执行该命令时,报下列错误 [root@clvn]# mysqladmin -u root password "sorry"mysqladmin: connect t ...
- 进阶篇:3.4)DFM-机械加工件设计总章
本章目的:设计符合机械加工工艺的零件. 1.基础阅读 进阶篇:2)DFMA的介绍 进阶篇:2.3)DFMA的运用方法(个人方法) 2.机械加工概念 2.1 机械加工定义 广义的机械加工是指一种用加工机 ...
- unity代码编译时间分析工具
https://github.com/needle-tools/compilation-visualizer 工具2 Editor Iteration Profiler (EIP) 地址: https ...
- Crontab定时任务更新SOLO以及备份数据库
Linux定时执行任务Crontab 1. 安装Crontab 1.1 安装命令 # vixie-cron软件包是cron的主程序 yum install vixie-cron # crontabs软 ...
- 小程序requestUtil工具类
1.前言 开发小程序已经有一段时间了,都没有写过小程序相关的文章,踩过坑挺多,把这些坑记下来,下次就不会再犯了. 小程序自带的请求方法不是特别方便,无意中得到了一个工具类,因此把这个工具类分享出来 2 ...
- 我最喜欢的 C# 14 新特性
C# 14 无疑是一个令人翘首以盼的版本,它带来了许多新特性和改进,旨在让我们的编程工作更加高效和便捷.官方公布的新特性列表相当丰富,包括: 扩展成员 (Extension members) 空条件赋 ...
- A Fruitful Journey
When the winter holiday approaching, I just dreamed about a big sleep. However, the holiday made a t ...
- Restricted RPS CodeForces - 1245B
https://vjudge.net/contest/356807#problem/H 题意 A和B进行剪刀石头布n次 A已知B出的类型顺序,同时规定A必须出三种类型的次数 A能赢n/2局则算A赢,并 ...
- Qml中QtObject的用法
QtObject 类型是一个非可视元素,仅包含 objectName 属性. 如果需要一个非常轻量级的类型来包含一组自定义属性,那么创建一个 QtObject 会很合适: 1.自定义属性 以下是一个简 ...
- 已经写了一个linux下可运行的全屏程序,如何让系统启动的时候自动起来,不要看到操作系统的桌面界面
要在Linux系统启动时自动运行你的全屏程序,并且不显示操作系统的桌面界面,你可以按照以下步骤进行设置: 1. **设置默认运行级别(或目标)**: - 对于使用Systemd的现代Linux发行版( ...