免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵Python学院
工具下载:
链接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwd=zy89
提取码:zy89
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:37.安卓逆向2-frida hook技术-过firda检测(二)(过D-Bus检测和搭配maps检测进行使用)
通过SO文件过Frida检测原理是,Java肯定做不了Frida检测,因为可以直接被反编译源码直接就能暴露了,所以这种东西肯定会使用C++写,C++写完编译成SO文件,然后app使用Java代码去引入,然后调用SO的入口方法,然后由SO文件里的代码去检测Frida,然后就可以拦截安卓底层加载SO文件的函数,看看注入Frida后,什么SO文件加载了就退出了,比如加载 1、2、3、4、5,然后加载到5后一下让Frida退出了,这就很明显这个5在做Frida检测,然后找到这个SO文件,给它做点手脚来过检测
Frida hook安卓底层加载SO函数的代码,注意要使用重启的方式注入Frida
// 这段代码是给一个叫"Frida"的工具用的脚本
// Frida的作用是:可以钻进手机里的APP内部,看看这个APP在偷偷做什么
// 我们这段脚本的具体任务是:盯着APP加载"特殊文件"的行为// 首先,我们要找到APP加载文件时会用到的两个"工具函数"// 第一个工具函数叫"dlopen"
// 所有运行在Linux或安卓系统上的程序,要加载"动态链接库"(一种特殊文件,后缀通常是.so)时,经常会用到它
// "Module.findExportByName(null, "dlopen")"的作用:
// 1. 在系统的所有功能里找(null表示不限制范围)
// 2. 找到名字叫"dlopen"的那个功能,记录下它在内存中的位置
// 3. 把找到的结果存在变量"dlopen"里,方便后面使用
var dlopen = Module.findExportByName(null, "dlopen");// 第二个工具函数叫"android_dlopen_ext"
// 这是安卓系统专门设计的加强版加载工具,功能比dlopen更多一点
// 有些安卓APP会用这个函数来加载特殊的.so文件
// 下面这行代码的作用和上面类似:找到这个函数的位置,存在变量里
var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext");// 接下来,我们要给第一个工具函数"dlopen"装个"监控器"
// 当APP调用dlopen加载文件时,我们就能立刻知道
// "Interceptor.attach"就是Frida提供的"装监控器"的功能
Interceptor.attach(dlopen, {// 当APP刚开始调用dlopen函数时,会自动执行下面的代码// 可以理解为:监控器发现"有人要开始用这个工具了"onEnter: function (args) {// "args"是APP传给dlopen的参数(就像我们给工具传递的"指令")// dlopen的第一个参数很重要:它告诉工具"要加载的文件在哪里"// 这里的"args[0]"就是取第一个参数(计算机里计数从0开始)var path_ptr = args[0];// 刚才拿到的"path_ptr"其实是个"内存地址"(类似文件在仓库里的货架编号)// 我们需要根据这个编号,找到实际的文件路径(比如"/data/lib/test.so")// "ptr(path_ptr)"是把编号转成Frida能识别的格式// ".readCString()"是按照计算机存储文字的规则,把地址对应的内容读出来var path = ptr(path_ptr).readCString();// 最后,把我们发现的信息打印到屏幕上// 这样我们就能清楚地看到:这个APP用dlopen加载了哪个文件console.log("[发现使用dlopen加载文件:] ", path);},// 当APP用完dlopen函数(加载文件完成后),会执行下面的代码// 可以理解为:监控器发现"这个人用完工具了"onLeave: function (retval) {// 目前这里什么都没做,留空是因为我们暂时只关心"开始加载"这个动作// 如果以后想知道"加载成功了吗",可以在这里处理返回值retval}
});// 下面是给第二个工具函数"android_dlopen_ext"装监控器,原理和上面完全一样
Interceptor.attach(android_dlopen_ext, {// 当APP刚开始调用这个安卓特有的加载函数时onEnter: function (args) {// 同样取第一个参数:要加载的文件地址var path_ptr = args[0];// 把地址转成我们能看懂的文件路径var path = ptr(path_ptr).readCString();// 打印信息:APP用安卓特有的工具加载了哪个文件console.log("[发现使用安卓专用dlopen_ext加载文件:] ", path);},// 当APP用完这个函数后onLeave: function (retval) {// 这里也暂时什么都不做}
});
/**
总结代码的效果:就像我们在 APP 的 "文件加载通道" 上装了两个摄像头,一个盯着普通加载通道,一个盯着安卓专用通道。
只要 APP 从这些通道加载文件(特别是.so 格式的文件),摄像头就会立刻拍下 "文件地址" 并显示出来,让
我们清楚知道这个 APP 在运行时偷偷加载了哪些底层文件。
这种监控在分析 APP 的工作原理、查找恶意软件行为时非常有用。
*/
如下图红框,在加载完 /lib/arm64/libmsaoaidsec.so 就把Frida给Process terminated退出了
不知道谁退出的Frida?啥也别管,直接给ai,让ai告诉你
然后把app的apk文件进行解压,如下图,可以找到 libmsaoaidsec.so 文件
然后这个app的这个SO没办法通过删除来过检测(这个app中调用了SO里面好多方法,有些没有异常处理,会导致app崩溃),它这个就很麻烦了,只要了解一下就可以了,下一节使用魔改Frida来解决