首页 > 其他分享 >某试用版so保护调试器检测分析

某试用版so保护调试器检测分析

时间:2023-08-27 21:35:53浏览次数:32  
标签:嵌入 函数 代码 试用版 so got proc 调试器

so加固分析

查看so文件加固前的program header table

so文件被加固后program header table主要有以下几点变化。

  1. 第一个PT_LOAD代码段大小增加
  2. 在原so文件最后一个PT_LOAD段后新增加一个段
  3. .dynamic.rel.dyn.rel.plt三个重定位相关的节区会被移动到新增加的PT_LOAD段中
  4. .dynamic大小增加,说明新增加了项

查看.dynamic节区的内容,发现新增加了INITFINI类型的项

其扩大的PT_LOAD代码段是想嵌入自己的代码,而扩大代码段的前提是不能改变原始代码部分(包含.plt表)与.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加固后会增加INITFINI动态链接项,对应的就是.init.proc.term.proc导出函数。并且JNI_OnloadJNI_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表中下断,这样其调用什么函数就可以看到而不用一步一步跟进了,经过调试发现部分反调试项。

  1. 检测/proc/self/statusTracerPid标志
  2. 检测/proc/%d/cmdline父进程
  3. 通过map表读取linker映射并检测rtld_db_dlactivity函数
  4. time时间查检测
  5. 检测ida 的23946端口,并轮询连接并断开
  6. 检测/data/local/tmp中的frida-server等文件
  7. 一旦检测到调试器就调用abort函数触发got SIGABRT signal (Abort)

标签:嵌入,函数,代码,试用版,so,got,proc,调试器
From: https://www.cnblogs.com/revercc/p/17660894.html

相关文章

  • 使用 TensorFlow 进行机器学习
    使用TensorFlow进行机器学习这是使用TensorFlow进行机器学习的官方代码存储库。使用TensorFlow(Google最新、最好的机器学习库)开始进行机器学习。概括第2章-TensorFlow基础知识概念1:定义张量概念2:评估操作概念3:互动会话概念4:会话日志记录概念5:变量概念6......
  • [Microsoft Azure] Microsoft Azure VM Windows系统盘扩容
    本文将详细介绍如何扩展MicrosoftAzureVMWindows系统盘容量。您将学到如何在AzurePortal中调整磁盘大小,以及如何在Windows操作系统内部扩展分区,以实现系统盘容量的扩展。 随着应用程序和数据的不断增长,您可能会发现现有的MicrosoftAzure虚拟机(VM)Windows系统盘容量不再满......
  • github.com/json-iterator/go 详细教程
    最近接触到了github.com/json-iterator/go,是由滴滴开源的第三方json编码库,它同时提供Go和Java两个版本。文中大量内容来自github上的wiki文档,有兴趣的朋友可以直接点击Home跳转到官方文档查阅。本文加了些自己的思考以及相关的详细学习例子,废话不多说了,冲!!!1、基础介......
  • Long-read error correction: a survey and qualitative comparison (长读错误纠正:一
    BasicInformation:Title:Long-readerrorcorrection:asurveyandqualitativecomparison(长读错误纠正:一项调查和定性比较)Authors:PierreMorisse,ThierryLecroq,ArnaudLefebvreAffiliation:NormandieUniversité,UNIROUEN,INSARouen,LITIS,76000Rouen,......
  • 使用 XStream实现JavaBean 与 XML/JSON 之间相互转换
    XML和JSON是当今常用的两种数据描述与传输的格式,特别是涉及到JS时使用JSON颇为频繁。自然,在Java的世界里少不了完成JavaBean与这两种格式相互转换的组件,那就是XStream和JSON-lib。这里我简单记下XStream的用法。其实相类似的工具早已有之。如果用过DWR的同志,一定有印像,DWR进行远程......
  • StandardXAPoolDataSource的CheckLevelObject属性
    调用StandardPoolDataSource或者StandardXAPoolDataSource的setCheckLevelObject(int)方法设置连接检查级别,参数取值如下:0:不检查1:对unlocked池中获取的连接进行Closed检查2:对unlocked池中获取的连接进行sql测试,需要设置setJdbcTestStmt(TestSQL)......
  • Struts2标签错误:using Struts tags without the associat解决
    <filter-mapping><filter-name>struts2</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping> struts,在使用标签的时候,出现了这样一个问题。    原本使用标签,引用方法是默认配置:    web.xml:<filter><filter-name&......
  • jackson的使用
    1、jackson能做什么?Jackson被称为"JavaJSON库"或"Java的最佳JSON解析器"。不仅如此,Jackson还是一套适用于Java(和JVM平台)的数据处理工具,除了能处理json格式数据以外,还能处理csv、xml、(java)properties等格式数据。2、使用方法处理json数据maven中加入依赖<......
  • CrossOver 23 功能抢先看 CrossOver 23 版本更新了哪些功能
    本次发布的CrossOver23为用户带来了许多令人期待的新功能和优化,特别是对游戏方面的支持,更是让广大Mac游戏玩家兴奋。CrossOver23包括对Wine8.0.1的更新,带来了5000多处改动,对各种应用程序进行了改进。该版本还包括WineMono7.4.0、vkd3d1.8、DXVK1.10.3和MoltenVK1.2.3的......
  • jetty报错: Open quote is expected for attribute "{1}" associated with an element
    这个错误是使用jetty作为容器,但是java代码中,servlet是使用注解的形式标记一个类为servlet的,可能是版本不兼容吧,会报这个莫名其妙的错,解决方法是将这个servlet类配置到web.xml文件中,不要用注解的形式。......