IsDebuggerPresent()

IsDebuggerPresent()   该函数读取当前进程的PEB里BeingDebugged的值用于判断自己是否处于调试状态

windows2000上是这样定义这个函数的

BOOL
APIENTRY
IsDebuggerPresent(VOID)
{
    return NtCurrentPeb()->BeingDebugged;
}

在x86下用windbg查看PEB结构

可知在PEB(进程环境块)偏移0x002处获得BeingDebugged

kd>  dt _PEB

nt!_PEB

   +0x000 InheritedAddressSpace : UChar

   +0x001 ReadImageFileExecOptions : UChar

   +0x002 BeingDebugged    : UChar

   +0x003 BitField         : UChar

   +0x003 ImageUsesLargePages : Pos 0, 1 Bit

   +0x003 IsProtectedProcess : Pos 1, 1 Bit

   +0x003 IsLegacyProcess  : Pos 2, 1 Bit

   +0x003 IsImageDynamicallyRelocated : Pos 3, 1 Bit

   +0x003 SkipPatchingUser32Forwarders : Pos 4, 1 Bit

   +0x003 SpareBits        : Pos 5, 3 Bits

   +0x004 Mutant           : Ptr32 Void

   +0x008 ImageBaseAddress : Ptr32 Void

   +0x00c Ldr              : Ptr32 _PEB_LDR_DATA

   +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS

   +0x014 SubSystemData    : Ptr32 Void

   +0x018 ProcessHeap      : Ptr32 Void

   ......

PEB(进程环境块)结构体地址存储在TEB(线程环境块)中,TEB结构如下

kd> dt _teb
nt!_TEB
   +0x000 NtTib            : _NT_TIB
   +0x01c EnvironmentPointer : Ptr32 Void
   +0x020 ClientId         : _CLIENT_ID
   +0x028 ActiveRpcHandle  : Ptr32 Void
   +0x02c ThreadLocalStoragePointer : Ptr32 Void
   +0x030 ProcessEnvironmentBlock : Ptr32 _PEB       //PEB(进程环境块)结构体地址存储在TEB(线程环境块)中
   +0x034 LastErrorValue   : Uint4B
   +0x038 CountOfOwnedCriticalSections : Uint4B
   +0x03c CsrClientThread  : Ptr32 Void
   +0x040 Win32ThreadInfo  : Ptr32 Void
   +0x044 User32Reserved   : [26] Uint4B
   +0x0ac UserReserved     : [5] Uint4B
   +0x0c0 WOW32Reserved    : Ptr32 Void
   ......

其中_NT_TIB结构如下

kd> dt _NT_TIB
nt!_NT_TIB
   +0x000 ExceptionList    : Ptr32 _EXCEPTION_REGISTRATION_RECORD
   +0x004 StackBase        : Ptr32 Void
   +0x008 StackLimit       : Ptr32 Void
   +0x00c SubSystemTib     : Ptr32 Void
   +0x010 FiberData        : Ptr32 Void
   +0x010 Version          : Uint4B
   +0x014 ArbitraryUserPointer : Ptr32 Void
   +0x018 Self             : Ptr32 _NT_TIB       // 其中+0x018 Self 是一个指向TIB的指针.同时也是TEB结构体的首地址
......

一般在FS段寄存器 地址FS:0指向当前线程TEB数据。

当我们需要TEB地址时,可以利用 mov eax, fs:[0x18]得到。且从上文可知在TEB偏移0x30处得到PEB地址。

固可以通过fs:[30h}获得当前进程的PEB地址。

两个模拟实现的函数

BOOL IsDebuggerPresentPEB()
{
#if defined (ENV64BIT)
    PPEB pPeb = (PPEB)__readgsqword(0x60);

#elif defined(ENV32BIT)
    PPEB pPeb = (PPEB)__readfsdword(0x30);

#endif

    if (pPeb->BeingDebugged == 1)
        return TRUE;
    else
        return FALSE;
}
//内联汇编版本BOOL MYIsDebuggerPresent()
{
      __asm{
            mov eax, fs:[0x30]
              movz eax, byte ptr [eax+2]
            }
}
时间: 2024-11-13 08:17:04

IsDebuggerPresent()的相关文章

反调试技术- IsDebuggerPresent,原理 与 反反调试

IsDebuggerPresent 这个函数可以用在程序中,检测当前程序是否正在被调试,从而执行退出等行为,达到反调试的作用. 1.IsDebuggerPresent 这个函数从汇编的角度看,就是一下三句代码.下面依次来分析这三句代码的原理. 75593789 K> 64:A1 18000000 mov eax, dword ptr fs:[18] 7559378F 8B40 30 mov eax, dword ptr [eax+30] 75593792 0FB640 02 movzx eax,

POCO库——Foundation组件之核心Core

核心Core: Version.h:版本控制信息,宏POCO_VERSION,值格式采用0xAABBCCDD,分别代表主版本.次版本.补丁版本.预发布版本: Poco.h:简单地包含了头文件Foundation.h: Foundation.h:使用其他任何Foundation模块前需要包含的头文件,主要定义库导出宏POCO_DLL.Foundation_API以及自动连接相应配置正确的库引用文件lib:包含库配置文件Config.h: 平台相关的Platform.h以及各个平台相应的文件Plat

简单脱壳教程笔记(10) --- 手脱EXE32PACK壳

本笔记是针对ximo早期发的脱壳基础视频教程,整理的笔记.本笔记用到的工具下载地址: http://download.csdn.net/detail/obuyiseng/9466056 EXE32PACK 1.ESP定律 1.将程序加载到OD中,发现有大段的加密指令,我们先单步走,到达关键指令,push ebp 2.单步运行到cmp eax,eax处,在寄存器窗口的esp处,右键在数据窗口跟随,并在数据窗口中进行设置硬件断点. 3.按运行,并删除硬件断点 4.然后单步,就会到达OEP 2.下断:

Windows 下常见的反调试方法

稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度. ①最简单也是最基础的,Windows提供的API接口:IsDebuggerPresent(),这API实际上就是访问PEB的BeingDebugged标志来判断是否处于调试状态. if (IsDebuggerPresent()) //API接口 { AfxMessageBox(L"检测到调试器"); } else { AfxMessageBox(L&qu

反调试技术

反调试技术在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己.为了了解如何破解反调试技术,首先我们来看看反调试技术. 一.Windows API方法 Win32提供了两个API, IsDebuggerPresent和CheckRemoteDebuggerPresent可以用来检测当前进程是否正在被调试,以IsDebuggerPresent函数为例,例子如下: BOOL ret

OllyDbg 使用笔记 (十九)

参考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 反调试 先看看这四个程序.(下载地址:http://pan.baidu.com/s/1pJCzABp) 它们自己运行时都没有问题,都显示被注册信息 "You really did it! Congratz it",但是一到OD中运行就会出现未注册或者报错. 这四个程序都对OD进行了反调试. 它们都用了IsDebuggerPresent这个API函数来判断是否程序被调试器调用. 可以先看看ReverseMe.A程序,正常

VC 程序崩溃异常处理集锦

1 Run-Time Check Failure: being used without being defined 场景 将一个未曾初始化的结构体作为参数传递给一个函数,在运行时出现如上的错误,尽管没有在函数中使用,但是依然需要进行结构体的初始化,重申初始化的重要性 2 Run-Time Check Failure Stack around the variable 'xxx'was corrupted 场景 查找所有xxx的引用,仔细推敲任何一处可能导致的数组越界问题,经常出现的情况: 1

英文不好也能快速&quot;记忆&quot; API

英文不好不要紧,把API函数导入打字练习类软件,即是练习打字速度,提高编程效率:也能短时间记忆API. 坚持每天打一遍,约2小时,连续打两周,会对API有很好的记忆,此方法是结合英文学习方法!以下是Window API函数例表,大家可以试试效果特别好! AbnormalTermination AbortDoc AbortPath AbortPrinter AbortProc AbortSystemShutdown AccessNtmsLibraryDoor ActivateKeyboardLay

DLL/EXE查看工具Dumpbin

一般情况下,我们需要查看一个DLL或EXE中的包含的函数或是依赖的函数之类的信息,可以使用VS自带的工具dumpbin: 可以直接在命令行下输入dumpbin就可以查看他的使用说明,如果未显示,可以先运行VS安装目录下的vcvarsall.bat来设置一下环境变量就可以了. [cpp] view plaincopy Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp. C:/Documents and Sett