package com.taobao.wireless.security.adapter;
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Module;
import com.github.unidbg.arm.backend.Unicorn2Factory;
import com.github.unidbg.file.linux.AndroidFileIO;
import com.github.unidbg.linux.android.AndroidARMEmulator;
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.ArrayObject;
import com.github.unidbg.linux.android.dvm.array.ByteArray;
import com.github.unidbg.linux.android.dvm.wrapper.DvmInteger;
import com.github.unidbg.linux.android.dvm.wrapper.DvmLong;
import com.github.unidbg.memory.Memory;
import com.github.unidbg.memory.SvcMemory;
import com.github.unidbg.unix.UnixSyscallHandler;
import java.io.File;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class JNICLibrary {
private static final Log log = LogFactory.getLog(JNICLibrary.class);
private final AndroidEmulator emulator;
private final VM vm;
private final Memory memory;
private final Module module;
private final DvmClass myjniclass;
public JNICLibrary() {
AndroidEmulatorBuilder builder = new AndroidEmulatorBuilder(false) {
@Override
public AndroidEmulator build() {
return new AndroidARMEmulator(processName, rootDir, backendFactories) {
@Override
protected UnixSyscallHandler<AndroidFileIO> createSyscallHandler(SvcMemory svcMemory) {
return new MySyscallHandler(svcMemory);
}
};
}
};
emulator = builder
.setProcessName("com.youku.phone")
.setRootDir(new File("unidbg-android/src/main/java/com/taobao/wireless/security/adapter/rootfs"))
.addBackendFactory(new Unicorn2Factory(true))
.build();
emulator.getBackend().registerEmuCountHook(100000);
emulator.getSyscallHandler().setVerbose(true);
emulator.getSyscallHandler().setEnableThreadDispatcher(true);
emulator.getSyscallHandler().addIOResolver(new MyIOResolver());
memory = emulator.getMemory();
memory.setLibraryResolver(new AndroidResolver(23));
memory.setCallInitFunction(true);
vm = emulator.createDalvikVM();
vm.setVerbose(true);
vm.setJni(new MyJni());
DalvikModule dalvikModule = vm.loadLibrary(new File("unidbg-android/src/main/java/com/taobao/wireless/security/adapter/lib/libsgmainso-6.4.170.so"), true);
module = dalvikModule.getModule();
vm.callJNI_OnLoad(emulator, module);
myjniclass = vm.resolveClass("com/taobao/wireless/security/adapter/JNICLibrary");
}
public static void main(String[] args) {
JNICLibrary jnicLibrary = new JNICLibrary();
jnicLibrary.init();
}
}