unidbg icon indicating copy to clipboard operation
unidbg copied to clipboard

请问 Map<String, byte[]> map 应该如何传参?

Open yuncaiji opened this issue 2 years ago • 22 comments

原函数是 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: {}

yuncaiji avatar Jul 12 '21 04:07 yuncaiji

image 阅读代码找到这一段,好像不支持传递map ?请各位帮忙看看,谢谢

yuncaiji avatar Jul 12 '21 04:07 yuncaiji

ProxyDvmObject.createObject(vm, map)

zhkl0228 avatar Jul 12 '21 06:07 zhkl0228

ProxyDvmObject.createObject(vm, map)

请问有参考的代码示例吗?

yuncaiji avatar Jul 12 '21 06:07 yuncaiji

或者其他的代码片段,我参考下。谢谢

yuncaiji avatar Jul 12 '21 07:07 yuncaiji

把相关代码发出来,写个参考给你

zhkl0228 avatar Jul 12 '21 07:07 zhkl0228

也可以参考 ArrayListObject 创建一个 Map

zhkl0228 avatar Jul 12 '21 07:07 zhkl0228

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 .

yuncaiji avatar Jul 12 '21 07:07 yuncaiji

写的 java 代码呢?

zhkl0228 avatar Jul 12 '21 07:07 zhkl0228

你写的 unidbg 调用代码也要

zhkl0228 avatar Jul 12 '21 07:07 zhkl0228

好的,我单独发你邮箱。

yuncaiji avatar Jul 12 '21 07:07 yuncaiji

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();
    }

}


zhkl0228 avatar Jul 12 '21 08:07 zhkl0228

测试代码提交到了 https://github.com/zhkl0228/unidbg/blob/master/unidbg-android/src/test/java/com/anjuke/mobile/sign/SignUtil.java

zhkl0228 avatar Jul 12 '21 09:07 zhkl0228

谢谢。我测试一下。

yuncaiji avatar Jul 12 '21 10:07 yuncaiji

我测试了确实可以。非常感谢。

yuncaiji avatar Jul 12 '21 11:07 yuncaiji

@zhkl0228 看了代码是重写了 callIntMethod 和 callObjectMethod 这两个方法。 请问有相关的使用文档没。后续踩坑就不用麻烦你了。

再次感谢。

yuncaiji avatar Jul 12 '21 11:07 yuncaiji

大佬,安居客样本报错 [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 的问题吗?

Python-time avatar Oct 15 '21 08:10 Python-time

我测试了确实可以。非常感谢。

大佬可以发一份你安居客的代码吗我这一直报map 的错误,谢谢

Python-time avatar Oct 18 '21 03:10 Python-time

我测试了确实可以。非常感谢。

大佬可以发一份你安居客的代码吗我这一直报map 的错误,谢谢

我测试了确实可以。非常感谢。

Python-time avatar Oct 18 '21 03:10 Python-time

我找下,找不到再那里了。

yuncaiji avatar Oct 18 '21 03:10 yuncaiji

@Python-time 你这个报错可能是因为你使用了高版本jdk导致的

SeeFlowerX avatar Feb 13 '22 03:02 SeeFlowerX

@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)

yjshi2015 avatar Jun 16 '22 09:06 yjshi2015

@zhkl0228 麻烦大佬看下,感谢!

yjshi2015 avatar Jun 16 '22 09:06 yjshi2015