[安全] 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");
}