1. 首先,需要在 unidbg 中加载 jd.apk 以及其依赖库,可以使用如下代码:
String apkPath = "/path/to/jd.apk";
String libPath = "/path/to/jd/libs";
AndroidEmulator emulator = new AndroidEmulator(apkPath);
Module module = emulator.loadLibrary(new File(libPath, "libcommonutils.so"), false);
  1. 接着,需要获取到 Java_com_jingdong_common_utils_BitmapkitUtils_getSignFromJni 方法的地址,可以使用如下代码:
DvmClass clazz = emulator.getClass("com/jingdong/common/utils/BitmapkitUtils");
DvmMethod method = clazz.getMethod("getSignFromJni", "android/content/Context", "java/lang/String", "java/lang/String", "java/lang/String", "java/lang/String", "java/lang/String", "java/lang/String");
long addr = module.findSymbolAddress("JNI_OnLoad");
long funcAddr = emulator.getMemory().getCallFunctionAddress(addr);
emulator.attach().addBreakPoint(funcAddr).detach().iterate(1);
emulator.run();
Number[] args = new Number[] {0, 0, 0, 0, 0, 0, 0};
long ret = emulator.callFunction(method.getOffset(), args, method.getReturnType()).intValue();
  1. 然后,需要准备好调用该方法所需要的参数:
DvmObject<?> context = emulator.resolveClass("android/content/Context").newObject(null);
String arg1 = "arg1";
String arg2 = "arg2";
String arg3 = "arg3";
String arg4 = "arg4";
String arg5 = "arg5";
String arg6 = "arg6";
  1. 最后,可以使用如下代码来调用该方法:
Number[] args = new Number[] {context.hashCode(), emulator.addLocalObject(context), emulator.addStringUtf(arg1), emulator.addStringUtf(arg2), emulator.addStringUtf(arg3), emulator.addStringUtf(arg4), emulator.addStringUtf(arg5), emulator.addStringUtf(arg6)};
long ret = emulator.callFunction(method.getOffset(), args, method.getReturnType()).intValue();

其中,第一个参数传入了 context 的 hashcode,第二个参数传入了 context 对象,后面的参数依次为方法的其他参数。调用完毕后,可以通过 ret 变量获取到方法的返回值。

unidbg 调用 jd.apk 中的 Java_com_jingdong_common_utils_BitmapkitUtils_getSignFromJni 方法示例

原文地址: https://www.cveoy.top/t/topic/mYUE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录