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); } } |