package com.pp;
import
com.github.unidbg.AndroidEmulator;
import
com.github.unidbg.Module;
import
com.github.unidbg.arm.backend.Unicorn2Factory;
import
com.github.unidbg.
file
.IOResolver;
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.array.ByteArray;
import
com.github.unidbg.memory.Memory;
import
com.github.unidbg.virtualmodule.android.AndroidModule;
import
com.github.unidbg.virtualmodule.android.JniGraphics;
import
java.io.
File
;
import
java.io.UnsupportedEncodingException;
public
class
pp_seal extends AbstractJni {
private final AndroidEmulator emulator;
private final VM vm;
private final Module module;
public pp_seal() {
/
/
创建模拟器实例,进程名建议依照实际进程名填写,可以规避针对进程名的校验
emulator
=
AndroidEmulatorBuilder.for64Bit()
.addBackendFactory(new Unicorn2Factory(true))
.setProcessName(
"com.pupumall.customer"
)
.build();
/
/
获取模拟器的内存操作接口
final Memory memory
=
emulator.getMemory();
emulator.getSyscallHandler().setEnableThreadDispatcher(false);
/
/
如果报错 [main]W
/
libc: pthread_create failed: clone failed: Out of memory 采用改代码
/
/
设置系统类库解析
memory.setLibraryResolver(new AndroidResolver(
23
));
/
/
创建Android虚拟机,传入APK,Unidbg可以替我们做部分签名校验的工作
vm
=
emulator.createDalvikVM(new
File
(
"unidbg-android/src/test/java/com/pp/pp4.8.8.apk"
));
/
/
如果提示缺失依赖so
new AndroidModule(emulator,vm).register(memory);
new JniGraphics(emulator,vm).register(memory);
DalvikModule dm
=
vm.loadLibrary(new
File
(
"unidbg-android/src/test/java/com/pp/libwindcharger.so"
), false);
module
=
dm.getModule();
vm.setJni(this);
/
/
设置JNI
vm.setVerbose(true);
/
/
打印日志
dm.callJNI_OnLoad(emulator);
/
/
调用JNI OnLoad
}
public static void main(String[] args){
pp_seal test
=
new pp_seal();
AndroidEmulator emulator
=
test.emulator;
VM vm
=
test.vm;
DvmClass cSignUtil
=
vm.resolveClass(
"com.pupumall.tinystack.Gears"
);
String aa
=
"{\"sign\":\"c4a2cdc8738a09a5d661c858a66f009e\",\"Owl-TraceId\":\"e7fc7a42c6d04ec4b2dbe889e62f8b24.232.17205818367478832\",\"X-B3-TraceId\":\"e7fc7a42c6d04ec4b2dbe889e62f8b24.232.17205818367478832\",\"X-B3-SpanId\":\"dca2366dec7d0370\",\"timestamp\":\"1720581836741\",\"pp-version\":\"2023023100\",\"pp-suid\":\"e9ce82cf-0933-4221-8ced-649f03e95cef\",\"pp_storeid\":\"b565ec67-fd76-4195-888e-b6ff156b2adc\",\"pp-placeid\":\"1b7d5060-211a-485c-8424-158cccf1df93\",\"req-tag\":\"1720581836780\"}"
;
DvmClass cContext
=
vm.resolveClass(
"android/content/Context"
);
DvmClass cContextWrapper
=
vm.resolveClass(
"android/content/ContextWrapper"
, cContext);
DvmObject<?> cNative
=
vm.resolveClass(
"com.pupumall.customer.global.AppTinker"
, cContextWrapper).newObject(null);
DvmObject<?> dvmObject
=
cSignUtil.callStaticJniMethodObject(emulator,
"drift(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;"
, cNative, aa);
System.out.println(dvmObject);
/
/
}
}
@Override
public
int
getStaticIntField(BaseVM vm, DvmClass dvmClass, String signature) {
if
(
"android/content/Context->MODE_PRIVATE:I"
.equals(signature)) {
return
0
;
}
return
super
.getStaticIntField(vm, dvmClass, signature);
}
@Override
public DvmObject<?> callObjectMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList) {
switch (signature) {
case
"java/lang/String->getBytes(Ljava/lang/String;)[B"
: {
String
str
=
(String) dvmObject.getValue();
StringObject charsetName
=
vaList.getObjectArg(
0
);
try
{
return
new ByteArray(vm,
str
.getBytes(charsetName.getValue()));
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException(e);
}
}
case
"com/pupumall/customer/global/AppTinker->getPackageName()Ljava/lang/String;"
:{
return
new StringObject(vm,
"com.pupumall.customer"
);
}
}
throw new UnsupportedOperationException(signature);
}
@Override
public DvmObject<?> callStaticObjectMethodV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {
switch (signature) {
case
"com/pupumall/tinystack/utils/P->a(Landroid/content/Context;)Ljava/lang/String;"
:
case
"com/pupumall/tinystack/utils/S->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"
:
case
"com/pupumall/tinystack/utils/S->q()Ljava/lang/String;"
:
return
new StringObject(vm,
"Ljava/lang/String;"
);
}
return
super
.callStaticObjectMethodV(vm, dvmClass, signature, vaList);
}
}