package com.ad2001.frida0x4; publicclassCheck { public String get_flag(int a) { if (a == 1337) { } returnnewString(decoded); } return""; } }
这次需要进行实例化 $new()
模板
1 2 3 4 5 6 7
Java.perform(function() {
var <class_reference> = Java.use("<package_name>.<class>"); var <class_instance> = <class_reference>.$new(); // Class Object <class_instance>.<method>(); // Calling the method
})
使用效果 这样就可以在控制台打印flag
1 2 3 4 5 6 7 8
Java.perform(function() {
var check = Java.use("com.ad2001.frida0x4.Check"); var check_obj = check.$new(); // Class Object var res = check_obj.get_flag(1337); // Calling the method console.log("FLAG " + res);
[Pixel 4::Frida 0x5 ]->Error: java.lang.ClassNotFoundException: Didn't find class "com.ad2001.frida0x5.MainActivity" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib64, /product/lib64, /system/lib64, /product/lib64]] at <anonymous> (frida/node_modules/frida-java-bridge/lib/env.js:124) at <anonymous> (frida/node_modules/frida-java-bridge/lib/env.js:115) at apply (native) at <anonymous> (frida/node_modules/frida-java-bridge/lib/env.js:97) at <anonymous> (frida/node_modules/frida-java-bridge/lib/class-factory.js:488) at value (frida/node_modules/frida-java-bridge/lib/class-factory.js:949) at value (frida/node_modules/frida-java-bridge/lib/class-factory.js:954) at _make (frida/node_modules/frida-java-bridge/lib/class-factory.js:165) at use (frida/node_modules/frida-java-bridge/lib/class-factory.js:62) at _chooseObjectsArtPreA12 (frida/node_modules/frida-java-bridge/lib/class-factory.js:335) at <anonymous> (frida/node_modules/frida-java-bridge/lib/class-factory.js:303) at kt (frida/node_modules/frida-java-bridge/lib/android.js:586) Error: java.lang.ClassNotFoundException: Didn't find class "com.ad2001.frida0x5.MainActivity" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib64, /product/lib64, /system/lib64, /product/lib64]] at <anonymous> (frida/node_modules/frida-java-bridge/lib/env.js:124) at <anonymous> (frida/node_modules/frida-java-bridge/lib/env.js:115) at apply (native) at <anonymous> (frida/node_modules/frida-java-bridge/lib/env.js:97) at <anonymous> (frida/node_modules/frida-java-bridge/lib/class-factory.js:488) at value (frida/node_modules/frida-java-bridge/lib/class-factory.js:949) at value (frida/node_modules/frida-java-bridge/lib/class-factory.js:954) at _make (frida/node_modules/frida-java-bridge/lib/class-factory.js:165) at use (frida/node_modules/frida-java-bridge/lib/class-factory.js:62) at _chooseObjectsArtPreA12 (frida/node_modules/frida-java-bridge/lib/class-factory.js:335) at <anonymous> (frida/node_modules/frida-java-bridge/lib/class-factory.js:303) at kt (frida/node_modules/frida-java-bridge/lib/android.js:586)
[Pixel 4::Frida 0x5 ]-> Error: flag: cannot call instance method without an instance at value (frida/node_modules/frida-java-bridge/lib/class-factory.js:1139) at e (frida/node_modules/frida-java-bridge/lib/class-factory.js:610) at <anonymous> (D:\anquan_question\frida\test.js:3) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOps (frida/node_modules/frida-java-bridge/index.js:250) at <anonymous> (frida/node_modules/frida-java-bridge/index.js:225) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOpsWhenReady (frida/node_modules/frida-java-bridge/index.js:244) at perform (frida/node_modules/frida-java-bridge/index.js:204) at <eval> (D:\anquan_question\frida\test.js:4) Error: flag: cannot call instance method without an instance at value (frida/node_modules/frida-java-bridge/lib/class-factory.js:1139) at e (frida/node_modules/frida-java-bridge/lib/class-factory.js:610) at <anonymous> (D:\anquan_question\frida\test.js:3) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOps (frida/node_modules/frida-java-bridge/index.js:250) at <anonymous> (frida/node_modules/frida-java-bridge/index.js:225) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOpsWhenReady (frida/node_modules/frida-java-bridge/index.js:244) at perform (frida/node_modules/frida-java-bridge/index.js:204) at <eval> (D:\anquan_question\frida\test.js:4)
0x5和0x2的区别在于一个是public void flag(int code)而另一个是静态方法public static void get_flag(int a) (差了一个static) 如果把0x5当成静态方法来处理那么就会出现很多的报错
看起来可以模仿0x4
那么现在就需要调用实例化方法 在0x4我们为了调用get_flag实例化了Check类
1 2 3 4 5 6 7 8 9 10
package com.ad2001.frida0x4; publicclassCheck { public String get_flag(int a) { if (a == 1337) { } returnnewString(decoded); } return""; } }
[Pixel 4::Frida 0x5 ]-> Error: flag: cannot call instance method without an instance at value (frida/node_modules/frida-java-bridge/lib/class-factory.js:1139) at e (frida/node_modules/frida-java-bridge/lib/class-factory.js:610) at <anonymous> (D:\anquan_question\frida\test.js:3) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOps (frida/node_modules/frida-java-bridge/index.js:250) at <anonymous> (frida/node_modules/frida-java-bridge/index.js:225) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOpsWhenReady (frida/node_modules/frida-java-bridge/index.js:244) at perform (frida/node_modules/frida-java-bridge/index.js:204) at <eval> (D:\anquan_question\frida\test.js:4) Error: flag: cannot call instance method without an instance at value (frida/node_modules/frida-java-bridge/lib/class-factory.js:1139) at e (frida/node_modules/frida-java-bridge/lib/class-factory.js:610) at <anonymous> (D:\anquan_question\frida\test.js:3) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOps (frida/node_modules/frida-java-bridge/index.js:250) at <anonymous> (frida/node_modules/frida-java-bridge/index.js:225) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOpsWhenReady (frida/node_modules/frida-java-bridge/index.js:244) at perform (frida/node_modules/frida-java-bridge/index.js:204) at <eval> (D:\anquan_question\frida\test.js:4) Error: java.lang.RuntimeException: Can't create handler inside thread Thread[Thread-6,10,main] that has not called Looper.prepare() at <anonymous> (frida/node_modules/frida-java-bridge/lib/env.js:124) at value (frida/node_modules/frida-java-bridge/lib/class-factory.js:1237) at e (frida/node_modules/frida-java-bridge/lib/class-factory.js:643) at apply (native) at value (frida/node_modules/frida-java-bridge/lib/class-factory.js:1141) at e (frida/node_modules/frida-java-bridge/lib/class-factory.js:610) at <anonymous> (D:\anquan_question\frida\test.js:4) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOps (frida/node_modules/frida-java-bridge/index.js:250) at <anonymous> (frida/node_modules/frida-java-bridge/index.js:225) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOpsWhenReady (frida/node_modules/frida-java-bridge/index.js:244) at perform (frida/node_modules/frida-java-bridge/index.js:204) at <eval> (D:\anquan_question\frida\test.js:7) Error: java.lang.RuntimeException: Can't create handler inside thread Thread[Thread-7,10,main] that has not called Looper.prepare() at <anonymous> (frida/node_modules/frida-java-bridge/lib/env.js:124) at value (frida/node_modules/frida-java-bridge/lib/class-factory.js:1237) at e (frida/node_modules/frida-java-bridge/lib/class-factory.js:643) at apply (native) at value (frida/node_modules/frida-java-bridge/lib/class-factory.js:1141) at e (frida/node_modules/frida-java-bridge/lib/class-factory.js:610) at <anonymous> (D:\anquan_question\frida\test.js:4) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOps (frida/node_modules/frida-java-bridge/index.js:250) at <anonymous> (frida/node_modules/frida-java-bridge/index.js:225) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOpsWhenReady (frida/node_modules/frida-java-bridge/index.js:244) at perform (frida/node_modules/frida-java-bridge/index.js:204) at <eval> (D:\anquan_question\frida\test.js:7)
Java.performNow(function() { Java.choose('com.ad2001.frida0x5.MainActivity', { onMatch: function(instance) { // "instance" is the instance for the MainActivity console.log("Instance found"); instance.flag(1337); // Calling the function }, onComplete: function() {} }); });
var check = Java.use("com.ad2001.frida0x6.Checker"); // class reference check.num1.value = 1234; check.num2.value = 4321;
})
报错如下
1 2 3 4 5 6 7 8 9 10
Error: Cannot access an instance field without an instance at set (frida/node_modules/frida-java-bridge/lib/class-factory.js:1321) at <anonymous> (D:\anquan_question\frida\test.js:3) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOps (frida/node_modules/frida-java-bridge/index.js:250) at <anonymous> (frida/node_modules/frida-java-bridge/index.js:225) at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12) at _performPendingVmOpsWhenReady (frida/node_modules/frida-java-bridge/index.js:244) at perform (frida/node_modules/frida-java-bridge/index.js:204) at <eval> (D:\anquan_question\frida\test.js:7)
.text:0000000000000864 .text:0000000000000864 ; =============== S U B R O U T I N E ======================================= .text:0000000000000864 .text:0000000000000864 ; Attributes: bp-based frame .text:0000000000000864 .text:0000000000000864 ; bool __fastcall Java_com_ad2001_frida0x8_MainActivity_cmpstr(__int64, __int64, __int64) .text:0000000000000864 EXPORT Java_com_ad2001_frida0x8_MainActivity_cmpstr .text:0000000000000864 Java_com_ad2001_frida0x8_MainActivity_cmpstr .text:0000000000000864 ; DATA XREF: LOAD:0000000000000380↑o
var flag_adr = Module.findExportByName("liba0x9.so", "Java_com_ad2001_a0x9_MainActivity_check_1flag"); Interceptor.attach(flag_adr, { onEnter: function (args) { console.log("catch the flag");
}, onLeave: function (retval) { //retval = 1337;//错误的赋值 retval.replace(1337); console.log("change the result"); }
public final classMainActivityextendsAppCompatActivity { public final native StringstringFromJNI(); protected voidonCreate(Bundle savedInstanceState) { activityMainBinding.sampleText.setText(stringFromJNI()); }
.text:000000000001DD5C RET .text:000000000001DD5C ; } // starts at 1DD3C .text:000000000001DD5C ; End of function sub_1DD3C .text:000000000001DD5C .text:000000000001DD60 .text:000000000001DD60 ; =============== S U B R O U T I N E ======================================= .text:000000000001DD60 .text:000000000001DD60 ; Attributes: bp-based frame .text:000000000001DD60 .text:000000000001DD60 ; __int64 __fastcall get_flag(__int64 result, int) .text:000000000001DD60 EXPORT _Z8get_flagii .text:000000000001DD60 _Z8get_flagii ; DATA XREF: LOAD:0000000000001648↑o
所在库就是基址 找到libfrida0xa.so的基址 var base = Module.findBaseAddress("libfrida0xa.so"); 然后加上偏移 var flag_adr = base.add(0x1DD60); 就得到了目标地址
具体操作
1 2 3 4 5 6 7 8 9
var base = Module.findBaseAddress("libfrida0xa.so"); var flag_adr = base.add(0x1DD60); var native_adr = newNativePointer(flag_adr); //创建NativePointer
那么现在的解题思路就是: 1.nop掉.text:0000000000015248 B.NE loc_1532C 2.将它替换成.text:000000000001524C B loc_15250
B.NE代表Branch if Not Equal,也就是当两个操作数不相等时才会跳转 B代表跳转
修改内存:https://learnfrida.info/advanced_usage/#patching-memory patchcode Memory.patchCode API 允许我们修改 X 地址处的 N 个字节,该地址以 NativePointer 的形式给出,此指针必须是可写的,以便我们对其进行修改。在某些系统(如 iOS)中,地址指针在映射到内存之前会写入临时位置。因此,代码编写者的第一个参数应该是 code 参数,而不是 openPtr)。
var writer = newX86Writer(<address_of_the_instruction>); try { // Insert instructions // Flush the changes to memory writer.flush(); } finally { // Dispose of the X86Writer to free up resources writer.dispose(); }
putBImm(target): put a B instruction 2.将它替换成.text:000000000001524C B loc_15250
1 2 3 4 5 6 7 8 9 10
var libbase = Module.findBaseAddress("libfrida0xb.so"); var jmp = libbase.add(0x15248); var target = libbase.add(0x1524c); Memory.patchCode(jmp, 4, function (code) { const cw = newArm64Writer(code, { pc: jmp }); //cw.putNop(); cw.putBImm(target); cw.flush(); } );
另一种写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var adr = Module.findBaseAddress("libfrida0xb.so").add(0x15248); // Addres of the b.ne instruction Memory.protect(adr, 0x1000, "rwx"); var writer = newArm64Writer(adr); // ARM64 writer object var target = Module.findBaseAddress("libfrida0xb.so").add(0x1524c); // Address of the next instruction b LAB_00115250
try {
writer.putBImm(target); // Inserts the <b target> instruction in the place of b.ne instruction writer.flush();
console.log(`Branch instruction inserted at ${adr}`); } finally {