0x00.BeingDebugged
1. PEB(Process Environment Block,进程环境块):
(1). 有种保护技术会检测是否有调试器正在调试保护软件,然后需要获取是否被调试的消息,这个消息存储在PEB结构中,PEB结构:
typedef struct _PEB {
BYTE Reserved1[2];
BYTE BeingDebugged; //被调试状态
BYTE Reserved2[1];
PVOID Reserved3[2];
PPEB_LDR_DATA Ldr;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
BYTE Reserved4[104];
PVOID Reserved5[52];
PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
BYTE Reserved6[128];
PVOID Reserved7[1];
ULONG SessionId;
} PEB, *PPEB;
(2).
BYTE BeingDebugged 这里就是记录程序的调试状态的,(1代表被调试,0代表没有被调试)我们可以使用 BOOL WINAPI IsDebuggerPresent(void);这个函数来检测是否有调试器存在,返回非0值代表被调试,如果返回0代表没有被调试
(3). 存储在另一个名为TEB(Thread Environment Block,线程环境块),Windows在调入进程,创建线程时,操作系统均会为每个线程分配TEB,而且FS段寄存器总是被设置成使得地址FS:0指向当前线程的TEB数据,这就为存取TEB数据提供了途径。Windows一般通过TEB间接得到PEB( https://en.wikipedia.org/wiki/Win32_Thread_Information_Block)
FS:[0x30] | 4 | NT | Linear address of Process Environment Block (PEB) |
mov eax,dword ptr fs:[00000030h] //获取PEB结构基地址
movzx eax,byte ptr [eax+2] //根据PEB结构,BeingDebugged
ret
(
所以利用以上远离OD可以清除掉BeingDebugged位来隐藏调试器)
(4). 然而!!!在WINDOWS XP SP2后的系统有了一个特性,PEB地址随机化!所以换一些套路来得到PEB -。-
(5). 下面两个函数就可以找到PEB,具体细节可以到对应网站查看。
//https://msdn.microsoft.com/en-us/library/windows/desktop/ms679363(v=vs.85).aspx
BOOL WINAPI GetThreadSelectorEntry(
_In_ HANDLE hThread,
_In_ DWORD dwSelector,
_Out_ LPLDT_ENTRY lpSelectorEntry
);
//https://msdn.microsoft.com/en-us/library/ms684280(VS.85).aspx