zhkl0228 / unidbg

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

ByteArray对象调用GetObjectClass方法失败 #36

Closed xjohjrdy closed 5 years ago

xjohjrdy commented 5 years ago

GetObjectClass方法模拟实现

so源码:

jbyteArray array = (*env)->NewByteArray(env,10);
jclass clazz = (*env)->GetObjectClass(env,array);

使用unidbg调用编译后的so时,执行到GetObjectClass时发生错误,dvmObject.objectType = null,请问这种情况该怎么处理?

image

zhkl0228 commented 5 years ago

GetObjectClass对ByteArray正常应该返回什么?

xjohjrdy commented 5 years ago

image 正常情况下,如java/lang/Long 对象调用GetObjectClass时,返回的是globalObjectMap中对应的hash值(key)。

当ByteArray调用这个方法的时候,我尝试返回 vm.resolveClass("[B").hashCode(),导致了更多的错误。。。

cn.banny.unidbg.linux.android.dvm.array.ByteArray 与其他DvmObject不太一样,其他继承DvmObject的类型,初始化的时候都要传入vm,设置objectType。cn.banny.unidbg.linux.android.dvm.array.ByteArray 继承了cn.banny.unidbg.linux.android.dvm.array.BaseArray ,BaseArray中直接将objectType设置为null。

zhkl0228 commented 5 years ago

测试用例方便发出来吗

xjohjrdy commented 5 years ago

搞定了,还是强制返回[B的hashCode,只是我调用的这个so有很多坑,有太多java的方法需要模拟实现。 unidbg很好很强大!

zhkl0228 commented 5 years ago

如果unidbg有bug的话,还望有空的时候提个PR