一、目标

一、目标

从这篇文章开始,我们一步一步介绍如何 填坑、调试并修改原工程 代码 unidbg 到跑出某电商Appsign的过程。

本文使用的原始代码在 https://github.com/zhkl0228/unidbg ,版本是 0.9.1

二、步骤

unidbg的作者更新的挺快, 本教程使用的版本fork到了这里

https://github.com/fenfei331/unidbg

参考 Unidbg使用指南(一),我们把基本框架搭起来

 private static LibraryResolver createLibraryResolver() {
    return new AndroidResolver(23);
}

private static AndroidEmulator createARMEmulator() {
    return new AndroidARMEmulator("test");
}

private final AndroidEmulator emulator;
private final VM vm;
private Module module;
private DvmClass aBitmapkitUtils;

//初始化
public runliudq(){
    emulator = createARMEmulator();
    final Memory memory = emulator.getMemory();
    // 设置 sdk版本 23
    memory.setLibraryResolver(createLibraryResolver());

    vm = emulator.createDalvikVM(new File("/Users/fenfei/Desktop/V9.2.2.85371_T1_350271430_lc029.apk"));

      // vm.setDvmClassFactory(new ProxyClassFactory());
    vm.setJni(this);
    // 是否打印日志
      vm.setVerbose(true);
}

public void runJni(){
    DalvikModule dm = vm.loadLibrary("jdbitmapkit", false);

    dm.callJNI_OnLoad(emulator);
       module = dm.getModule();

}

@Override
public DvmObject<?> getStaticObjectField(BaseVM vm, DvmClass dvmClass, String signature) {
    switch (signature) {
        case "com/jingdong/common/utils/BitmapkitUtils->a:Landroid/app/Application;":
            return vm.resolveClass("android/app/Application", vm.resolveClass("android/content/ContextWrapper", vm.resolveClass("android/content/Context"))).newObject(null);
    }

    return super.getStaticObjectField( vm,  dvmClass,  signature);
}

这里需要解释的有以下几部分:

  • emulator.createDalvikVM 创建虚拟机的时候,我们可以载入apk,这样内部实现了获取包名和包签名等jni操作
  • 对于jni的操作,作者实现了两种,setJni和setDvmClassFactory,这里,我们先使用setJni的方式,并且继承了AbstractJni类
  • 对于静态字段(成员变量)的操作,我们需要重写getStaticObjectField函数,通过对signature的解析来一一实现,这个感觉没有AndroidNativeEmu实现的优雅。

好了框架先搭到这里,明天继续……

100

关注微信公众号,最新技术干货实时推送

100