zhkl0228 / unidbg

Allows you to emulate an Android native library, and an experimental iOS emulation
Apache License 2.0
3.79k stars 959 forks source link

如何补一个返回 HashMap 的环境? #638

Closed HappyTsing closed 3 months ago

HappyTsing commented 3 months ago

这样子补环境,执行的时候会报错。

{
    @Override
    public DvmObject<?> getStaticObjectField(BaseVM vm, DvmClass dvmClass, String signature) {
        switch (signature) {
            case "com/android/internal/os/PowerProfile->sPowerItemMap:Ljava/util/HashMap;":
                Map<Object,Object> map = new HashMap<Object,Object>();
                map.put("battery.capacity",5000.0);
                return ProxyDvmObject.createObject(vm, map);

    }
        return super.getStaticObjectField(vm, dvmClass, signature);
}

报错如下:

JNIEnv->FindClass(java/util/Map) was called from RX@0x401a7190[libpdd_secure.so]0x1a7190
JNIEnv->GetMethodID(java/util/Map.get(Ljava/lang/Object;)Ljava/lang/Object;) => 0x7f03ab0a was called from RX@0x401a7200[libpdd_secure.so]0x1a7200
[14:03:55 492]  WARN [com.github.unidbg.linux.ARM32SyscallHandler] (ARM32SyscallHandler:546) - handleInterrupt intno=2, NR=2130946826, svcNumber=0x11f, PC=unidbg@0xfffe0284, LR=RX@0x401a7d04[libpdd_secure.so]0x1a7d04, syscall=null
com.github.unidbg.arm.backend.BackendException: dvmObject=java.util.HashMap@127d7908, dvmClass=class java/util/HashMap, jmethodID=unidbg@0x7f03ab0a
    at com.github.unidbg.linux.android.dvm.DalvikVM$32.handle(DalvikVM.java:550)
    at com.github.unidbg.linux.ARM32SyscallHandler.hook(ARM32SyscallHandler.java:138)
    at com.github.unidbg.arm.backend.Unicorn2Backend$11.hook(Unicorn2Backend.java:352)
    at com.github.unidbg.arm.backend.unicorn.Unicorn$NewHook.onInterrupt(Unicorn.java:109)
    at com.github.unidbg.arm.backend.unicorn.Unicorn.emu_start(Native Method)
    at com.github.unidbg.arm.backend.unicorn.Unicorn.emu_start(Unicorn.java:312)
    at com.github.unidbg.arm.backend.Unicorn2Backend.emu_start(Unicorn2Backend.java:389)
    at com.github.unidbg.AbstractEmulator.emulate(AbstractEmulator.java:385)
    at com.github.unidbg.thread.BaseTask.continueRun(BaseTask.java:104)

似乎是 methoid 的问题?

if (dvmMethod == null) {
    throw new BackendException("dvmObject=" + dvmObject + ", dvmClass=" + dvmClass + ", jmethodID=" + jmethodID);
}

不知道怎么解决,也查不到返回 HashMap 的示例!