Android反调试方法总结以及源码实现之检测篇(一)

2023-11-20

好久没有更新博客了,主要是忙项目的事,今日总结一下在Android中常遇到的反调试方法,一来帮助需要之人,二来加深自己的理解。

反调试在代码保护中扮演着很重要的角色,虽然不能完全阻止攻击者,但是还是能加大攻击者的时间成本,一般与加壳结合使用,核心还是加壳部分。

反调试可以分为两类:一类是检测,另一类是攻击,前者是去想各种办法去检测程序是否在被调试,如果正在被调试的话做出一些“反”的举措,比如退出等等,(当然这里退出不是一个万全之策,因为你暴露了反调试的位置点,这样攻击者就比较容易过反调试,更好的是想办法不让攻击者发现,并且跳到另一个位置,让攻击者懵逼,小弟不才,本文是采用退出的方式,更好的方法读者可以自己YY),后者是采用攻击的方法,就是想办法让调试器不能正常工作或者是让调试器崩溃,从而阻止它,会在下一篇介绍。

本文只是简单反调试的一些基础部分,都是通过另起一个新的进程或者线程,这些很容易会使用kill大发杀死或者是通过别的方法挂起,从而很容易的过掉反调试,所以这时候会想到通过进程间通信的方式来确认反调试进程是不是还存在?这些会在下一篇里讲述。

第一种:一个进程最多只能被一个进程ptrace

我们知道在调试状态下,Linux会向/proc/pid/status写入一些进程状态信息,比如最大的变化是TracerPid字段会写入调试进程的pid,以下是在调试前后/proc/pid/status的文件的变化。


       被调试前                 被调试后



我们明显可以看到的是android_server附加的。

对于此中现象,解决的办法:一是根据Linux下一个进程最多只能被另一个进程跟踪,因此我们可以自己ptrace自己,然后让android_server不能够调试。

因此实现如下:


达到的效果是:


我们知道android所有的进程都是zygote进程fork出来的,那这里毫无疑问125就是zygote进程号。所以


以及达到的效果是IDA附加不上


解决办法:静态分析在JNI_0nload处把anti_debug01()方法NOP掉。具体不再阐述。

第二种:检测Tracerpid的值

根据以上第一种方法的分析我们可以检测Tracerpid的值,如果不为0,只能说明一点:当前进程正在被调试,那我们就kill掉退出。

这里就不细说,应该很好理解。

实现重要函数如下:


达到的效果就是在附加上以后程序会退出。


当然我们可以加一个线程机制进行循环检测,来增大攻击者破解的难度这也是很多加固厂商采用的办法。

解决办法:一是以debug模式启动,在JNI_Onload处下断点,找到那个调用方法NOP掉,二是直接静态分析JNI_Onload,直接去掉方法的调用。

第三种:检测android_server端口号

我们知道android_server的默认监听的端口号是23946,所以可以通过检测这个端口号来起到一定的反调试作用,在Linux系统中在/proc/net/tcp会记录这些连接信息,首先我们看到在没有连接android_server时候的信息列表:


在这里我们重点关注这一列:代表本地地址与端口号,对于其他信息如果读者有兴趣可上网自行查阅。

在连接上android_server以后我们可以看到信息列表多了一行


我们可以看到在底层多了个5D8A的端口,这个是十六进制表示正是十进制23946的表示,因此我们可以检测这个文件下面的这个端口号来进行达到反调试的作用。当然这里我们也可以通过执行netstat –apn命令来进行查看


那么接下来我们就开始实现,实现的代码如下:


达到的效果也是一样在调试的时候检测到那个端口会退出,跟上面一样。

解决办法:换那个端口,很简单。

第四种:通过检测android_server这些关键字以及文件目录

我们知道在调试进程的时候,这个进程会被IDA中的android_server ptrace,并且这个进程名字存在于“/proc/pid/cmdline”中,当然这里的pid指的是android_server的进程号,这个可以通过TracePid来获得,通过下面这个图可以看出来:


如果不明显,我们可以把它adb pull出来,可以看到的是:


因此说在这里可以检测这个名字,如果有这个名字说明正在被调试,那我们就可以kill掉这个程序。

一般情况下,android_server都会放在/data/local/tmp/文件下,因此我们还可以检测这个文件是不是有android_server,如果有,程序就退出。

在这里我们可以发现这个思路好像很白痴相对于前几种,如果我们把这个名字改掉,然后放到别的目录下,不就可以一直对付这个反调试了吗?但是如果这个方法是第一次被应用到加固里面,说不定那时会让人有一劲懵逼。

下面来看检测android_server关键方法的实现部分:


检测关键目录/data/local/tmp是一个道理,此处略过。

第五种:检测在调试状态下的软件断点

首先在进行这个方法理解时,要对在调试时下断点有一定的了解,发现下断点还是利用ptrace系统函数,不得不佩服ptrace函数的强大,决定以后专门拿出一章进行好好研究,特别是ptrace注入这一节,在调试器设置断点的时候,首先完成两件事:

第一:保存目标地址上的数据

第二:将目标地址上的头几个字节替换为break point指令,命中断点触发breakpoint,这时程序向操作系统发送SIGTRAP信号,调试器收到SIGTRAP信号后,调试器会回退被跟踪进程的当前pc值,当控制权回到原进程时,pc就恰好指向了断点所在位置,这就是调试器设置断点的基本原理。

说了一大堆,软件断点通过改写目标地址的头几字节为breakpoint指令,那接下来类似于前面所讲的几种方法,直接进行检测文件,我们可以遍历so中的在可执行segment,查找是否出现breakpoint指令即可。

关键函数实现如下:源码会在附件中呈现

1.首先读取ELF文件在内存中的地址:关键函数如下:


2.    然后读取完以后,根据其对应的偏移地址进行检测有没有ARM、Thumb、Thumb2的断点指令,如果有的话,就kill掉。程序源码见附件。

解决办法:这般函数可以在JNI_Onload、com_java_XX这类的函数进行调用,但是对于有经验的逆向者来说,经过几次动态调试就可以找出问题的原因,然后对关键函数进行NOP掉。

第六种:使用Inotify对文件进行监控

我们知道在我们的动态调试的过程中,一般会查看调试进程的虚拟地址空间或者是dump内存,这时候就会涉及到对于文件的读写以及打开的权限,这时候如果能够检测它们的变化,这样岂不是很美妙?

然而偏巧的是在Linux下inotify就可以实现对文件系统事件的打开,读写的监管。如果通过Inotify监管这些,收到事件的变化,那我们就Kill掉进程。这里介绍下面主要会用到的几个常用的api:

1.    inotify_init:用于创建一个 inotify 实例的系统调用,并返回一个指向该实例的文件描述符。Int fd=inotify_init();

2.    inotify_add_watch:增加对文件或者目录的监控,并指定需要监控哪些事件。

int wd =inotify_add_watch(fd,path,mask);

这里path表示你要监听的文件目录,mask表示监听事件掩码,就是监听读了写了还是打开,删除等等。

3.    read:读取包含一个或者多个事件信息的缓存。

主要是用来读取监听目录文件事件发生变化时的事件队列。

4.    inotify_rm_watch:从监控列表中移出监控项目。

这个很好理解就是删除一个watch。

5.    select(intnfds,fd_set* readset, fd_set* writeset, fe_set* exceptset,  struct timeval* timeout):

select的第一个参数是文件描述符集中要被检测的比特数, 这个值必须至少比待检测的最大文件描述符大1;参数readfds指定了被读监控的文件描述符集。

这里由于篇幅要求,介绍的不详细,读者可以自行百度。

接着看实现部分:


第七种:调试时候代码执行时间差异检测

我们知道如果在程序执行的时候关键代码的前后的时间差异肯定是要比在动态调试的时候对应的关键代码的前后的时间差异要小的多,因此我们可以获取系统的时间,计算前后的差异,如果超出一般正常情况下的设定值,我们就认为此处的代码正在被调试,这时候就可以选择退出。或者是做出一些其他的事,逻辑比较简单,那以下是代码关键点的实现部分:

当然这里最重要的是获取系统的时间,获取系统时间的办法有很多,网上也有很多,可以自行查阅,这里介绍一种:


达到的效果是让程序退出,起到反调试的作用。

当然这个方法可以放在一个关键的逻辑地方,这里起到的效果就是检测到当前程序正在被调试,那我们下一步可以可以就像上面说的让程序退出。当然更高级的方法是不让它退出,读者可以自己YY。

第八种:Dalvik虚拟机内检测调试器函数

由于Dalvik自带这些内部检测调试器的代码,大致上是在被调试以后,改变那个调试器的状态字段,既然反调试就是第一步想办法检测出它正在被调试,第二步是真正的“反”,我们可以不动声色的去“反”,读者可以想办法YY,这里不多叙述。

总结篇:

在这里看到的反调试都是以检测手段为主,也是比较常用的思路,当然也是一种低级反调试,因为容易爆露反调试点,只有在做反调试系统的时候这些手段交杂多用,才能给逆向者增加一定的成本开销。


附件篇:

附件是pdf文档和反调试源码:

点击打开链接

 


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android反调试方法总结以及源码实现之检测篇(一) 的相关文章

  • 使用新语法应用 Android Gradle 插件

    如何使用新的 Gradle 插件语法应用 Android 插件 plugins id version 代替 buildscript dependencies classpath com android tools build gradle
  • 将项目升级到Android Studio 1.0(Gradle问题)

    首先 我对 android 开发 android studio gradle 非常陌生 所以如果我问了一个愚蠢的问题 请原谅我 我的团队一直在使用 android studio 的 beta 版本开发一个项目 我刚刚安装了新版本 1 0 并
  • 如何在 android 中启动“添加联系人”活动

    您能告诉我如何在 Android 中启动 添加联系人 活动吗 谢谢 API 级别 5 及以上解决方案 Add listener so your activity gets called back upon completion of act
  • 如何访问android库项目中的资源

    我正在构建一个 android 库项目 它内部需要一些静态资源 图像 xml 等 然后我想知道我可以把这些资源放在哪里以及如何访问它们 既然我把资源放到了assets文件夹 我使用 AssetManager 来访问资源 public cla
  • Android:我可以创建一个不是矩形的视图/画布吗?圆形的?

    我有一个圆形视图 悬停在主要内容上方 gt 从屏幕出来的 z 轴方向 当有人点击屏幕时 我希望选择主要内容或悬停在上方的视图 当它覆盖主视图时 到目前为止效果很好 我在透明画布上有一个圆形物品 这意味着您可以看到该圆圈之外的背景的所有内容
  • Android PhoneGap 插件,UI 选项卡栏,调整 WebView 大小

    我正在创建一个美味的 PhoneGap 插件 希望一旦它能被打开 准备好了 插件基本完成了 我只需要一个漂亮的用户界面 相互作用 简而言之 我想创建一个 本机 android 工具栏组件 如果您实现 PhoneGap UIControls
  • onScale 事件后触发奇怪的 onScroll 事件

    我有一个同时使用 SimpleOnScaleGestureListener 和 SimpleOnGestureListener 的应用程序 每当我进行捏缩放时 我都会得到预期的 onScale 但是当我抬起时 我会看到一个奇怪的 onScr
  • 使用 HttpUrlConnection Android 将 base64 编码的图像发送到服务器

    我正在尝试使用 HttpUrlConnection 将 base64 编码的图像发送到服务器 我遇到的问题是大多数图像均已成功发送 但有些图像会生成 FileNotFound 异常 我的图像编码代码可以在下面找到 public static
  • 如何向开发人员发送崩溃报告?

    我开发 Android 应用程序 但在某些情况下我的应用程序force close 如果出现以下情况 我如何向开发人员发送包含详细信息的电子邮件force close随时发生 The ACRA https github com ACRA a
  • 如何在 NumberPicker 中一次显示 3 个以上的值

    我正在创建一个数字选择器 如下图所示 但如果有可用空间 我想显示 3 个以上的值 该选择器有 20 个项目 并且有足够的空间来显示 3 个以上的值 这可以使用 NumberPicker 来完成吗 只需以编程方式设置numberPicker
  • 来自相机的 MediaCodec 视频流方向和颜色错误

    我正在尝试流式传输视频捕获直接从相机适用于 Android 设备 到目前为止 我已经能够从 Android 相机捕获每一帧预览帧 byte data Camera camera 函数 对数据进行编码 然后成功解码数据并显示到表面 我用的是安
  • 如何从android中的外部存储中获取所选文件的文件路径?

    我在选择文件的文件路径时遇到问题 我搜索了整个堆栈溢出 但问题没有解决 从设备中选择文件的代码如下所示 Intent intent new Intent Intent ACTION GET CONTENT intent setType in
  • android textview 有字符限制吗?

    我正在尝试在 android TextView 中输入超过 2000 3000 个字符 它不显示任何内容 任何一份指南是否对 android textview 有字符限制或什么 我在G3中做了一些小测试 我发现 如果activtiy布局中有
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • Android Root 执行 su 带参数

    我在使用参数执行 su 时遇到问题 包含空格 我的 Command java 看起来像这样 public class Command Process process public String executeCommand String c
  • Activity 类型中的方法 showDialog(int) 在 Android 中已被弃用?

    方法showDialog int 从类型Activity is 已弃用 什么原因 以及如何解决 什么原因 http developer android com reference android app Activity html show
  • 使用Intent拨打电话需要权限吗?

    在我的一个应用程序中 我使用以下代码来拨打电话 Intent intent new Intent Intent ACTION CALL Uri parse startActivity intent 文档说我确实需要以下清单许可才能这样做
  • Flash 对象未显示在phonegap android 中

    我已经在 android 手机间隙创建了一个应用程序 我有一个屏幕 我想显示一个静态 flash obj 所以我在屏幕 HTML 页面中放入了以下代码
  • 如何正确编写AttributeSet的XML?

    我想创建一个面板适用于 Android 平台的其他小部件 http code google com p android misc widgets 在运行时 XmlPullParser parser getResources getXml R
  • 如何在布局编辑器中模拟沉浸式模式

    我想在布局编辑器中全屏查看我的布局 我正在使用 eclipse 插件 我已经通过选择隐藏了 ActionBar NoActionBar组合中的主题 但导航栏是一个不同的故事 AFAIK 它只能使用代码中的标志来隐藏 我需要在活动 xml 文

随机推荐

  • ModuleNotFoundError: No module named ‘tensorflow.contrib‘

    代码错误 Traceback most recent call last File D PyCharm PythonProject DRL Networking master DRL Networking master IPDPS2020
  • Android4.0 SDK功能详解

    我在eoe的论坛找到的 就复制过来了 跟大家分享一下 Android 4 0 平台API等级 14 Android 4 0 是一次重要的平台发布版 为用户和应用程序开发者增加了大量的新特性 在下面我们将讨论的所有新特性和API中 因为它将
  • 【C++】C++11语法之右值引用

    文章目录 一 的扩展 initializer list的讲解 二 C 11一些小的更新 decltype nullptr 范围for 新容器 三 右值引用 右值真正的用法 完美转发 默认成员函数 总结 一 的扩展 在原先c 的基础上 C 1
  • 操作系统:进程学习笔记

    前言 程序顺序执行的三大特性 1 顺序性 指处理机严格按照程序所规定的的顺序执行 2 封闭性 指程序在封闭的环境运行即程序运行时独占全机资源 资源状态只能有本程序才能够改变它 程序一旦执行 其运行结果不受外界影响 3 可再现性 指只要程序执
  • 编写Shell脚本(批处理,一次执行多条命令)

    Bash终端的优势 1 上下键重复执行命令 2 tab键自动补齐 3 提供有用的环境变量 4 批处理 shell脚本文件建议以 sh为后缀 其实vim创建文本文件时 对名字无要求 但最好规定格式 echo SHELL 输出为 bin bas
  • grep的用法

    命令介绍 Linux系统中grep命令是一种强大的文本搜索工具 它能使用正则表达式搜索文本 并把匹配的行打印出来 匹配到的标红grep全称是Global Regular Expression Print 表示全局正则表达式版本 它的使用权限
  • khv是什么虚拟服务器,服务器虚拟化vSphere4 vs Hyper-V R2,选择谁?

    目前在X86服务器平台上做虚拟化 是非常热的 目前主要有两个选择 VMWare的vSphere4和微软的Hyper V R2 VMWare非常成熟 企业级用户很多 但价格不便宜 按照CPU数量和版本收费 Hyper V R2很便宜 但出来的
  • 检查内存泄露

    自己编写的视频处理程序出现了一个问题 每帧的运行时间随着运行时间在不断增长 很大可能是出现了内存泄露 于是学习了一些查看内存泄露的方法 做了两种尝试 一是VS自带的DEBUG下的检测 view pl html view plain copy
  • Windows上让Qt5 QCamera响应UVC摄像头硬件按钮拍图

    QCamera相机类提供了一些基本的功能 包括拍照和录制功能 Windows上不支持录制视频 但也有很多接口是没有封装的 比如有些UVC摄像头有物理按键 可以进行拍图等操作 但是QCamera没法响应硬件按钮的拍图操作 网络上的相关代码都是
  • RC-u4 相对论大师(bfs求解指定路径)

    PTA 程序设计类实验辅助教学平台 题解 bfs可以求解从根节点到叶子节点的指定路径 这里的vis 不是为了防止访问到父节点 更多的是为了缩小路径长度 mpp和mp的映射也很巧妙 开始我用的还是map
  • [从零开始学习FPGA编程-38]:进阶篇 -语法-函数与任务

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 什么是函数Function 1 1 什么是函数 1 2 函
  • 【JAVA】输入:Scaner

    一 语法 1 导入 import java util Scanner 2 创建对象 Scanner scanner new Scanner System in 3 创建变量 int x scanner nextInt next系列 next
  • 服务器运维基础指南

    服务器运维基础指南 作为一个开发人员 对于服务器的操作不可避免 最常用的操作就是部署应用到服务器 及在生产 测试环境通过查看日志排查问题 一般服务器都是linux操作系统并且是无图形界面的 所以进行任何操作都是通过命令行 由于从新一代程序员
  • Android 中的AIDL 和 binder机制

    一 Binder 1 线程间通信Handler Handler和Binder是Android通信的两大支柱 Handler是线程间通信的基础 一个App的运行一定是多个线程相互协作的过程 特别是Android子线程不能更新UI界面的限制使得
  • 微信使用精准位置 wx.getLocation步骤

    微信小程序 gt 开发设置 gt 接口设置 gt 开通 wx getLocation 申请理由 应当前业务涉及周边服务推荐需要 需获取用户地理位置信息 调试基础库 2 24 4 在app json中添加 requiredPrivateInf
  • VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题...

    VC9编译的程序在没有装过VC9 确切的说是 Net Framework3 5 的机器上运行时 如果提示 由于应用程序配置不正确 应用程序未能启动 重新安装应用程序可能会纠正这个问题 这个错误 那么就说明该程序动态链接了VC9的运行时库 如
  • Java 实现 SCP 携带密码拷贝文件

    package com miracle luna scp import org apache sshd client SshClient import org apache sshd client session ClientSession
  • 线上阿里云短信盗刷问题实录

    背景 营销系统中有定时任务处理将待支付订单变更为已取消 执行时间五分钟一次 业务执行处理异常会发送短信给相关开发人员进行短信提醒 从下午一点二十五开始 开发人员间隔五分钟就会收到业务执行异常的短信提醒 最初因为测试或是正式环境中确实有异常的
  • 国产化系统下操作PDF

    本文围绕使用netcore 跨平台在国产系统 麒麟和统信 操作PDF 首先netcore 需要第三方dll 在Nuget里搜索itextsharp 选择图片中 安装即可 版本写了 itextsharp 是4 16 比较靠后 但是基本功能都有
  • Android反调试方法总结以及源码实现之检测篇(一)

    好久没有更新博客了 主要是忙项目的事 今日总结一下在Android中常遇到的反调试方法 一来帮助需要之人 二来加深自己的理解 反调试在代码保护中扮演着很重要的角色 虽然不能完全阻止攻击者 但是还是能加大攻击者的时间成本 一般与加壳结合使用