一、目标
从这篇文章开始,我们一步一步介绍如何 填坑、调试并修改原工程 代码 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实现的优雅。
好了框架先搭到这里,明天继续……
关注微信公众号,最新技术干货实时推送