|   package pdd;   import com.github.unidbg.AndroidEmulator;  import com.github.unidbg.Emulator;  import com.github.unidbg.Module;  import com.github.unidbg.file.FileResult;  import com.github.unidbg.file.IOResolver;  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.file.ByteArrayFileIO;  import com.github.unidbg.memory.Memory;  import com.github.unidbg.memory.SvcMemory;  import com.github.unidbg.spi.SyscallHandler;  import com.github.unidbg.unix.UnixSyscallHandler;   import java.io.File;  import java.nio.charset.StandardCharsets;  import java.util.ArrayList;  import java.util.List;  import java.util.UUID;   public class Pddmain extends AbstractJni implements IOResolver<AndroidFileIO> {       private AndroidEmulator androidEmulator;      private static final String APK_PATH = "/Users/Downloads/com.xunmeng.pinduoduo_6.7.0_60700.apk";      private static final String SO_PATH = "/Users/Downloads/com.xunmeng.pinduoduo_6.7.0_60700/lib/armeabi-v7a/libpdd_secure.so";      private Module moduleModule;      private VM dalvikVM;       public static void main(String[] args) {          Pddmain main = new Pddmain();          main.create();      }       private void create() {          AndroidEmulatorBuilder androidEmulatorBuilder = new AndroidEmulatorBuilder(false) {              @Override              public AndroidEmulator build() {                  return new AndroidARMEmulator("com.xunmeng.pinduoduo",rootDir,backendFactories) {                      @Override                      protected UnixSyscallHandler<AndroidFileIO> createSyscallHandler(SvcMemory svcMemory) {                          return new PddArmSysCallHand(svcMemory);                      }                  };              }          };          androidEmulator = androidEmulatorBuilder.setProcessName("").build();          androidEmulator.getSyscallHandler().addIOResolver(this);          Memory androidEmulatorMemory = androidEmulator.getMemory();          androidEmulatorMemory.setLibraryResolver(new AndroidResolver(23));          dalvikVM = androidEmulator.createDalvikVM(new File(APK_PATH));          DalvikModule module = dalvikVM.loadLibrary(new File(SO_PATH), true);          moduleModule = module.getModule();          dalvikVM.setJni(this);          dalvikVM.setVerbose(true);          dalvikVM.callJNI_OnLoad(androidEmulator, moduleModule);          callInfo3();      }       @Override      public void callStaticVoidMethodV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {          if ("com/tencent/mars/xlog/PLog->i(Ljava/lang/String;Ljava/lang/String;)V".equals(signature)) {              return;          }          super.callStaticVoidMethodV(vm, dvmClass, signature, vaList);      }       private void callInfo3() {          List<Object> argList = new ArrayList<>();          argList.add(dalvikVM.getJNIEnv());          argList.add(0);          DvmObject<?> context = dalvikVM.resolveClass("android/content/Context").newObject(null);          argList.add(dalvikVM.addLocalObject(context));          argList.add(dalvikVM.addLocalObject(new StringObject(dalvikVM, "api/oak/integration/render")));          argList.add(dalvikVM.addLocalObject(new StringObject(dalvikVM, "dIrjGpkC")));          Number number = moduleModule.callFunction(androidEmulator, 0xb6f9, argList.toArray())[0];          String toString = dalvikVM.getObject(number.intValue()).getValue().toString();          System.out.println(toString);      }       @Override      public DvmObject<?> callStaticObjectMethodV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {          if ("com/xunmeng/pinduoduo/secure/EU->gad()Ljava/lang/String;".equals(signature)) {              return new StringObject(vm, "cb14a9e76b72a627");          } else if ("java/util/UUID->randomUUID()Ljava/util/UUID;".equals(signature)) {              UUID uuid = UUID.randomUUID();              DvmObject<?> dvmObject = vm.resolveClass("java/util/UUID").newObject(uuid);              return dvmObject;          }          return super.callStaticObjectMethodV(vm, dvmClass, signature, vaList);      }       @Override      public DvmObject<?> callObjectMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList) {          if ("java/util/UUID->toString()Ljava/lang/String;".equals(signature)) {              UUID uuid = (UUID) dvmObject.getValue();              return new StringObject(vm, uuid.toString());          } else if ("java/lang/String->replaceAll(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;".equals(signature)) {              String obj = dvmObject.getValue().toString();              String arg0 = vaList.getObjectArg(0).toString();              String arg1 = vaList.getObjectArg(1).toString();              String replaceAll = obj.replaceAll(arg0, arg1);              return new StringObject(vm, replaceAll);           }          return super.callObjectMethodV(vm, dvmObject, signature, vaList);      }       @Override      public int callIntMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList) {          if ("java/lang/String->hashCode()I".equals(signature)) {              return dvmObject.getValue().toString().hashCode();          }          return super.callIntMethodV(vm, dvmObject, signature, vaList);      }       @Override      public FileResult<AndroidFileIO> resolve(Emulator<AndroidFileIO> emulator, String pathname, int oflags) {          if ("/proc/stat".equals(pathname)) {              String info = "cpu  15884810 499865 12934024 24971554 59427 3231204 945931 0 0 0\n" +                      "cpu0 6702550 170428 5497985 19277857 45380 1821584 529454 0 0 0\n" +                      "cpu1 4438333 121907 3285784 1799772 3702 504395 255852 0 0 0\n" +                      "cpu2 2735453 133666 2450712 1812564 4626 538114 93763 0 0 0\n" +                      "cpu3 2008473 73862 1699542 2081360 5716 367109 66860 0 0 0\n" +                      "intr 1022419954 0 0 0 159719900 0 16265892 4846825 5 5 5 6 0 0 497 24817167 17 176595 1352 0 28375276 0 0 0 0 5239 698 0 0 0 0 0 0 3212852 0 12195284 0 0 0 0 0 43 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12513 2743129 375 12477726 0 0 0 0 37 1351794 0 36 8 0 0 0 0 0 0 5846 0 0 0 0 0 0 0 0 0 141 32 0 55 0 0 0 0 0 0 0 0 18 0 18 0 0 0 0 0 0 66 0 0 0 0 0 0 0 77 0 166 0 0 0 0 0 394 0 0 0 0 0 1339137 0 0 0 0 0 0 313 0 0 0 55759 7 7 7 0 0 0 0 0 0 0 0 3066136 0 47 0 0 0 2 2 0 0 0 6 8 0 0 0 2 0 462 2952327 35420 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 495589 0 0 0 0 3 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37662 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4760 0 0 97 0 0 0 0 0 0 0 0 0 243 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4649 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22355451 0 0 0 14 0 24449357 96 49415 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17067 780222 3211 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 649346 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +                      "ctxt 1572087931\n" +                      "btime 1649910663\n" +                      "processes 230673\n" +                      "procs_running 6\n" +                      "procs_blocked 0\n" +                      "softirq 374327567 12481657 139161248 204829 7276312 2275183 26796 12851725 80988196 1422751 117638870";              return FileResult.success(new ByteArrayFileIO(oflags, pathname, info.getBytes(StandardCharsets.UTF_8)));          }          return null;      }  }   |