unidbg
unidbg copied to clipboard
请问 Map<String, byte[]> map 应该如何传参?
原函数是 public static native String XXSign(String str, String str2, Map<String, byte[]> map, String str3, int i); 这里一直不知道 Map<String, byte[]> map 应该如何传参。 测试了 [Ljava/lang/Map 报错: Exception in thread "main" java.lang.IllegalStateException: Unsupported arg: {}
阅读代码找到这一段,好像不支持传递map ?请各位帮忙看看,谢谢
ProxyDvmObject.createObject(vm, map)
ProxyDvmObject.createObject(vm, map)
请问有参考的代码示例吗?
或者其他的代码片段,我参考下。谢谢
把相关代码发出来,写个参考给你
也可以参考 ArrayListObject 创建一个 Map
APP链接:https://www.wandoujia.com/apps/280945 加密代码路径:com.anjuke.mobile.sign.SignUtil
调用 so 的android 代码 SignUtil.java。 so文件如附件 libsignutil.so。
备注:个人研究使用,不会用于商业目的。
Banny @.***> 于2021年7月12日周一 下午3:09写道:
也可以参考 ArrayListObject 创建一个 Map
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/zhkl0228/unidbg/issues/332#issuecomment-878029665, or unsubscribe https://github.com/notifications/unsubscribe-auth/AUMS5442N2KNLXDUL2EC2ETTXKIL7ANCNFSM5AGA2ZSQ .
写的 java 代码呢?
你写的 unidbg 调用代码也要
好的,我单独发你邮箱。
package com.github.unidbg.android;
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.LibraryResolver;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.DalvikModule;
import com.github.unidbg.linux.android.dvm.DvmClass;
import com.github.unidbg.linux.android.dvm.StringObject;
import com.github.unidbg.linux.android.dvm.VM;
import com.github.unidbg.linux.android.dvm.jni.ProxyClassFactory;
import com.github.unidbg.linux.android.dvm.jni.ProxyDvmObject;
import com.github.unidbg.memory.Memory;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
//@Service
//@Scope("prototype")
public class AnjukeTools {
private final AndroidEmulator emulator;
private final DvmClass cSignUtil;
private final VM vm;
private static LibraryResolver createLibraryResolver() {
return new AndroidResolver(23);
}
private static AndroidEmulator createARMEmulator() {
return AndroidEmulatorBuilder.for32Bit()
.setProcessName("com.anjuke.android.app")
.build();
}
public AnjukeTools() {
emulator = createARMEmulator();
final Memory memory = emulator.getMemory();
memory.setLibraryResolver(createLibraryResolver());
memory.disableCallInitFunction();
vm = emulator.createDalvikVM();
vm.setDvmClassFactory(new ProxyClassFactory());
vm.setVerbose(false);
DalvikModule dm = vm.loadLibrary(new File("unidbg-android/src/test/resources/example_binaries/armeabi-v7a/libsignutil.so"), false);
cSignUtil = vm.resolveClass("com/anjuke/mobile/sign/SignUtil");
dm.callJNI_OnLoad(emulator);
}
public void destroy() throws IOException {
emulator.close();
}
public String getSign0(String str, String str2, Map<String, byte[]> map, String str3, int i) {
String methodSign = "getSign0(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;I)Ljava/lang/String;";
StringObject obj = cSignUtil.callStaticJniMethodObject(emulator, methodSign, str, str2, ProxyDvmObject.createObject(vm, map), str3, i);
return obj.getValue();
}
private void test() {
String str = "aa";
String str2 = "bb";
Map<String, String> myMap = new HashMap<String, String>() {{
put("a", "b");
put("b", "b");
}};
Map<String, byte[]> hashMap = new HashMap<>();
for (String str4 : myMap.keySet()) {
hashMap.put(str4, myMap.get(str4).getBytes(StandardCharsets.UTF_8));
}
System.out.println(hashMap);
String str3 = "cc";
int i = 10;
System.out.println("sign=" + getSign0(str, str2, hashMap, str3, i));
}
public static void main(String[] args) throws Exception {
AnjukeTools anjukeTools = new AnjukeTools();
anjukeTools.test();
anjukeTools.destroy();
}
}
测试代码提交到了 https://github.com/zhkl0228/unidbg/blob/master/unidbg-android/src/test/java/com/anjuke/mobile/sign/SignUtil.java
谢谢。我测试一下。
我测试了确实可以。非常感谢。
@zhkl0228 看了代码是重写了 callIntMethod 和 callObjectMethod 这两个方法。 请问有相关的使用文档没。后续踩坑就不用麻烦你了。
再次感谢。
大佬,安居客样本报错 [16:04:51 110] WARN [com.github.unidbg.linux.ARM32SyscallHandler] (ARM32SyscallHandler:467) - handleInterrupt intno=2, NR=-1073744032, svcNumber=0x11e, PC=unidbg@0xfffe0274, LR=RX@0x40001c9b[libsignutil.so]0x1c9b, syscall=null java.lang.reflect.InaccessibleObjectException: Unable to make public java.lang.Object[] java.util.HashMap$KeySet.toArray() accessible: module java.base does not "opens java.util" to unnamed module @44a3ec6b at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) at java.base/java.lang.reflect.Method.setAccessible(Method.java:193) at com.github.unidbg.linux.android.dvm.DvmMethod.setMember(DvmMethod.java:308) at com.github.unidbg.linux.android.dvm.jni.ProxyUtils.findMethod(ProxyUtils.java:247) at com.github.unidbg.linux.android.dvm.jni.ProxyJni.callObjectMethod(ProxyJni.java:383) at com.github.unidbg.linux.android.dvm.DvmMethod.callObjectMethod(DvmMethod.java:74) at com.github.unidbg.linux.android.dvm.DalvikVM$31.handle(DalvikVM.java:501) at com.github.unidbg.linux.ARM32SyscallHandler.hook(ARM32SyscallHandler.java:103) at com.github.unidbg.arm.backend.UnicornBackend$6.hook(UnicornBackend.java:305) at unicorn.Unicorn$NewHook.onInterrupt(Unicorn.java:128) at unicorn.Unicorn.emu_start(Native Method) at com.github.unidbg.arm.backend.UnicornBackend.emu_start(UnicornBackend.java:331) at com.github.unidbg.AbstractEmulator.emulate(AbstractEmulator.java:370) at com.github.unidbg.AbstractEmulator.eFunc(AbstractEmulator.java:446) at com.github.unidbg.arm.AbstractARMEmulator.eFunc(AbstractARMEmulator.java:220) at com.github.unidbg.Module.emulateFunction(Module.java:158) at com.github.unidbg.linux.android.dvm.DvmObject.callJniMethod(DvmObject.java:133) at com.github.unidbg.linux.android.dvm.DvmClass.callStaticJniMethodObject(DvmClass.java:292) at com.anjuke.mobile.sign.AnjukeTools.getSign0(AnjukeTools.java:62) at com.anjuke.mobile.sign.AnjukeTools.test(AnjukeTools.java:81) at com.anjuke.mobile.sign.AnjukeTools.main(AnjukeTools.java:87) [16:04:51 113] WARN [com.github.unidbg.AbstractEmulator] (AbstractEmulator:389) - emulate RX@0x40001bad[libsignutil.so]0x1bad exception sp=unidbg@0xbffff6c8, msg=Unable to make public java.lang.Object[] java.util.HashMap$KeySet.toArray() accessible: module java.base does not "opens java.util" to unnamed module @44a3ec6b, offset=9ms Exception in thread "main" java.lang.NullPointerException: Cannot invoke "com.github.unidbg.linux.android.dvm.StringObject.getValue()" because "obj" is null at com.anjuke.mobile.sign.AnjukeTools.getSign0(AnjukeTools.java:63) at com.anjuke.mobile.sign.AnjukeTools.test(AnjukeTools.java:81) at com.anjuke.mobile.sign.AnjukeTools.main(AnjukeTools.java:87)
Process finished with exit code 1 是map 的问题吗?
我测试了确实可以。非常感谢。
大佬可以发一份你安居客的代码吗我这一直报map 的错误,谢谢
我测试了确实可以。非常感谢。
大佬可以发一份你安居客的代码吗我这一直报map 的错误,谢谢
我测试了确实可以。非常感谢。
我找下,找不到再那里了。
@Python-time 你这个报错可能是因为你使用了高版本jdk导致的
@Python-time 你这个报错可能是因为你使用了高版本jdk导致的
我也遇到了同样的问题,jdk版本 oracle jdk @1.8,安居客的脚本,@zhkl0228 大佬能指导下吗?
java.lang.reflect.InaccessibleObjectException: Unable to make public java.lang.Object[] java.util.HashMap$KeySet.toArray() accessible: module java.base does not "opens java.util" to unnamed module @ca263c2 at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:200) at java.base/java.lang.reflect.Method.setAccessible(Method.java:194) at com.github.unidbg.linux.android.dvm.DvmMethod.setMember(DvmMethod.java:318)
@zhkl0228 麻烦大佬看下,感谢!