某试用版so保护调试器检测分析
so加固分析#
查看so文件加固前的program header table
,
so文件被加固后program header table
主要有以下几点变化。
- 第一个
PT_LOAD
代码段大小增加 - 在原so文件最后一个
PT_LOAD
段后新增加一个PT_LOAD
段 .dynamic
,.rel.dyn
和.rel.plt
三个重定位相关的节区会被移动到新增加的PT_LOAD
段中.dynamic
大小增加,说明新增加了项
查看.dynamic
节区的内容,发现新增加了INIT
和FINI
类型的项
其扩大的PT_LOAD
代码段是想嵌入自己的代码,而扩大代码段的前提是不能改变原始代码部分(包含.plt表)与.got
表在内存中的相对偏移,因为原始代码是通过相对偏移的到.got
中的重定位后的数据的(也不是不能改变,只不过改变的话需要重新计算偏移并修改got表引用的相关代码)。代码段和.got
表属于不同的PT_LOAD
段,想要增加足够大的空间嵌入代码在两个PT_LOAD
段中间寻找显然是不行的,只能在代码段最开头的代码之前去开辟空间。查看原始so最开始的代码,实际就是plt表起始位置,对应的偏移为0x20F2C
查看加固后so,原始.plt表之前(0x1A1F2C)除了包含原始so的数据外,其余部分都是加固后嵌入的代码。
查看嵌入的代码,发现其嵌入代码自身的.plt
调用
根据代码找到对应嵌入代码的.got
表位于新增加的PT_LOAD
段的起始位置,刚好与原始so的.got
表紧挨着。
既然嵌入的代码有.got
表,所以一定需要重定位,那么就需要向.rel.dyn
和.rel.plt
表中新增加项(.dynstr和.dyntab也同样要增加)。同时因为嵌入代码与.got
表之间的相对偏移是不确定的所以在嵌入代码时需要经过计算相对偏移动态生成对应的代码。
so文件加固前后的变化大致如下
反调试分析#
so加固后会增加INIT
和FINI
动态链接项,对应的就是.init.proc
和.term.proc
导出函数。并且JNI_Onload
和JNI_OnUnload
函数都会被劫持,劫持函数中在调用原始的JNI_Onload
函数。
查看.init_proc
函数,也就是嵌入代码部分存在着大量花指令
frida hook一下fopen
发现一直轮询打开/proc/self/maps
,/proc/self/status
和/proc/pid/cmdline
,这些都是反调试经常会检测的地方。其中栈回溯后发现调用的地方都在嵌入代码位置,也就是0x1A1F2C
偏移之前的代码,既然是轮询肯定创建了线程。
frida hook pthread_create
函数并判断线程函数的偏移是否在嵌入代码范围内,如果是就直接返回。因为嵌入代码的执行时机肯定是在.init.proc
或者是劫持的JNI_Onload
函数中,所以可以hook call_constructors
来获取最早的时机执行hook,这里不能再hook call_array
获取执行时机了,因为call_array
调用.init_array
中的函数时INIT
(.init_proc)函数已经执行过了。最后看到有两个在嵌入代码创建的线程被阻止,之后就可以正常调试了。
最后看一下其反调试检测了哪些东西,因为代码被花了,用unicorn
模拟跑一下.init.proc
函数,发现再执行了大量垃圾指令后才看到关键代码,是.plt
表调用对应的是malloc
函数
所以这里直接在其嵌入代码的所有.plt
表中下断,这样其调用什么函数就可以看到而不用一步一步跟进了,经过调试发现部分反调试项。
- 检测
/proc/self/status
的TracerPid
标志 - 检测
/proc/%d/cmdline
父进程 - 通过map表读取
linker
映射并检测rtld_db_dlactivity
函数 time
时间查检测- 检测ida 的
23946
端口,并轮询连接并断开 - 检测
/data/local/tmp
中的frida-server
等文件 - 一旦检测到调试器就调用
abort
函数触发got SIGABRT signal (Abort)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】