Skip to content

Commit

Permalink
实现callDoubleMethodV
Browse files Browse the repository at this point in the history
  • Loading branch information
viruscoding committed Nov 11, 2021
1 parent 3dab38e commit 3b7fb59
Show file tree
Hide file tree
Showing 7 changed files with 114 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -860,6 +860,16 @@ public double callDoubleMethod(BaseVM vm, DvmObject<?> dvmObject, String signatu
throw new UnsupportedOperationException(signature);
}

@Override
public double callDoubleMethodV(BaseVM vm, DvmObject<?> dvmObject, DvmMethod dvmMethod, VaList vaList) {
return callDoubleMethodV(vm, dvmObject, dvmMethod.getSignature(), vaList);
}

@Override
public double callDoubleMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList) {
throw new UnsupportedOperationException(signature);
}

@Override
public void callVoidMethod(BaseVM vm, DvmObject<?> dvmObject, DvmMethod dvmMethod, VarArg varArg) {
callVoidMethod(vm, dvmObject, dvmMethod.getSignature(), varArg);
Expand Down Expand Up @@ -900,10 +910,11 @@ public void setStaticIntField(BaseVM vm, DvmClass dvmClass, String signature, in
throw new UnsupportedOperationException(signature);
}

public void setStaticObjectField(BaseVM vm, DvmClass dvmClass, DvmField dvmField, DvmObject<?> value){
public void setStaticObjectField(BaseVM vm, DvmClass dvmClass, DvmField dvmField, DvmObject<?> value) {
setStaticObjectField(vm, dvmClass, dvmField.getSignature(), value);
}
public void setStaticObjectField(BaseVM vm, DvmClass dvmClass, String signature, DvmObject<?> value){

public void setStaticObjectField(BaseVM vm, DvmClass dvmClass, String signature, DvmObject<?> value) {
throw new UnsupportedOperationException(signature);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public long handle(Emulator<?> emulator) {
}
}
});

Pointer _GetSuperclass = svcMemory.registerSvc(new ArmSvc() {
@Override
public long handle(Emulator<?> emulator) {
Expand Down Expand Up @@ -969,7 +969,30 @@ public long handle(Emulator<?> emulator) {
Pointer _CallDoubleMethodV = svcMemory.registerSvc(new ArmSvc() {
@Override
public long handle(Emulator<?> emulator) {
throw new UnsupportedOperationException();
RegisterContext context = emulator.getContext();
UnidbgPointer object = context.getPointerArg(1);
UnidbgPointer jmethodID = context.getPointerArg(2);
UnidbgPointer va_list = context.getPointerArg(3);
if (log.isDebugEnabled()) {
log.debug("CallDoubleMethodV object=" + object + ", jmethodID=" + jmethodID);
}
DvmObject<?> dvmObject = getObject(object.toIntPeer());
DvmClass dvmClass = dvmObject == null ? null : dvmObject.getObjectType();
DvmMethod dvmMethod = dvmClass == null ? null : dvmClass.getMethod(jmethodID.toIntPeer());
if (dvmMethod == null) {
throw new BackendException();
} else {
VaList32 vaList = new VaList32(emulator, DalvikVM.this, va_list, dvmMethod);
double ret = dvmMethod.callDoubleMethodV(dvmObject, vaList);
if (verbose) {
System.out.printf("JNIEnv->CallDoubleMethodV(%s, %s(%s) => %s) was called from %s%n", dvmObject, dvmMethod.methodName, vaList.formatArgs(), ret, context.getLRPointer());
}
ByteBuffer buffer = ByteBuffer.allocate(4);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.putFloat((float) ret);
buffer.flip();
return (buffer.getInt() & 0xffffffffL);
}
}
});

Expand Down Expand Up @@ -1615,7 +1638,7 @@ public long handle(Emulator<?> emulator) {
return 0;
}
});

Pointer _SetLongField = svcMemory.registerSvc(new ArmSvc() {
@Override
public long handle(Emulator<?> emulator) {
Expand Down Expand Up @@ -1670,7 +1693,7 @@ public long handle(Emulator<?> emulator) {
return 0;
}
});

Pointer _SetDoubleField = svcMemory.registerSvc(new ArmSvc() {
@Override
public long handle(Emulator<?> emulator) {
Expand Down Expand Up @@ -2741,7 +2764,7 @@ public long handle(Emulator<?> emulator) {
throw new UnsupportedOperationException();
}
});

Pointer _NewByteArray = svcMemory.registerSvc(new ArmSvc() {
@Override
public long handle(Emulator<?> emulator) {
Expand Down Expand Up @@ -2785,7 +2808,7 @@ public long handle(Emulator<?> emulator) {
return addLocalObject(new IntArray(DalvikVM.this, new int[size]));
}
});

Pointer _NewDoubleArray = svcMemory.registerSvc(new ArmSvc() {
@Override
public long handle(Emulator<?> emulator) {
Expand Down Expand Up @@ -3159,7 +3182,7 @@ public long handle(Emulator<?> emulator) {
throw new UnsupportedOperationException();
}
});

Pointer _SetIntArrayRegion = svcMemory.registerSvc(new ArmSvc() {
@Override
public long handle(Emulator<?> emulator) {
Expand Down Expand Up @@ -3202,7 +3225,7 @@ public long handle(Emulator<?> emulator) {
return 0;
}
});

Pointer _SetDoubleArrayRegion = svcMemory.registerSvc(new ArmSvc() {
@Override
public long handle(Emulator<?> emulator) {
Expand Down Expand Up @@ -3323,9 +3346,9 @@ public long handle(Emulator<?> emulator) {
}
if (log.isDebugEnabled()) {
log.debug("GetStringRegion string=" + string + ", value=" + value + ", start=" + start +
", length=" + length + ", buf" + buf +", lr=" + context.getLRPointer());
", length=" + length + ", buf" + buf + ", lr=" + context.getLRPointer());
}
byte[] data = Arrays.copyOfRange(bytes, start, start+length+1);
byte[] data = Arrays.copyOfRange(bytes, start, start + length + 1);
buf.write(0, data, 0, data.length);
return JNI_OK;
}
Expand All @@ -3348,9 +3371,9 @@ public long handle(Emulator<?> emulator) {
byte[] bytes = value.getBytes(StandardCharsets.UTF_8);
if (log.isDebugEnabled()) {
log.debug("GetStringUTFRegion string=" + string + ", value=" + value + ", start=" + start +
", length=" + length + ", buf" + buf +", lr=" + context.getLRPointer());
", length=" + length + ", buf" + buf + ", lr=" + context.getLRPointer());
}
byte[] data = Arrays.copyOfRange(bytes, start, start+length+1);
byte[] data = Arrays.copyOfRange(bytes, start, start + length + 1);
buf.write(0, data, 0, data.length);
return JNI_OK;
}
Expand Down Expand Up @@ -3469,7 +3492,7 @@ public long handle(Emulator<?> emulator) {
}
if (dvmGlobalObject != null) {
return dvmGlobalObject.weak ? JNIWeakGlobalRefType : JNIGlobalRefType;
} else if(dvmLocalObject != null) {
} else if (dvmLocalObject != null) {
return JNILocalRefType;
} else {
return JNIInvalidRefType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public long handle(Emulator<?> emulator) {
return addLocalObject(dvmMethod.toReflectedMethod());
}
}
}) ;
});

Pointer _GetSuperclass = svcMemory.registerSvc(new Arm64Svc() {
@Override
Expand Down Expand Up @@ -949,7 +949,30 @@ public long handle(Emulator<?> emulator) {
Pointer _CallDoubleMethodV = svcMemory.registerSvc(new Arm64Svc() {
@Override
public long handle(Emulator<?> emulator) {
throw new UnsupportedOperationException();
RegisterContext context = emulator.getContext();
UnidbgPointer object = context.getPointerArg(1);
UnidbgPointer jmethodID = context.getPointerArg(2);
UnidbgPointer va_list = context.getPointerArg(3);
if (log.isDebugEnabled()) {
log.debug("CallDoubleMethodV object=" + object + ", jmethodID=" + jmethodID + ", va_list=" + va_list);
}
DvmObject<?> dvmObject = getObject(object.toIntPeer());
DvmClass dvmClass = dvmObject == null ? null : dvmObject.getObjectType();
DvmMethod dvmMethod = dvmClass == null ? null : dvmClass.getMethod(jmethodID.toIntPeer());
if (dvmMethod == null) {
throw new BackendException();
} else {
VaList64 vaList = new VaList64(emulator, DalvikVM64.this, va_list, dvmMethod);
double ret = dvmMethod.callDoubleMethodV(dvmObject, vaList);
if (verbose) {
System.out.printf("JNIEnv->CallDoubleMethodV(%s, %s(%s) => %s) was called from %s%n", dvmObject, dvmMethod.methodName, vaList.formatArgs(), ret, context.getLRPointer());
}
ByteBuffer buffer = ByteBuffer.allocate(16);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.putDouble(ret);
emulator.getBackend().reg_write_vector(Arm64Const.UC_ARM64_REG_Q0, buffer.array());
return context.getLongArg(0);
}
}
});

Expand Down Expand Up @@ -3267,9 +3290,9 @@ public long handle(Emulator<?> emulator) {
}
if (log.isDebugEnabled()) {
log.debug("GetStringRegion string=" + string + ", value=" + value + ", start=" + start +
", length=" + length + ", buf" + buf +", lr=" + context.getLRPointer());
", length=" + length + ", buf" + buf + ", lr=" + context.getLRPointer());
}
byte[] data = Arrays.copyOfRange(bytes, start, start+length+1);
byte[] data = Arrays.copyOfRange(bytes, start, start + length + 1);
buf.write(0, data, 0, data.length);
return JNI_OK;
}
Expand All @@ -3292,9 +3315,9 @@ public long handle(Emulator<?> emulator) {
byte[] bytes = value.getBytes(StandardCharsets.UTF_8);
if (log.isDebugEnabled()) {
log.debug("GetStringUTFRegion string=" + string + ", value=" + value + ", start=" + start +
", length=" + length + ", buf" + buf +", lr=" + context.getLRPointer());
", length=" + length + ", buf" + buf + ", lr=" + context.getLRPointer());
}
byte[] data = Arrays.copyOfRange(bytes, start, start+length+1);
byte[] data = Arrays.copyOfRange(bytes, start, start + length + 1);
buf.write(0, data, 0, data.length);
return JNI_OK;
}
Expand Down Expand Up @@ -3413,7 +3436,7 @@ public long handle(Emulator<?> emulator) {
}
if (dvmGlobalObject != null) {
return dvmGlobalObject.weak ? JNIWeakGlobalRefType : JNIGlobalRefType;
} else if(dvmLocalObject != null) {
} else if (dvmLocalObject != null) {
return JNILocalRefType;
} else {
return JNIInvalidRefType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,11 @@ int callIntMethodA(DvmObject<?> dvmObject, VaList vaList) {
return checkJni(vm, dvmClass).callDoubleMethod(vm, dvmObject, this, varArg);
}

double callDoubleMethodV(DvmObject<?> dvmObject, VaList vaList) {
BaseVM vm = dvmClass.vm;
return checkJni(vm, dvmClass).callDoubleMethodV(vm, dvmObject, this, vaList);
}

char callCharMethodV(DvmObject<?> dvmObject, VaList vaList) {
BaseVM vm = dvmClass.vm;
return checkJni(vm, dvmClass).callCharMethodV(vm, dvmObject, this, vaList);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ public interface Jni {
double callDoubleMethod(BaseVM vm, DvmObject<?> dvmObject, DvmMethod dvmMethod, VarArg varArg);
double callDoubleMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg);

double callDoubleMethodV(BaseVM vm, DvmObject<?> dvmObject, DvmMethod dvmMethod, VaList vaList);
double callDoubleMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList);

byte callByteMethodV(BaseVM vm, DvmObject<?> dvmObject, DvmMethod dvmMethod, VaList vaList);
byte callByteMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,16 @@ public double callDoubleMethod(BaseVM vm, DvmObject<?> dvmObject, String signatu
throw new UnsupportedOperationException(signature);
}

@Override
public double callDoubleMethodV(BaseVM vm, DvmObject<?> dvmObject, DvmMethod dvmMethod, VaList vaList) {
return callDoubleMethodV(vm, dvmObject, dvmMethod.getSignature(), vaList);
}

@Override
public double callDoubleMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList) {
throw new UnsupportedOperationException(signature);
}

@Override
public byte callByteMethodV(BaseVM vm, DvmObject<?> dvmObject, DvmMethod dvmMethod, VaList vaList) {
return callByteMethodV(vm, dvmObject, dvmMethod.getSignature(), vaList);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,23 @@ public double callDoubleMethod(BaseVM vm, DvmObject<?> dvmObject, DvmMethod dvmM
return super.callDoubleMethod(vm, dvmObject, dvmMethod, varArg);
}

@Override
public double callDoubleMethodV(BaseVM vm, DvmObject<?> dvmObject, DvmMethod dvmMethod, VaList vaList) {
try {
Class<?> clazz = classLoader.loadClass(dvmObject.getObjectType().getName());
ProxyCall proxyCall = ProxyUtils.findMethod(clazz, dvmMethod, vaList, false, visitor);
Object thisObj = dvmObject.getValue();
if (thisObj == null) {
throw new IllegalStateException("obj is null: " + dvmObject);
}
Object obj = proxyCall.call(vm, thisObj);
return (Double) obj;
} catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException | InstantiationException | NoSuchMethodException e) {
log.warn("callDoubleMethod", e);
}
return super.callDoubleMethodV(vm, dvmObject, dvmMethod, vaList);
}

@Override
public byte callByteMethodV(BaseVM vm, DvmObject<?> dvmObject, DvmMethod dvmMethod, VaList vaList) {
try {
Expand Down

0 comments on commit 3b7fb59

Please sign in to comment.