逆向工程

逆向工程

一、核心逆向思维

逆向工程的核心是 “大胆假设,小心求证”。你看到一个加密参数,需要根据经验假设它可能如何产生,然后用工具去验证你的假设。本文提供的技巧就是为了让你的“假设”更准,“求证”更快。

二、关键词搜索技巧(静态分析)

当你在抓包中看到一个加密参数(如 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 存储):

代码特征:

java

SharedPreferences sp = getSharedPreferences("sp_token", MODE_PRIVATE);

SharedPreferences.Editor editor = sp.edit();

editor.putString("token", tokenValue); // 保存操作

editor.apply(); // 或 .commit()

逆向查看方法:

bash

adb 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 , Content-Type。

统一加密/签名:对所有请求的 Body 或参数进行加密,生成 sign 签名参数。

统一解密:对返回的响应体(Response Body)进行解密。

2. 如何定位拦截器?

关键词搜索:在 Jadx 中直接搜索 Interceptor、implements Interceptor、okhttp3.Interceptor。这是最快的方法。

Hook 大法(动态验证):如果搜索不到,或者想确认所有拦截器,可以 Hook OkHttp 的 Builder 类:

javascript

Java.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 网络请求库,通过接口和注解来定义请求,极大简化了代码。

代码特征:

java

public interface ApiService {

@POST("/login")

@FormUrlEncoded

Call login(@Field("username") String user, @Field("password") String pwd);

@GET("/user/info")

Call 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 或 Hook addInterceptor 方法,定位统一的加密/签名逻辑。

动态验证:编写 Frida Hook 脚本,对疑似加密函数进行动态调试,验证你的猜测。

这些技巧是连接静态反编译代码和动态网络行为之间的桥梁,熟练掌握能极大提升你的逆向分析效率。

💡 关键要点

一、核心逆向思维 逆向工程的核心是 “大胆假设,小心求证”。你看到一个加密参数,需要根据经验假设它可能如何产生,然后用工具去验证

更多疯狂内容

易建联目前在cba哪个队

易建联目前在cba哪个队

🔥 221 📅 09-19
苹果Air双系统安装教程(苹果Air双系统安装指南,一键切换操作系统体验更多可能)
《怪物猎人世界》黑龙版本铳枪怎么配装 铳枪最强配装推荐