某车联网App 通讯协议加密分析(二) Unidbg手把手跑通

一、目标

有一段时间没有写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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值