乐于分享
好东西不私藏

豆包零基础安卓逆向全教程 02

豆包零基础安卓逆向全教程 02

Day2 实操:Jadx 静态分析全流程(全天实操)

一、准备测试 APK(无版权,仅学习)

简易 Demo APP 功能(你可以用 Android Studio 快速编译一个)

  1. 首页:判断本地布尔值 isVip,true = 显示会员,false = 普通用户
  2. 登录页面:输入账号密码,调用 getSign() 生成接口签名
  3. 工具类 EncryptUtil:写死 AES 加密、MD5 签名逻辑
  4. 混淆打包(开启 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 报错)

    1. 左侧打开 app/src/main/res/layout/activity_main.xml
    2. 把布局代码替换为:
    <?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实现