手机淘宝

官方版本号:v8.8.0

更新时间:2019年06月29日

普通下载优先地址

package com.bytedance.frameworks.core.encrypt;
 
import java.io.File; 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Set;
import com.github.unidbg.Emulator; 
import com.github.unidbg.LibraryResolver; 
import com.github.unidbg.arm.ARMEmulator; 
import com.github.unidbg.file.FileResult; 
import com.github.unidbg.file.IOResolver; 
import com.github.unidbg.linux.android.AndroidARMEmulator; 
import com.github.unidbg.linux.android.AndroidResolver; 
import com.github.unidbg.linux.android.dvm.AbstractJni; 
import com.github.unidbg.linux.android.dvm.BaseVM; 
import com.github.unidbg.linux.android.dvm.DalvikModule; 
import com.github.unidbg.linux.android.dvm.DvmClass; 
import com.github.unidbg.linux.android.dvm.DvmObject; 
import com.github.unidbg.linux.android.dvm.StringObject; 
import com.github.unidbg.linux.android.dvm.VM; 
import com.github.unidbg.linux.android.dvm.VarArg; 
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.linux.file.ByteArrayFileIO; 
import com.github.unidbg.linux.file.SimpleFileIO; 
import com.github.unidbg.memory.Memory;
 
public class TestSignso extends AbstractJni implements IOResolver {
 
private static LibraryResolver createLibraryResolver() {
    return new AndroidResolver(19);
}
 
private static AndroidARMEmulator createARMEmulator() {
    return new AndroidARMEmulator();
}
 
private final AndroidARMEmulator emulator;
private final VM vm;
 
private final DvmClass Native;
 
private TestSignso() throws IOException {
// Logger.getLogger("cn.banny.unidbg.AbstractEmulator").setLevel(Level.DEBUG);
 
    emulator = createARMEmulator();
    emulator.getSyscallHandler().addIOResolver(this);
    final Memory memory = emulator.getMemory();
    memory.setLibraryResolver(createLibraryResolver());
 
    vm = emulator.createDalvikVM(APK_FILE);
    vm.setJni(this);
    DalvikModule dm = vm.loadLibrary("sgmainso-6.4.152", false);
    dm.callJNI_OnLoad(emulator);
 
    Native = vm.resolveClass("com.taobao.wireless.security.adapter.JNICLibrary".replace(".", "/"));
}
 
private static final String APK_INSTALL_PATH = "/data/app/test.apk";
private static final File APK_FILE = new File("unidbg-android/src/test/resources/app/com.taobao.taobao_8.8.0_243.apk");
 
 
public FileResult resolve(Emulator emulator, String pathname, int oflags) {
    if (pathname.equals(APK_INSTALL_PATH)) {
        return FileResult.success(new SimpleFileIO(oflags, APK_FILE, pathname));
    }
 
    if (("/proc/self/status").equals(pathname)) {
        return FileResult.success(new ByteArrayFileIO(oflags, pathname, ("TracerPid:\t0\nState" +
                ":\tr\n").getBytes()));
    }
    if (("/proc/" + emulator.getPid() + "/stat").equals(pathname)) {
        return FileResult.success(new ByteArrayFileIO(oflags, pathname, (emulator.getPid() +
                " (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 0 0 0 0 17 0 0 0\n").getBytes()));
    }
    if (("/proc/" + emulator.getPid() + "/wchan").equals(pathname)) {
        return FileResult.success(new ByteArrayFileIO(oflags, pathname,
                "sys_epoll".getBytes()));
    }
 
    return null;
}
 
private void destroy() throws IOException {
    emulator.close();
    System.out.println("destroy");
}
 
public static void main(String[] args) throws Exception {
    TestSignso test = new TestSignso();
    test.test();
    test.destroy();
}
 
private void test() {
    DvmObject context = vm.resolveClass("android/content/Context").newObject(null);
    long start = System.currentTimeMillis();
    Number ret = Native.callStaticJniMethod(emulator, "doCommandNative(I[Ljava/lang/Object;)Ljava/lang/Object;",
            10101,
            new ArrayObject(context, DvmInteger.valueOf(vm, 3), new StringObject(vm, ""), new StringObject(vm, new File("target/app_SGLib").getAbsolutePath()), new StringObject(vm, ""))
    );
    long hash = ret.intValue() & 0xffffffffL;
    DvmObject dvmObject = vm.getObject(hash);
    System.out.println("hash:" + hash + ", dvmObject=" + dvmObject + ", offset=" + (System.currentTimeMillis() - start) + "ms");
    vm.deleteLocalRefs();
 
    Map<String, String> map = new HashMap<>();
    map.put("INPUT", "XPDlGfM+zOoDAMHyPLa9+Okq&&&21646297&99914b932bd37a50b983c5e7c90ae93b&1560149480&mtop.common.gettimestamp&*&&231200.8.0&AjA1TIyT9T8vcuFw8Osrli35ALbE3ZW2SHLZNuihw8Ku&&&27&&&&&&&");
    start = System.currentTimeMillis();
    ret = Native.callStaticJniMethod(emulator, "doCommandNative(I[Ljava/lang/Object;)Ljava/lang/Object;",
            10401,
            new ArrayObject(vm.resolveClass("java/util/HashMap").newObject(map),
                    new StringObject(vm, "21646297"), DvmInteger.valueOf(vm, 7), null, DvmBoolean.valueOf(vm, true)));
    hash = ret.intValue() & 0xffffffffL;
    dvmObject = vm.getObject(hash);
    System.out.println("hash:" + hash + ", dvmObject=" + dvmObject + ", offset=" + (System.currentTimeMillis() - start) + "ms");
    vm.deleteLocalRefs();
    System.out.println("=========" + dvmObject);
}
 
 
public DvmObject callStaticObjectMethod(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {
    switch (signature) {
        case "com/alibaba/wireless/security/mainplugin/SecurityGuardMainPlugin->getMainPluginClassLoader()Ljava/lang/ClassLoader;":
            return vm.resolveClass("java/lang/ClassLoader").newObject(null);
        case "com/taobao/wireless/security/adapter/common/SPUtility2->readFromSPUnified(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;":
            StringObject a1 = varArg.getObject(0);
            StringObject a2 = varArg.getObject(1);
            StringObject a3 = varArg.getObject(2);
            System.out.println("readFromSPUnified a1=" + a1 + ", a2=" + a2 + ", a3=" + a3);
            return null;
        case "com/taobao/wireless/security/adapter/datacollection/DeviceInfoCapturer->doCommandForString(I)Ljava/lang/String;":
            int value = varArg.getInt(0);
            System.out.println("com/taobao/wireless/security/adapter/datacollection/DeviceInfoCapturer->doCommandForString value=" + value);
            return null;
    }
 
    return super.callStaticObjectMethod(vm, dvmClass, signature, varArg);
}
 
 
public DvmObject newObject(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {
    switch (signature) {
        case "com/alibaba/wireless/security/open/SecException-><init>(Ljava/lang/String;I)V": {
            StringObject msg = varArg.getObject(0);
            int value = varArg.getInt(1);
            return dvmClass.newObject(msg.getValue() + "[" + value + "]");
        }
        case "java/lang/Integer-><init>(I)V":
            int value = varArg.getInt(0);
            return DvmInteger.valueOf(vm, value);
    }
 
    return super.newObject(vm, dvmClass, signature, varArg);
}
 
 
public DvmObject callObjectMethod(BaseVM vm, DvmObject dvmObject, String signature, VarArg varArg) {
    switch (signature) {
        case "java/util/HashMap->keySet()Ljava/util/Set;": {
            HashMap map = (HashMap) dvmObject.getValue();
            return vm.resolveClass("java/util/Set").newObject(map.keySet());
        }
        case "java/util/Set->toArray()[Ljava/lang/Object;":
            Set set = (Set) dvmObject.getValue();
            Object[] array = set.toArray();
            DvmObject[] objects = new DvmObject[array.length];
            for (int i = 0; i < array.length; i++) {
                if (array[i] instanceof String) {
                    objects[i] = new StringObject(vm, (String) array[i]);
                } else {
                    throw new IllegalStateException("array=" + array[i]);
                }
            }
            return new ArrayObject(objects);
        case "java/util/HashMap->get(Ljava/lang/Object;)Ljava/lang/Object;": {
            HashMap map = (HashMap) dvmObject.getValue();
            Object key = varArg.getObject(0).getValue();
            Object obj = map.get(key);
            if (obj instanceof String) {
                return new StringObject(vm, (String) obj);
            } else {
                throw new IllegalStateException("array=" + obj);
            }
        }
        case "android/content/Context->getPackageCodePath()Ljava/lang/String;":
            return new StringObject(vm, APK_INSTALL_PATH);
        case "android/content/Context->getFilesDir()Ljava/io/File;":
            return vm.resolveClass("java/io/File").newObject(new File("target"));
        case "java/io/File->getAbsolutePath()Ljava/lang/String;":
            File file = (File) dvmObject.getValue();
            return new StringObject(vm, file.getAbsolutePath());
    }
 
    return super.callObjectMethod(vm, dvmObject, signature, varArg);
}
 
 
public void callStaticVoidMethod(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {
    switch (signature) {
        case "com/taobao/dp/util/CallbackHelper->onCallBack(ILjava/lang/String;I)V":
            int i1 = varArg.getInt(0);
            StringObject str = varArg.getObject(1);
            int i2 = varArg.getInt(2);
            System.out.println("com/taobao/dp/util/CallbackHelper->onCallBack i1=" + i1 + ", str=" + str + ", i2=" + i2);
            return;
        case "com/alibaba/wireless/security/open/edgecomputing/ECMiscInfo->registerAppLifeCyCleCallBack()V":
            System.out.println("registerAppLifeCyCleCallBack");
            return;
    }
 
    super.callStaticVoidMethod(vm, dvmClass, signature, varArg);
}
 
 
public DvmObject getObjectField(BaseVM vm, DvmObject dvmObject, String signature) {
    switch (signature) {
        case "android/content/pm/ApplicationInfo->nativeLibraryDir:Ljava/lang/String;":
            return new StringObject(vm, new File("target").getAbsolutePath());
    }
 
    return super.getObjectField(vm, dvmObject, signature);
}
 
 
public int callStaticIntMethod(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {
    switch (signature) {
        case "com/alibaba/wireless/security/framework/utils/UserTrackMethodJniBridge->utAvaiable()I":
            return 1;
        case "com/taobao/wireless/security/adapter/common/SPUtility2->saveToFileUnifiedForNative(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)I":
            StringObject a1 = varArg.getObject(0);
            StringObject a2 = varArg.getObject(1);
            StringObject a3 = varArg.getObject(2);
            boolean b4 = varArg.getInt(3) != 0;
            System.out.println("saveToFileUnifiedForNative a1=" + a1 + ", a2=" + a2 + ", a3=" + a3 + ", b4=" + b4);
            return 0;
    }
 
    return super.callStaticIntMethod(vm, dvmClass, signature, varArg);
}
}

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐