Day2 实操:Jadx 静态分析全流程(全天实操)
一、准备测试 APK(无版权,仅学习)
简易 Demo APP 功能(你可以用 Android Studio 快速编译一个)
- 首页:判断本地布尔值
isVip,true = 显示会员,false = 普通用户 - 登录页面:输入账号密码,调用
getSign()生成接口签名 - 工具类
EncryptUtil:写死 AES 加密、MD5 签名逻辑 - 混淆打包(开启 ProGuard)模拟线上 APP 混淆效果
1.1 Android Studio安装
https://developer.android.google.cn/studio?hl=zh-cn
1.2 新建 Android 项目(匹配包名 com.reverse.demo)

选择正确模板:Empty Views Activity分类选 Phone and Tablet模板列表里找到 Empty Views Activity(不要选第一个 Empty Activity)配置页面( Language 选 Java)Name:MyApplicationPackage name:com.reverse.demo(重点,和代码包名匹配)Save location:D:\myproject\AndroidStudioProjects\MyApplicationMinimum SDK:API 24 (Android7.0)Build configuration language:保持 Kotlin DSL (build.gradle.kts)Language 下拉框:选择 Java(现在会出现 Java 选项)1.3 创建两个 Java 类 EncryptUtil + MainActivity

1. 目录结构确认
左侧项目树 app/src/main/java/com/reverse/demo/ 现在里面默认只有 MainActivity.java,我们新建工具类:
- 右键
demo文件夹 → New → Java Class → 名称填EncryptUtil→ 回车2. 粘贴 EncryptUtil 完整代码
打开
EncryptUtil.java,全部替换为下面代码:package com.reverse.demo;import java.security.MessageDigest;public class EncryptUtil { // 固定盐值 private static final String SALT = "reverse2026test"; // 生成接口sign签名 public static String getSign(String username, String pwd) { String raw = username + pwd + SALT; return md5(raw); } // MD5加密 private static String md5(String s) { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] bytes = md.digest(s.getBytes()); StringBuilder sb = new StringBuilder(); for(byte b : bytes){ String hex = Integer.toHexString(0xff & b); if(hex.length() == 1) sb.append('0'); sb.append(hex); } return sb.toString(); } catch (Exception e) { return ""; } }}3. 替换 MainActivity.java 代码
打开默认生成的
MainActivity.java,全量替换:package com.reverse.demo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;public class MainActivity extends AppCompatActivity { // 本地会员标记,默认false private boolean vipFlag = false; private TextView tvTip; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvTip = findViewById(R.id.tv_tip); // ========== UI文字逻辑:主线程执行,无耗时操作 ========== if(isVip()){ tvTip.setText("恭喜你,VIP会员"); }else{ tvTip.setText("普通用户,开通会员解锁全部功能"); } // ========== 耗时MD5签名逻辑:放到子线程,避免启动超时 ========== new Thread(new Runnable() { @Override public void run() { // 模拟登录请求(逆向练习核心代码) String sign = EncryptUtil.getSign("test123", "666666"); // 这里后续可以加打印日志、弹窗等调试代码,用于逆向Hook练习 } }).start(); } // VIP判断核心方法(逆向Hook目标) public boolean isVip(){ return vipFlag; } // 登录校验模拟(逆向分析目标) public boolean checkLogin(String user, String pass){ String sign = EncryptUtil.getSign(user, pass); // 模拟服务端校验,写死正确签名 String rightSign = EncryptUtil.getSign("admin", "123456"); return sign.equals(rightSign); }}1.4 布局文件添加 TextView(否则 findViewById 报错)
- 左侧打开
app/src/main/res/layout/activity_main.xml - 把布局代码替换为:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <TextView android:id="@+id/tv_tip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="24sp" android:textColor="#ff0000" /></LinearLayout>1.5开启代码混淆(Release 包自动混淆)
步骤 1:打开模块 build.gradle.kts(.kts 格式)
左侧找到
app/build.gradle.kts,双击打开 找到android { }内部的buildTypes代码块,替换成下面:buildTypes { release { isMinifyEnabled = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) }}新建一个proguard-rules.pro空文件
AndroidStudioProjects\MyApplication\app\proguard-rules.pro运行MainActivity.java,模拟器出现这个就ok了

最后编译成apk 菜单
Build → Generate Signed App Bundle or APK...导出 release 签名包,就是逆向素材demo.apk

Key store path选一个本地文件夹保存,比如
D:\myproject\demo.jks,文件名后缀必须是.jks
ai提示词
帮我分析如何加密,以及VIP用户账号和密码,python实现
- 左侧打开
夜雨聆风