反调试技术二

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
公网NAT网关,每月750个小时 15CU
简介:

五、使用NtQueryInformationProcess函数

NtQueryInformationProcess函数是一个未公开的API,它的第二个参数可以用来查询进程的调试端口。如果进程被调试,那么返回的端口值会是-1,否则就是其他的值。由于这个函数是一个未公开的函数,因此需要使用LoadLibraryGetProceAddress的方法获取调用地址,示例代码如下:

 

// 声明一个函数指针。

typedef NTSTATUS (WINAPI *NtQueryInformationProcessPtr)(

       HANDLE processHandle,

       PROCESSINFOCLASS processInformationClass,

       PVOID processInformation,

       ULONG processInformationLength,

       PULONG returnLength);

 

bool NtQueryInformationProcessApproach()

{

       int debugPort = 0;

       HMODULE hModule = LoadLibrary(TEXT("Ntdll.dll "));

       NtQueryInformationProcessPtr NtQueryInformationProcess = (NtQueryInformationProcessPtr)GetProcAddress(hModule, "NtQueryInformationProcess");

       if ( NtQueryInformationProcess(GetCurrentProcess(), (PROCESSINFOCLASS)7, &debugPort,sizeof(debugPort), NULL) )

              printf("[ERROR NtQueryInformationProcessApproach] NtQueryInformationProcess failed\n");

       else

              return debugPort == -1;

 

       return false;

}

 

六、NtSetInformationThread方法

这个也是使用Windows的一个未公开函数的方法,你可以在当前线程里调用NtSetInformationThread,调用这个函数时,如果在第二个参数里指定0x11这个值(意思是ThreadHideFromDebugger),等于告诉操作系统,将所有附加的调试器统统取消掉。示例代码:

 

// 声明一个函数指针。

typedef NTSTATUS (*NtSetInformationThreadPtr)(HANDLE threadHandle,

       THREADINFOCLASS threadInformationClass,

       PVOID threadInformation,

       ULONG threadInformationLength);

 

void NtSetInformationThreadApproach()

{

       HMODULE hModule = LoadLibrary(TEXT("ntdll.dll"));

      NtSetInformationThreadPtr NtSetInformationThread = (NtSetInformationThreadPtr)GetProcAddress(hModule, "NtSetInformationThread");

    

       NtSetInformationThread(GetCurrentThread(), (THREADINFOCLASS)0x11, 0, 0);

}

 

七、触发异常的方法

这个技术的原理是,首先,进程使用SetUnhandledExceptionFilter函数注册一个未处理异常处理函数A,如果进程没有被调试的话,那么触发一个未处理异常,会导致操作系统将控制权交给先前注册的函数A;而如果进程被调试的话,那么这个未处理异常会被调试器捕捉,这样我们的函数A就没有机会运行了。

这里有一个技巧,就是触发未处理异常的时候,如果跳转回原来代码继续执行,而不是让操作系统关闭进程。方案是在函数A里修改eip的值,因为在函数A的参数_EXCEPTION_POINTERS里,会保存当时触发异常的指令地址,所以在函数A里根据这个指令地址修改寄存器eip的值就可以了,示例代码如下:

// 进程要注册的未处理异常处理程序A

LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *pei)

{

       SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)

              pei->ContextRecord->Eax);

       // 修改寄存器eip的值

       pei->ContextRecord->Eip += 2;

       // 告诉操作系统,继续执行进程剩余的指令(指令保存在eip里),而不是关闭进程

       return EXCEPTION_CONTINUE_EXECUTION;

}

 

bool UnhandledExceptionFilterApproach()

{

       SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);

       __asm

       {

              // eax清零

              xor eax, eax

              // 触发一个除零异常

              div eax

       }

 

       return false;

}


八、调用DeleteFiber函数

如果给DeleteFiber函数传递一个无效的参数的话,DeleteFiber函数除了会抛出一个异常以外,还是将进程的LastError值设置为具体出错原因的代号。然而,如果进程正在被调试的话,这个LastError值会被修改,因此如果调试器绕过了第七步里讲的反调试技术的话,我们还可以通过验证LastError值是不是被修改过来检测调试器的存在,示例代码:

bool DeleteFiberApproach()

{

       char fib[1024] = {0};

       // 会抛出一个异常并被调试器捕获

       DeleteFiber(fib);

 

       // 0x57的意思是ERROR_INVALID_PARAMETER

       return (GetLastError() != 0x57);

}

 


本文转自 donjuan 博客园博客,原文链接:http://www.cnblogs.com/killmyday/archive/2011/05/31/2064171.html   ,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
高可用应用架构
欢迎来到“高可用应用架构”课程,本课程是“弹性计算Clouder系列认证“中的阶段四课程。本课程重点向您阐述了云服务器ECS的高可用部署方案,包含了弹性公网IP和负载均衡的概念及操作,通过本课程的学习您将了解在平时工作中,如何利用负载均衡和多台云服务器组建高可用应用架构,并通过弹性公网IP的方式对外提供稳定的互联网接入,使得您的网站更加稳定的同时可以接受更多人访问,掌握在阿里云上构建企业级大流量网站场景的方法。 学习完本课程后,您将能够: 理解高可用架构的含义并掌握基本实现方法 理解弹性公网IP的概念、功能以及应用场景 理解负载均衡的概念、功能以及应用场景 掌握网站高并发时如何处理的基本思路 完成多台Web服务器的负载均衡,从而实现高可用、高并发流量架构
相关文章
|
6月前
|
移动开发 安全 数据安全/隐私保护
iOS代码混淆和加固技术详解
iOS代码混淆和加固技术详解
84 0
|
6月前
|
安全 Java 数据安全/隐私保护
代码混淆技术探究与工具选择
代码混淆技术探究与工具选择
67 0
|
6月前
|
缓存 安全 Java
提高APP安全性的必备加固手段——深度解析代码混淆技术
提高APP安全性的必备加固手段——深度解析代码混淆技术
81 1
|
6月前
|
安全 Java Android开发
iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用
iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用
68 0
|
监控 安全 网络安全
Shellcode免杀技术的探索与应对策略
Shellcode免杀技术的探索与应对策略
206 0
|
监控 安全 Cloud Native
分享!一文简析RASP技术
RASP是一种内置或链接到应用程序环境中的安全技术,与应用程序融为一体,实时监测、阻断攻击,使程序自身拥有自我保护的能力。该技术在2014年Gartner的应用安全报告里被列为应用安全领域的关键趋势。
732 0
分享!一文简析RASP技术
|
安全 API 开发工具
恶意代码分析系列-几种常用技术(1)
恶意代码分析系列-几种常用技术(1)
|
安全 API Windows
恶意代码分析系列-几种常用技术(2)
恶意代码分析系列-几种常用技术(2)
|
安全 API 数据库
恶意代码分析系列-几种常用技术(3)
恶意代码分析系列-几种常用技术(3)
|
安全 算法 编译器
逆向分析 工具、加壳、安全防护篇
作者主页:https://www.couragesteak.com/
逆向分析 工具、加壳、安全防护篇