[安全] Frida Labs 0x2

反编译

/* loaded from: classes3.dex */
public class MainActivity extends AppCompatActivity {
 
    /* renamed from: t1 */
    static TextView f103t1;
 
    @Override // androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(C0535R.layout.activity_main);
        f103t1 = (TextView) findViewById(C0535R.id.textview);
    }
 
    public static void get_flag(int a) throws BadPaddingException, NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, InvalidKeyException, InvalidAlgorithmParameterException {
        if (a == 4919) {
            try {
                SecretKeySpec secretKeySpec = new SecretKeySpec("HILLBILLWILLBINN".getBytes(), "AES");
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                IvParameterSpec iv = new IvParameterSpec(new byte[16]);
                cipher.init(2, secretKeySpec, iv);
                byte[] decryptedBytes = cipher.doFinal(Base64.decode("q7mBQegjhpfIAr0OgfLvH0t/D0Xi0ieG0vd+8ZVW+b4=", 0));
                String decryptedText = new String(decryptedBytes);
                f103t1.setText(decryptedText);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

原作者是用 attach 进程之后再在 Frida 那个交互终端里使用如下 js 代码来调用静态方法的
frida -U -f com.ad2001.frida0x2

Java.perform(function() {
    var a = Java.use("com.ad2001.frida0x2.MainActivity");
    a.get_flag(4919);  // method name
})

但是你会发现如果把上面的代码写入文件中然后 frida -U -f com.ad2001.frida0x2 -l _agent.js 是没有动静的
这大概是因为 get_flag 中调用了 setText 这个方法, 但是 frida 的 hook 非常早期导致 onCreate 没有执行, f103t1 未被赋值, 所以调用 get_flag 实际上会异常然后进入 catch

所以如果需要使用 spawn 方法也可以像下面这样 hook onCreate 然后保证原来的 onCreate 执行完之后再执行 get_flag

Java.scheduleOnMainThread 是 AI 让加的, 说是能让 get_flag 在 MainThread 中运行, 如果 get_flag 不在主线程中运行会抛出异常. 未验证, 之后准备自己写一个试一下

import Java from "frida-java-bridge";
 
if (Java.available) {
    Java.perform(() => {
        const MainActivity = Java.use("com.ad2001.frida0x2.MainActivity");
        
        MainActivity.onCreate.overload("android.os.Bundle").implementation = 
        function (savedInstanceState: any) {
            this.onCreate(savedInstanceState);
            Java.scheduleOnMainThread(() => {
                MainActivity.get_flag(4919);
            });
        };
    });
} else {
    console.log("No Java VM in this process");
}