反调试是一种用于阻碍程序动态调试的技术,首先大致说明一下反调试的工作原理。 在操作系统内部提供了一些API,用于调试器调试。当调试器调用这些API时系统就会在被调试的进程内存中留下与调试器相关的信息。一部分信息是可以被抹除的,也有一部分信息是难以抹除的。
NtSetInformationThread通过ThreadInformationClass中ThreadHideFromDebugger来反调试 是 NtSetInformationThread 函数的一个参数,用于将当前线程隐藏起来,使得调试器无法对其进行调试。这个参数的作用是防止调试器附加到被隐藏的线程上进行调试操作。 当线程被隐藏后,调试器无法访问和控制该线程的执行。这可以用作一种反调试技...
已开启内核调试:有值 未开启内核调试:0 db KdDebuggerEnabled l1 已开启内核调试:1 未开启内核调试:0 dq KdDebuggerNotPresent l1 已开启内核调试:0 未开启内核调试:1 db KdpContext l4 已开启内核调试:有值 未开启内核调试:0 db KdBreakAfterSymbolLoad l1 已开启内核调试:1 未开启内核调试:0 db KdpDataBloc...
一、反调试技术概况 反调试技术对调试器和OS有很强的的依赖性,分类如下所示: 二、静态反调试技术 静态反调试技术主要是通过一些API探测调试器,并使程序无法运行 1、PEB PEB结构体信息可以判断进程是否处于调试状态 介绍具体可见:《逆向工程核心原理》学习笔记(六):高级逆向分析技术 几个用到的成员如下: 结构体成员...
第五、轮训检查自身status中的TracerPid字段值,防止被其他进程附加调试的一种有效方式! 所以本文就来一一讲解如何解决这几种方式的反调试方案。 二、方法总结 第一种:找到关键方法,注释代码 这种方式需要采用静态方式分析代码,找到关键方法进行反调试代码功能注释,这种方式可以应对与上面所有的反调试方案,但是对于轮训检查...
常见反调试 以下是我们经常会遇到到的一些反调试技术,为了好记一点,总结分为以下三类:通过调试的痕迹去识别是否正在被调试、识别调试器行为、干扰调试器功能。 1.调试痕迹识别 WindowsAPI 手动检测数据结构 系统痕迹检测 这里最常见得就是手动检测数据结构,也就是检测PEB(PEB表存放进程信息)表BeingDebugged,ProcessHeap...
反调试概念 反调试技术主要用于防止调试器观察和控制程序的执行,在商业软件和恶意软件中,常常会使用反调试来防止分析。 有些作者可能会在在程序中设计进行检测,例如:如果发现指令有CC,就知道有人在调试,就可以防止你调试(善意的可能会单纯关闭软件,或者让CC失效,恶意的会格盘,安装木马类似类似,这种手段叫做暗桩),这...
反调试 1. IsDebuggerPresent IsDebuggerPresent 用于检测当前进程是否正在被调试。该函数属于 Windows 调试辅助功能,可以帮助开发人员在程序运行过程中进行调试。 IsDebuggerPresent 函数的原型如下: BOOL IsDebuggerPresent(void); 该函数返回一个布尔值,如果当前进程正在被调试,则返回 TRUE;否则返回 FALSE。
这个方法是第三个方法的变种,只要进程被调试,进程在堆上分配的内存,在分配的堆的头信息里,ForceFlags这个标志位会被修改,因此可以通过判断这个标志位的方式来反调试。因为进程可以有很多的堆,因此只要检查任意一个堆的头信息就可以了,所以这个方法貌似很强大,例子如下: ...
一、x86下IsDebuggerPresent反调试以及反反调试 1、反调试 进程结构体PEB偏移0x2处是一个标志位,当当前程序在调试状态下时,这个标志位就会被改变: nt!_PEB +0x000 InheritedAddressSpace : UChar +0x001 ReadImageFileExecOptions : UChar +0x002 BeingDebugged : UChar isDbg值,8字节 ...