|   package com.smile.gifmaker3;   import com.github.unidbg.*;  import com.github.unidbg.Module;  import com.github.unidbg.arm.backend.Backend;  import com.github.unidbg.arm.backend.CodeHook;  import com.github.unidbg.arm.backend.UnHook;  import com.github.unidbg.arm.backend.UnicornBackend;  import com.github.unidbg.arm.context.Arm32RegisterContext;  import com.github.unidbg.arm.context.Arm64RegisterContext;  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.AndroidEmulatorBuilder;  import com.github.unidbg.linux.android.AndroidResolver;  import com.github.unidbg.linux.android.dvm.*;  import com.github.unidbg.linux.android.dvm.api.AssetManager;  import com.github.unidbg.linux.android.dvm.array.ArrayObject;  import com.github.unidbg.linux.android.dvm.wrapper.DvmBoolean;  import com.github.unidbg.linux.android.dvm.wrapper.DvmInteger;  import com.github.unidbg.memory.Memory;  import com.github.unidbg.pointer.UnidbgPointer;  import com.github.unidbg.spi.SyscallHandler;  import com.github.unidbg.utils.Inspector;  import com.github.unidbg.virtualmodule.android.AndroidModule;  import com.github.unidbg.virtualmodule.android.JniGraphics;  import com.sun.jna.Pointer;  import king.trace.GlobalData;  import king.trace.KingTrace;  import unicorn.Unicorn;  import unicorn.UnicornConst;   import java.io.File;  import java.io.FileNotFoundException;  import java.io.FileOutputStream;  import java.io.PrintStream;  import java.nio.ByteBuffer;  import java.nio.ByteOrder;  import java.util.ArrayList;  import java.util.List;   public class kswgmain11420 extends AbstractJni implements IOResolver {      private final AndroidEmulator emulator;      private final VM vm;      private final Module module;       kswgmain11420() throws FileNotFoundException {          // 创建模拟器实例,要模拟32位或者64位,在这里区分          EmulatorBuilder<AndroidEmulator> builder = AndroidEmulatorBuilder.for64Bit().setProcessName("com.smile.gifmaker");          emulator = builder.build();          emulator.getSyscallHandler().setEnableThreadDispatcher(true);          // 模拟器的内存操作接口          final Memory memory = emulator.getMemory();          // 设置系统类库解析          memory.setLibraryResolver(new AndroidResolver(23));           // 创建Android虚拟机          // vm = emulator.createDalvikVM();          vm = emulator.createDalvikVM(new File("unidbg-android\\src\\test\\java\\com\\smile\\gifmaker3\\1142064wei.apk"));          // 设置是否打印Jni调用细节          vm.setVerbose(true);          new JniGraphics(emulator, vm).register(memory);          new AndroidModule(emulator, vm).register(memory);          vm.setJni(this);          SyscallHandler<AndroidFileIO> handler = emulator.getSyscallHandler();          handler.addIOResolver(this);           // 加载libttEncrypt.so到unicorn虚拟内存,加载成功以后会默认调用init_array等函数          DalvikModule dm = vm.loadLibrary(new File("unidbg-android\\src\\test\\java\\com\\smile\\gifmaker3\\libkwsgmain.so"), true);          // 加载好的libttEncrypt.so对应为一个模块          module = dm.getModule();           // trace code  //        String traceFile = "unidbg-android\\src\\test\\java\\com\\smile\\gifmaker3\\sig3_jniOnload.trc";  //        GlobalData.ignoreModuleList.add("libc.so");  //        GlobalData.ignoreModuleList.add("libhookzz.so");  //        GlobalData.ignoreModuleList.add("libc++_shared.so");  //        emulator.traceCode(module.base, module.base+module.size).setRedirect(new PrintStream(new FileOutputStream(traceFile), true));           dm.callJNI_OnLoad(emulator);      }       public static void main(String[] args) throws FileNotFoundException {          kswgmain11420 kk = new kswgmain11420();          kk.init_native();          kk.get_NS_sig3();      }       public void init_native() throws FileNotFoundException {          // trace code  //        String traceFile = "unidbg-android\\src\\test\\java\\com\\smile\\gifmaker3\\sig3_init_native.trc";  //        GlobalData.ignoreModuleList.add("libc.so");  //        GlobalData.ignoreModuleList.add("libhookzz.so");  //        GlobalData.ignoreModuleList.add("libc++_shared.so");  //        emulator.traceCode(module.base, module.base+module.size).setRedirect(new PrintStream(new FileOutputStream(traceFile), true));           List<Object> list = new ArrayList<>(10);          list.add(vm.getJNIEnv()); // 第一个参数是env          DvmObject<?> thiz = vm.resolveClass("com/kuaishou/android/security/internal/dispatch/JNICLibrary").newObject(null);          list.add(vm.addLocalObject(thiz)); // 第二个参数,实例方法是jobject,静态方法是jclass,直接填0,一般用不到。          DvmObject<?> context = vm.resolveClass("com/yxcorp/gifshow/App").newObject(null); // context          vm.addLocalObject(context);          list.add(10412); //参数1          StringObject appkey = new StringObject(vm,"d7b7d042-d4f2-4012-be60-d97ff2429c17"); // SO文件有校验          vm.addLocalObject(appkey);          DvmInteger intergetobj = DvmInteger.valueOf(vm, 0);          vm.addLocalObject(intergetobj);          list.add(vm.addLocalObject(new ArrayObject(intergetobj,appkey,intergetobj,intergetobj,context,intergetobj,intergetobj)));          // 直接通过地址调用          Number numbers = module.callFunction(emulator, 0x41680, list.toArray());          System.out.println("numbers:"+numbers);          DvmObject<?> object = vm.getObject(numbers.intValue());          String result = (String) object.getValue();          System.out.println("result:"+result);      }       @Override      public DvmObject<?> callObjectMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList) {          switch (signature) {              case "com/yxcorp/gifshow/App->getPackageCodePath()Ljava/lang/String;": {                  return new StringObject(vm, "/data/app/com.smile.gifmaker-q14Fo0PSb77vTIOM1-iEqQ==/base.apk");              }              case "com/yxcorp/gifshow/App->getAssets()Landroid/content/res/AssetManager;": {  //                return new Long(vm, "3817726272");                  return new AssetManager(vm, signature);              }              case "com/yxcorp/gifshow/App->getPackageName()Ljava/lang/String;": {                  return new StringObject(vm, "com.smile.gifmaker");              }              case "com/yxcorp/gifshow/App->getPackageManager()Landroid/content/pm/PackageManager;": {                  DvmClass clazz = vm.resolveClass("android/content/pm/PackageManager");                  return clazz.newObject(signature);              }          }          return super.callObjectMethodV(vm, dvmObject, signature, vaList);      }       @Override      public boolean callBooleanMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList) {          switch (signature) {              case "java/lang/Boolean->booleanValue()Z":                  DvmBoolean dvmBoolean = (DvmBoolean) dvmObject;                  return dvmBoolean.getValue();          }          return super.callBooleanMethodV(vm, dvmObject, signature, vaList);      }       public String get_NS_sig3() throws FileNotFoundException {          // trace code  //        String traceFile = "unidbg-android\\src\\test\\java\\com\\smile\\gifmaker3\\sig3_new.trc";  //        GlobalData.ignoreModuleList.add("libc.so");  //        GlobalData.ignoreModuleList.add("libhookzz.so");  //        GlobalData.ignoreModuleList.add("libc++_shared.so");  //        emulator.traceCode(module.base, module.base+module.size).setRedirect(new PrintStream(new FileOutputStream(traceFile), true));           System.out.println("_NS_sig3 start");          List<Object> list = new ArrayList<>(10);          list.add(vm.getJNIEnv()); // 第一个参数是env          DvmObject<?> thiz = vm.resolveClass("com/kuaishou/android/security/internal/dispatch/JNICLibrary").newObject(null);          list.add(vm.addLocalObject(thiz)); // 第二个参数,实例方法是jobject,静态方法是jclass,直接填0,一般用不到。          DvmObject<?> context = vm.resolveClass("com/yxcorp/gifshow/App").newObject(null); // context          vm.addLocalObject(context);          list.add(10418); //参数1          StringObject urlObj = new StringObject(vm, "/rest/app/eshop/ks/live/item/byGuest6bcab0543b7433b6d0771892528ef686");          vm.addLocalObject(urlObj);          ArrayObject arrayObject = new ArrayObject(urlObj);          StringObject appkey = new StringObject(vm,"d7b7d042-d4f2-4012-be60-d97ff2429c17");          vm.addLocalObject(appkey);          DvmInteger intergetobj = DvmInteger.valueOf(vm, -1);          vm.addLocalObject(intergetobj);          DvmBoolean boolobj = DvmBoolean.valueOf(vm, false);          vm.addLocalObject(boolobj);          StringObject appkey2 = new StringObject(vm,"7e46b28a-8c93-4940-8238-4c60e64e3c81");          vm.addLocalObject(appkey2);          list.add(vm.addLocalObject(new ArrayObject(arrayObject,appkey,intergetobj,boolobj,context,null,boolobj,appkey2)));          // 直接通过地址调用          Number numbers = module.callFunction(emulator, 0x41680, list.toArray());          System.out.println("numbers:"+numbers);          DvmObject<?> object = vm.getObject(numbers.intValue());          String result = (String) object.getValue();          System.out.println("result:"+result);          return result;      }       @Override      public FileResult resolve(Emulator emulator, String pathname, int oflags) {          System.out.println("fuck:"+pathname);          return null;      }       public String readStdString(Pointer strptr){          Boolean isTiny = (strptr.getByte(0) & 1) == 0;          if(isTiny){              return strptr.getString(1);          }          return strptr.getPointer(emulator.getPointerSize()* 2L).getString(0);      }       @Override      public DvmObject<?> callStaticObjectMethodV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {          switch (signature) {              case "com/kuaishou/android/security/internal/common/ExceptionProxy->getProcessName(Landroid/content/Context;)Ljava/lang/String;":                  return new StringObject(vm, "com.smile.gifmaker");              case "com/meituan/android/common/mtguard/NBridge->getSecName()Ljava/lang/String;":                  return new StringObject(vm, "ppd_com.sankuai.meituan.xbt");              case "com/meituan/android/common/mtguard/NBridge->getAppContext()Landroid/content/Context;":                  return vm.resolveClass("android/content/Context").newObject(null);              case "com/meituan/android/common/mtguard/NBridge->getMtgVN()Ljava/lang/String;":                  return new StringObject(vm, "4.4.7.3");              case "com/meituan/android/common/mtguard/NBridge->getDfpId()Ljava/lang/String;":                  return new StringObject(vm, "");          }          return super.callStaticObjectMethodV(vm, dvmClass, signature,vaList);      }  }   |