Re:从零开始的逆向生活07day

前言

来自2024 MoeCTF Reverse方向进阶指北反调试部分的整理

概念

反调试(Anti-Debugging)是一种用于阻碍或干扰程序调试过程的技术,通常由软件开发者或者恶意软件作者使用,希望阻止他人对程序进行逆向分析,从而保护程序安全性或隐藏其内部实现

Linux反调试

检查/proc/self/status文件:在Linux中,每个进程都有对应的/proc/[pid]/status文件,包含了该进程的状态信息,包括是否被调试。反调试代码可以通过检查这个文件确定是否被调试

检查ptrace系统调用:调试器通常会使用ptrace系统调用对目标进程进行通信和控制。因此 反调试代码可以通过检查当前进程是否被其他进程使用ptrace进行跟踪来检测调试器的存在

使用fork和exec:反调试代码可以通过fork一个新进程,然后使用exec载入目标程序,以检测调试器的存在。因为调试器通常会在fork和exec这样的系统调用中注入一些代码来跟踪目标进程

捕获和处理信号: 调试器通常会使用信号来通知调试器当前进程的状态变化,比如断点触发或者单步执行。反调试代码可以通过捕获和处理这些信号来检测调试器的存在

检查调试器相关环境变量: 调试器通常会设置一些环境变量来控制调试过程。反调试代码可以 通过检查这些环境变量来确定是否被调试。

Windows反调试

一般分为R0和R3。R0指内核(Kernel)层面,在这个层面下通过Hook SSDT表,注册Obj回调等高权限操作进行反调试;R3是应用层的,要与硬件交流,需要调用dll中的函数,再通过这些函数syscall,进入Windows内核,完成R3->R0的切换。相较而言,R3反调试种类繁多,也简单,但组合起来逆向难度巨大

上图是x64dbg的一个反反调试插件(ScyllaHide)

TLS反调试

TLS(Thread Local Storage)是一种线程局部存储的机制,用于在多线程程序中实现线程间的数据隔离。简单来说,TLS允许每个线程都有自己独立的变量实例,这些变量只在当前线程内部可见,而不会被其他线程共享。

在反调试中TLS被用来实现一种技术,即在程序启动时、main函数执行前执行一些代码检测调试器是否存在或进行其他反调试操作,因为TLS段的代码在程序的其他代码执行前执行。

X64 syscall反调试

反反调试scyllahide原理是hook掉ntdll,kernel32dll,kernelbasedll中的相关函数, 在调用的时候返回正确值对程序进行伪装,让程序无法判断是否正在被调试,从而绕过。一些新的反调试直接在汇编中构造syscall,调用底层函数来检查反调试,这样的话ScyllaHide无法进行反反调试,可以尝试SharpOD插件或直接在内核进行对抗,使用TitanHide及其插件

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值