一、目标
有一段时间没有写unidbg相关的文章了,这个样本挺合适,难度适中,还适当给你挖个小坑。所以后面是一个系列文章,包含 unidbg补环境,Trace Block 对比流程,Trace Code定位差异。掌握好这一系列套路,Native分析可以算入门了。
这次先来把so用unidbg跑通
v6.1.0
二、步骤
Dump so
IDA打开 libencrypt.so 去到我们要分析的两个函数 checkcode 和 decheckcode 对应的偏移地址 0x24424 , 0x2B1BC 。会发现一个奇怪的问题,这两个地址上没有汇编代码,都是 0x00。
估计是壳给我们加戏了,他把这两个关键函数的部分代码给抽取了,等到运行的时候才会补回去,这样就阻碍你去静态分析这个so。
不过壳怎么加戏,运行的时候是一定会在内存中存在完整的代码的,否则App是跑不起来的。
所以我们也加戏,Dump 之
function dumpSo(){var libxx = Process.getModuleByName("libencrypt.so");console.log("*****************************************************");console.log(TAG + "name: " +libxx.name);console.log(TAG + "base: " +libxx.base);console.log(TAG + "size: " +ptr(libxx.size));var file_path = "/data/data/com.xxx.aeri.caranywhere/" + libxx.name + "_" + libxx.base + "_" + ptr(libxx.size) + ".so";console.log(TAG + file_path);var file_handle = new File(file_path, "wb");if (file_handle && file_handle != null) {Memory.protect(ptr(libxx.base), libxx.size, 'rwx');var libso_buffer = ptr(libxx.base).readByteArray(libxx.size);file_handle.write(libso_buffer);file_handle.flush();file_handle.close();console.log(TAG + "[dump]:", file_path);}
}
unidbg run so 基本框架
dump出so的完整代码了,我们开始撘unidbg run so的基本框架。unidbg的库代码可以从原作者的github上下载最新的。
public class CaranywhereDemoextends AbstractJni {public AndroidEmulator emulator;public VM vm;public Module module;public DvmClass dvmClass;public static void main(String[] args) throws DecoderException, IOException {String apkPath = "/Users/fenfei/Desktop/xxx/6.1.0.apk";CaranywhereDemo carObj = new CaranywhereDemo(apkPath);carObj.destroy();}public CaranywhereDemo(String apkFilePath) throws DecoderException, IOException {//*emulator = AndroidEmulatorBuilder.for64Bit().setProcessName("com.xxx.aeri.caranywhere").addBackendFactory(new Unicorn2Factory(true)).build(); // 创建模拟器实例,要模拟32位或者64位,在这里区分//*/// 多线程处理true的情况下 在 faccessat的时候就卡死, 所以关掉, 这个样本暂时也不需要多线程emulator.getSyscallHandler().setEnableThreadDispatcher(false);final Memory memory = emulator.getMemory();// 模拟器的内存操作接口memory.setLibraryResolver(new AndroidResolver(23)); // 设置系统类库解析vm = emulator.createDalvikVM(new File(apkFilePath)); // 创建Android虚拟机vm.setJni(this);vm.setVerbose(true); // 设置是否打印Jni调用细节new JniGraphics(emulator, vm).register(memory