ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

一些反调试手段及对应的逆向思路

2021-07-06 13:33:30  阅读:471  来源: 互联网

标签:逆向 检测 进程 思路 断点 android 调试 调试器


实践还少,暂且没遇到,不过先来打个预防针,熟悉下。

首先什么是反调试:防止程序被调试,保护代码。一种加固手段。

万事无绝对,不能阻止,但能缓解,让破解者消费精力。一般的,该手段会与加壳并用。

如何来反调试呢?大方向有两类:检测,攻击。

1. 检测

检测程序是否被调试,若是的话做出一些“反”措施,例如退出,跳到其他位置等。

2. 攻击

让调试器崩溃,阻止调试。

1. 一般的,大多通过另启进程或线程。

基础知识:一个进程最多只能被一个进程ptrace:调试状态下,linux向/proc/pid/status写入一些信息,其中的tracerpid即为调试进程的pid。

于是,反调试策略:自己trace自己来防止其他进程附加进来调试:

一些反调试手段及对应的逆向思路

逆向方法:在jni_load前将对应的增加调试方法去掉/nop掉。

2. 检测tracerpid值,若不为0则代表被调试,于是可以选择退出:

一些反调试手段及对应的逆向思路

为了更好的加固,一般的会增加线程机制循环监测该值。

逆向方法:以debug模式启动,在jni_load处下断点,找到以上检测tracerpid值的函数将其nop掉;或者静态分析jni_load找到以上方法将其去掉。

【以上两者都是在jni_load函数处做文章,why?---需要了解下加载机制。。:不仅要知其然!更要知其所以然!】

3.检测android_server端口。

一般的,调试时启动android_server后,默认的监听端口是23946(可以在启动android_server后看到监听的是哪个端口号)。故可以检测 该端口号来反调试。

[在使用android_server时,不要看一些别人的破解思路使用的一些信息例如端口,应该根据自己的情况先做好判断!]

使用的一些命令:cat  /proc/net/tcp[检测连接信息,发现端口。注意这里的表示是16进制需要转化为10进制来看]

next,netstat -apn[看端口监听状态]

反调试手段:若此时特定端口23946[监听端口号]为监听状态则退出:

一些反调试手段及对应的逆向思路
 

逆向方法:换端口。

[需要熟悉下windows命令行一些命令..]

4.检测android_server关键字及文件目录:

运行时,进程名会写在/proc/[pid]/cmdline文件中,若在该文件中检测到该文件名则说明被调试。或者在特定目录下检测android_server文件,该文件一般放在/data/或者/data/local/tmp目录下,若存在则程序退出。

使用如下来获得pid,然后获得进程名,如下图

检测代码:

一些反调试手段及对应的逆向思路

逆向方法:改名字,放在其他目录下。

5.检测在调试状态下的软件断点。

需要了解下调试器下断点调试的原理。

下断点利用的是ptrace函数(http://man7.org/linux/man-pages/man2/ptrace.2.html )。调试器下断点时主要做两件事:保存目标地址的数据;将目标地址的头几个字节替换为break point指令。当命中断点时触发breakpoint,向系统发送sigtrap信号,调试器收到后会回退被跟踪进程的当前pc值,当控制权回到原进程时,pc指向断点所在位置。(调试器工作原理及断点原理又是博大的一部分,之后另起一篇吧)

[另附安卓虚拟机调试http://www.droidsec.cn/android虚拟机调试器原理与实现/ ]

故凡调试策略为:遍历so文件中的可执行字段,查找是否出现breakpoint指令。

首先读取elf文件在内存中的地址:

一些反调试手段及对应的逆向思路
然后检测有无arm, thumb, thumb2的断点指令,若有则kill程序。

逆向方法:一般这些函数在jni_onload,com_java_**函数中调用,将其nop掉。

6.一般的,动态调试时会查看虚拟进程的内存空间或dump内存,这样的操作会涉及对文件的打开,读写操作。这时可以通过linux下的inotify函数(https://linux.die.net/man/7/inotify )对文件的打开,读写进行监控。若有变化,则退出进程。[linux文件系统的一些操作信息需要学习下]

在该过程中常用的api有以下:

一些反调试手段及对应的逆向思路
 

实现反调试时:

一些反调试手段及对应的逆向思路

逆向思路:与前面类似,找到方法nop掉。

7.

根据程序执行关键代码前后时间差异来检测:动态调试时这一时间差要比正常执行时的时间差大。

检测时可以获得系统时间计算时间差,若超过正常设定值,则为被调试状态,将进程kill掉。一般这段检测代码会放在关键逻辑处。

逆向思路:nop掉。

8.dalvik虚拟机内检测调试器函数(并没懂...)

有待持续更新……

标签:逆向,检测,进程,思路,断点,android,调试,调试器
来源: https://blog.csdn.net/iopoint/article/details/118518300

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有