【Android安全-unidbg模拟执行的去除ollvm混淆】此文章归类为:Android安全。
0.前言
本文是对 https://bbs.kanxue.com/thread-277086.htm 帖子中去ollvm混淆的实践记录
1.实践
ida 看so是被混淆了
然后用unidbg 模拟执行代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public wvvvuwwu() {
emulator = AndroidEmulatorBuilder .for64Bit() .build();
Memory memory = emulator.getMemory();
memory.setLibraryResolver(new AndroidResolver( 23 ));
/ / 创建DalvikVM,利用apk本身,可以为null
/ / 如果用apk文件加载so的话,会自动处理签名方面的jni,具体可看AbstractJni,这就是利用apk加载的好处
vm = emulator.createDalvikVM(new File ( "unidbg-android/src/test/resources/example_binaries/mianshi.apk" ));
vm.setJni(this);
vm.setVerbose(true);
DalvikModule dm = vm.loadLibrary( "shpssdk" , true);
module = dm.getModule();
cWvvvuwwu = vm.resolveClass( "com/shopee/shpssdk/wvvvuwwu" );
wvvvuvvv = vm.resolveClass( "com/shopee/shpssdk/wvvvuvvv" );
processFlt(module.base + 0x22F694 , module.base + 0x23001C );
/ / processFlt(module.base + 0x230020 , module.base + 0x231148 );
dm.callJNI_OnLoad(emulator);
System.out.println("");
}
|
跟作者的区别就是第二个参数需要设置成true,执行init去解密,要不然后面的步骤都会失败
DalvikModule dm = vm.loadLibrary("shpssdk", true);
跑完就能看到jni_onload执行了
接下来就是去混淆代码了,主要逻辑就是找到真实代码块,先找有辨识度的函数确定是真实块然后看他是怎么执行过来的
这个真实块是0x230020
对应汇编是比较w8的值然后beq,然后我们就可以unidbg中 判断对应代码是不是真实块,其中两个寄存器要相等
找完真实块就要找分支块,分支快是调用CSEL W8 跳到分发器的地方
看汇编他是最后把w9给到了w8,然后再分发器的时候用w8的值和w24比较,所以unidebg代码是
真实块和分支快都找到以后,最后一步把主分发器的地方打patch直接跳转到第一个真实块就ok了
最后真实效果是这样
根据 乐子人 大佬教程就能完整去除ollvm了。感谢大佬提供的思路和开源代码
更多【Android安全-unidbg模拟执行的去除ollvm混淆】相关视频教程:www.yxfzedu.com