jnitrace干企业so强混淆
主要面临问题:
so层找不到对应的注册函数 搜不到JNI_OnLoad函数 RegisterNatives函数 和.init_array段 对抗了frida 强混淆
文中涉及的工具可以到星球里自取!
我们先看下java层函数
我们把so扔进IDA 搜一下函数名 cB cC 均没有;
应该不是静态注册的函数可能是动态注册;再搜下RegisterNatives也是无果;那就是隐藏起来了。
动态注册一般在JNI_OnLoad函数中,搜一下JNI_OnLoad函数,和RegisterNatives函数 均没有
ctrl s 看下 .init_arry段也没有
说明so ELF格式被破坏掉了,好吧我们内存dump这个so
上frida脚本
function dump_memory(start,end,name) {
Java.perform(function () {
var currentApplication = Java.use("android.app.ActivityThread").currentApplication();
var dir = currentApplication.getApplicationContext().getFilesDir().getPath();
var file_path = "/sdcard" + "/" + name+start.toString(16)+"_"+end.toString(16);
var file_handle = new File(file_path, "wb");
var size = end - start;
if (file_handle && file_handle != null) {
Memory.protect(ptr(start), size, 'r');
var libso_buffer = ptr(start).readByteArray(size);
file_handle.write(libso_buffer);
file_handle.flush();
file_handle.close();
console.log("[dump]:", file_path);
}
});
}
var a = Process.enumerateModulesSync();
var baseaddr = Process.findModuleByName('libdexjni.so').base;
console.log("soBaseAddr:" + baseaddr);
var sosize=Process.findModuleByName('libdexjni.so').size;
dump_memory(parseInt(baseaddr),parseInt(baseaddr)+parseInt(sosize),"dump");
attach 方式附加一下 发现失败了
Spawn 方式再试一下,直接挂掉了,这里小报错是因为Spawned方式启动加载脚本早于so被执行起来,按理说并不影响附加程序
我这里判断对抗了frida,没事我们再用objecion 试一下 还是不行
换个加强版去掉特征的frida的server启动,我再启动objecion发现可以附加
因为端口被改掉了,所以需要先转发下端口再启动
adb forward tcp:28042 tcp:28042
objection -N -h 127.0.0.1 -p 28042 -d -g com.rytong.ceair explore
我们查看下这个so的导出函数,名字完全被混淆了, 好吧先不管了,我们先dump他吧
memory list exports libdexjni.so
接下来直接加载之前的dump脚本吧
尝试attach发现还是附加不上,没关系我们Spawn方式虽然执行的时候 so文件并未加载起来,等程序完全起来,so加载进来的时候,我们把代码复制进去再跑一下。
直接把代码复制进来并执行,我们看到so 已经dump下来了
我们取出再拉进IDA,再看下,so的格式出了点问题
sofixer修复一下
D:\so\sofixer-windows-64.exe -s C:\Users\cxf\Desktop\11\dump781938e000_781968d000.so -o C:\Users\cxf\Desktop\11\dump.so
进JNI_OnLoad看下 ,看着很像动态注册
进入sub_A070 方法看下分析下,混淆的很难分析了有的地方也反编译失败了
我们用JNItrace 帮助我们动态跟踪一下,因为jnitrace依赖与Frida 所以我们还是要使用加强版frida
jnitrace -R 127.0.0.1:28042 -l libdexjni.so com.rytong.ceair
log里搜索一下RegisterNatives 我们看到了注册表,对应的函数名j__I0I5IIIlIIIIIlIIIlll_IIlI5llS5$
ida搜索一下这个函数,这里便是注册函数的地方也能和java层函数对应上了
我们随便点进一个函数 看样子是加了ollvm 但是代码块不是很大,用下断的方式还是可以梳理清楚逻辑。
由于主要目的是帮助群友找到函数注册的位置所里这里暂不调式分析了。
随手分享、点赞、在看是对我们最大的支持