学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1157

主题
发表于 2020-9-6 10:33:21 | 查看: 6156| 回复: 1
                                                                                        目录

    • 静态反调试技术
      • 1 PEB
        • 1.1 BeingDebugged +0x002
        • 1.2 Ldr  +00c
        • 1.3 ProcessHeap +0x018
        • 1.4 NtGlobalFlag  +0x068
        • 示例StaAD_PEB.exe
          • IsDebuggerPresent()&BeingDebugged
          • Ldr
          • ProcessHeap
          • NtGlobalFlag
      • 2 NtQueryInformationProcess()
        • 2.1 ProcessDebugPort(0x07)
        • 2.2 ProcessDebugObjectHandle(0x1E)
        • 2.3 ProcessDebugFlags(0x1F)
        • 破解之法
        • 示例 StAD_NtQIP
      • 3 TLS
      • 4 ETC
        • 示例
静态反调试技术  本文介绍了几种常见的静态反调试技术,包括PEB,LTS等
文中用到的程序资源https://download.csdn.net/download/weixin_45551083/12549567
1 PEB
  TEB(Thread Environment Block,线程环境块)系统在此TEB中保存频繁使用的线程相关的数据。位于用户地址空间,在比 PEB 所在地址低的地方。进程中的每个线程都有自己的一个TEB。一个进程的所有TEB都以堆栈的方式,存放在从0x7FFDE000开始的线性内存中,每4KB为一个完整的TEB,不过该内存区域是向下扩展的。在用户模式下,当前线程的TEB位于独立的4KB段,可通过CPU的FS寄存器来访问该段,一般存储在[FS:0]。
  PEB(Process Environment Block,进程环境块)存放进程信息,每个进程都有自己的PEB信息。位于用户地址空间。在Win 2000下,进程环境块的地址对于每个进程来说是固定的,在0x7FFDF000处,这是用户地址空间,所以程序能够直接访问。
  • 获取PEB地址:
    (1) 直接获取
mov eax,fs:[0x30]
mov PEB,eax
  (2) 先获取TEB地址,再获取TEB
mov eax, fs:[0x18];0x18处是TEB地址
mov eax, ds:[eax+0x30]
  • PEB中与反调试密切相关的成员:
+0x002 BeingDebugged
+0x00c Ldr
+0x018 ProcessHeap
+0x068 NtGlobalFlag 
1.1 BeingDebugged +0x002  ​进程处于调试状态时,PEB.BeingDebugged成员的值设为1.在非调试状态下为0;
  • IsDebuggerPresent() API
    通过获取PEB.BeingDebugged的值来判断是否处于被调试状态,被调试返回非0值,未被调试返回0值
    修改PEB.BeingDebugged的值或者IsDebuggerPresent() 的返回值即可破解
1.2 Ldr  +00c  ​调试进程时,其堆内存区域中会出现一些特殊标识,表名它正处于被调试状态.最醒目的是.未使用的堆内存区域全部填充着0xEEFEEEFE.利用这一特征可判断是否处于被调试状态.
​PEB.Ldr 指向_PEB_LDR_DATA结构体指针,_PEB_LDR_DATA恰好是在堆中创建的.检测_PEB_LDR_DATA是否是0xEEFEEEFE即可判断是否处于被调试
​将填充着0xEEFEEEFE的区域写为NULL即可破解
1.3 ProcessHeap +0x018  ​PEB.ProcessHeap指向HEAP结构体.
​HEAP结构体中与反调试有关的:
+0xC  Flags
+0x10 ForceFlags
  程序正常运行时,
​HEAP.Flags=0x2
​HEAP.ForceFlags=0
调试时会发生变化.
  • GetProcessHeap()
    获取Flags和ForceFlags值来判断是否处于调试状态
    破解: 将HEAP.Flags重新修改为2 HEAP.ForceFlags修改为0
1.4 NtGlobalFlag  +0x068  ​调试进程时,PEB.NtGlobalFlag会被置为0x70
破解:修改为0即可
示例StaAD_PEB.exeIsDebuggerPresent()&BeingDebugged
  • 在0x00401000处下断点(main)
  • 逐步跟踪会发现存在IsDebuggerPresent()API的调用

    常见静态反调试技术总结

    常见静态反调试技术总结
  • F7进入

    常见静态反调试技术总结

    常见静态反调试技术总结
  • 继续跟踪

    常见静态反调试技术总结

    常见静态反调试技术总结
  • 先取得了PEB的地址(fs:[30]),再得到BeingDebugged标志位的值.(win xp下会看到eax值为1,改为0即可)

    常见静态反调试技术总结

    常见静态反调试技术总结

Ldr
// GetModuleHandle函数声明 :
//获取已经载入进程空间的模块句柄
HMODULE WINAPI GetModuleHandle(
  _In_opt_ LPCTSTR lpModuleName//需要获取句柄的模块名。
);
//GetProcAddress函数声明:
//获得函数地址
FARPROC GetProcAddress(
  HMODULE hModule,   // handle to DLL module 
  LPCSTR lpProcName   // name of function 
); 
NtCurrentTeb()函数:返回一个指针,指向TEB
  • 这段代码先获取了TEB的地址,在获取PEB地址并保存至EBX,并压入栈中

    常见静态反调试技术总结

    常见静态反调试技术总结
  • 下图中是关键循环位置,在此处不停从PEB.ldr所处的位置取值与0XEEFEEEFE比较,若检查出0xEEFEEEFE,则跳转到Debugging位置.

    常见静态反调试技术总结

    常见静态反调试技术总结

ProcessHeap
  • 前面[ebp-30]处,存放的是PEB位置

    常见静态反调试技术总结

    常见静态反调试技术总结
  • 根据PEB找到ProcessHeap(+0x18) ,再找到+0xc位置处的 Flags标志位并与0x2比较判断是否处于调试状态

    常见静态反调试技术总结

    常见静态反调试技术总结
  • 下面测试ForceFlags是否为0,test esi esi来判断esi是否为空(0).

    常见静态反调试技术总结

    常见静态反调试技术总结

NtGlobalFlag
  • 同样取得NtGlobalFlag  (+0x068)位置后与 0x70间接比较

    常见静态反调试技术总结

    常见静态反调试技术总结

2 NtQueryInformationProcess()  NtQueryInformationProcess顾名思义就是取进程信息 他是属于ntdll.dll里面的一个未公开的api函数
NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess (
  IN HANDLE         ProcessHandle,       // 进程句柄
  IN PROCESSINFOCLASS   InformationClass,      // 信息类型
  OUT PVOID         ProcessInformation,     // 缓冲指针
  IN ULONG          ProcessInformationLength, // 以字节为单位的缓冲大小
  OUT PULONG         ReturnLength OPTIONAL     // 写入缓冲的字节数
);
  ​它的第二个参数可以用来查询进程的调试端口。如果进程被调试,那么返回的端口值会是-1,否则就是其他的值。由于这个函数是一个未公开的函数,因此需要使用LoadLibrary和GetProceAddress的方法获取调用 .
​与调试有关的第二个参数(InformationClass)的值:
​ProcessDebugPort(0x07) , ProcessDebugObjectHandle(0x1E) , ProcessDebugFlags(0x1F)
​第二个参数指定不同的值 , 返回结果会返回在 ProcessInformation(第三个参数)
2.1 ProcessDebugPort(0x07)  ​进程处于调试状态时,操作系统会为他分配1个调试端口(debug port) , InformationClass设为ProcessDebugPort(0x07) 时,调用NtQueryInformationProcess()函数就可以获取调试端口.
​若处于调试状态 , 第三个参数会被置为0xFFFFFFFF(-1)
​若处于非调试状态,第三个参数值会被设置为0
  • CheckRemoteDebuggerPresent() API
    实际上也是调用了NtQueryInformationProcess(ProcessDebugPort)
BOOL WINAPI CheckRemoteDebuggerPresent(
  _In_    HANDLE hProcess,
  _Inout_ PBOOL  pbDebuggerPresent
);
  如果调试器存在 (通常是检测自己是否正在被调试), 该函数会将pbDebuggerPresent指向的值设为0xffffffff.
2.2 ProcessDebugObjectHandle(0x1E)  ​调试进程时,会生成一个调试对象(Debug Obiect). NtQueryInformationProcess()第二个参数值为0x1E时 , 函数的第三个参数就能获取到调试对象句柄 ,
​进程处于调试状态->调试句柄存在->返回值不为NULL
​处于非调试状态 , 返回值为NULL
2.3 ProcessDebugFlags(0x1F)  ​调试标志:Debug Flags
​检测调试标志的值也可以判断进程是否处于被调试状态.
​NtQueryInformationProcess()第二个参数为0x1F
​第三个参数:
​调试状态:0
​非调试状态:1
破解之法
  • API HOOK(多次调用该API 时)
  • 修改返回值(仅调用几次该API)
示例 StAD_NtQIP
  • 先间接获得NtQueryInformationProcess()位置

    常见静态反调试技术总结

    常见静态反调试技术总结
  • [local.1],[local.2],[local.2]可以判断出是携带返回结果的参数ProcessInformation
  • 传入0x07判断返回值是否为0(非调试状态)

    常见静态反调试技术总结

    常见静态反调试技术总结
  • 传入0x1E判断返回值是否为NULL(0)(非调试状态)

    常见静态反调试技术总结

    常见静态反调试技术总结
  • 传入0x1F判断返回值是否为0(调试状态)

    常见静态反调试技术总结

    常见静态反调试技术总结

3 TLS  ​编程中启用了TLS功能 , PE头文件里就会设置TLS表 具体位置:(IMAGE_TLS_DIRECTORY)位置:
  ​IMAGE_NT_HEADERS->IMAGE_OPTIONAL_HEADER->IMAGE_DATA_DIRECTORY[9]
  ​IMAGE_TLS_DIRECTORY里面有AddressOfCallbacks, 指向TLS回调函数VA的数组(可以有多个回调函数)
  • TLS回调函数: 创建或终止某线程时,TLS函数会自动调用执行
  • TLS函数在EP之前执行,因此可以将反调试的代码放在TLS回调函数里面
  • 调试:
    od需要设置为系统断点(默认是EP断点)
    才能进入TLS函数调试

    常见静态反调试技术总结

    常见静态反调试技术总结

4 ETC  ​比较直接的反调试技术
(1) FindWindow() ->检测OllyDbg窗口
(2) CreateToolhelp32Snapshot()检测OllyDbg进程
… …
示例

常见静态反调试技术总结

常见静态反调试技术总结
            
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046
发表于 2021-5-14 11:55:34 来自手机
群主牛逼。 有stdll.h得有有文件吗

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-4-25 01:07 , Processed in 0.153545 second(s), 47 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表