Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

求助 com.github.unidbg.arm.backend.BackendException #388

Closed
dddNevermore opened this issue Dec 22, 2021 · 9 comments
Closed

求助 com.github.unidbg.arm.backend.BackendException #388

dddNevermore opened this issue Dec 22, 2021 · 9 comments

Comments

@dddNevermore
Copy link

先贴报错
com.github.unidbg.arm.backend.BackendException
at com.github.unidbg.linux.android.dvm.DalvikVM$31.handle(DalvikVM.java:498)
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.SignUtil.getSign0(SignUtil.java:45)
at com.anjuke.mobile.sign.SignUtil.sign(SignUtil.java:57)
at com.anjuke.mobile.sign.SignUtil.main(SignUtil.java:72)

我debug了一下:
DalvikVM.java 496
DvmMethod dvmMethod = dvmClass == null ? null : dvmClass.getMethod(jmethodID.toIntPeer());
这里我的理解是 从这个类中根据hash值找到方法? 然后没找到

其他尝试:
我报错的原因极大可能是需要使用Context
当前so的方法中,我试了不需要Context的方法,是正常的
其他so的方法中,Context可以传空,也能正常执行

上源码:
package com.anjuke.mobile.sign;

import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
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;

public class SignUtil {

private final AndroidEmulator emulator;

private final DvmClass cSignUtil;
private final VM vm;

public SignUtil() {
    emulator = AndroidEmulatorBuilder.for32Bit()
            .setProcessName("")
            .build();
    Memory memory = emulator.getMemory();
    memory.setLibraryResolver(new AndroidResolver(23));
    vm = emulator.createDalvikVM();
    vm.setDvmClassFactory(new ProxyClassFactory());
    vm.setVerbose(true);
  DalvikModule dm = vm.loadLibrary(new File("/Users/ddd/Desktop/libJniHelper.so"), false);
  cSignUtil = vm.resolveClass("com/vip/sdk/base/jni/JniHelper");
    dm.callJNI_OnLoad(emulator);
}

public void destroy() throws IOException {
    emulator.close();
}

public String getSign0(String p1, String p2, Map<String, String> map, String p3, int i) {
  DvmObject contexts =vm.resolveClass("android/content/Context").newObject(null);
  String methodSign = "getSignHash(Landroid/content/Context;Ljava/util/Map;Ljava/lang/String;)Ljava/lang/String;";
  StringObject obj = cSignUtil.callStaticJniMethodObject(emulator, methodSign, contexts,ProxyDvmObject.createObject(vm, map),"2");

 /* String methodSign = "get3DesKey()Ljava/lang/String;";
  StringObject obj = cSignUtil.callStaticJniMethodObject(emulator, methodSign);*/
  return obj.getValue();
}

private synchronized String sign(String p1, String p2, Map<String, String> paramMap, String p3, int i) {
    Map<String, String> map = new HashMap<>();
    for (String key : paramMap.keySet()) {
        map.put(key, paramMap.get(key));
    }
    return getSign0(p1, p2, map, p3, i);
}


public static void main(String[] args) throws Exception {
    Map<String, String> paramMap = new HashMap<String, String>() {{
        put("a", "b");
        put("b", "b");
    }};
    String p1 = "aa";
    String p2 = "bb";
    String p3 = "cc";
    int i = 10;

    SignUtil signUtil = new SignUtil();
    String sign = signUtil.sign(p1, p2, paramMap, p3, i);
    System.out.println("sign=" + sign);
    signUtil.destroy();
}

}

希望大佬帮我看下什么问题,谢谢!

@Pr0214
Copy link
Contributor

Pr0214 commented Dec 22, 2021

methodID问题

@dddNevermore
Copy link
Author

methodID问题

谢谢大佬,已经解决!

@Pr0214
Copy link
Contributor

Pr0214 commented Dec 23, 2021

嘤嘤嘤

@dddNevermore
Copy link
Author

嘤嘤嘤

大佬,我又碰到一个问题
入参一样的,返回的值不一样,但是返回值是3个值中随机一个,这是这个so的问题吗

@dddNevermore
Copy link
Author

嘤嘤嘤

解决了,是我疏忽了,打扰大佬了 嘤嘤嘤

@hhxdestiny
Copy link

(Landroid/content/Context;Ljava/util/Map;Ljava/lang/String;)

请问大佬如何解决的methodID问题

@kevinsir
Copy link

kevinsir commented May 4, 2022

请问大佬如何解决的methodID问题

@wengxianxun
Copy link

大佬怎么解决的,遇到同样的问题

@nubuntu
Copy link

nubuntu commented Jul 26, 2023

same here, still no info about how to solve it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants