反调试技术揭秘(转)

 

 

在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编之类的方法破解自己。为了了解如何破解反调试技术,首先我们来看看反调试技术。

 

 

 

一、Windows API 方法

 

Win32 提供了两个 API, IsDebuggerPresent 和 CheckRemoteDebuggerPresent 可以用来检测当前进程是否正在被调试,以IsDebuggerPresent 函数为例,例子如下:

BOOL ret = IsDebuggerPresent();printf("ret = %d\n", ret);

破解方法很简单,就是在系统里将这两个函数 hook 掉,让这两个函数一直返回 false 就可以了,网上有很多做 hook API 工作的工具,也有很多工具源代码是开放的,所以这里就不细谈了。

 

 

 

二、查询进程 PEB 的 BeingDebugged 标志位

 

当进程被调试器所附加的时候,操作系统会自动设置这个标志位,因此在程序里定期查询这个标志位就可以了,例子如下:

bool PebIsDebuggedApproach()
{char result = 0;__asm{// 进程的PEB地址放在fs这个寄存器位置上mov eax, fs:[30h]// 查询BeingDebugged标志位mov al, BYTE PTR [eax + 2] mov result, al}return result != 0;
}

 

 

 

三、查询进程 PEB 的 NtGlobal 标志位 

 

跟第二个方法一样,当进程被调试的时候,操作系统除了修改 BeingDebugged 这个标志位以外,还会修改其他几个地方,其中NtDll 中一些控制堆(Heap)操作的函数的标志位就会被修改,因此也可以查询这个标志位,例子如下:

bool PebNtGlobalFlagsApproach()
{int result = 0;__asm{// 进程的PEBmov eax, fs:[30h]// 控制堆操作函数的工作方式的标志位mov eax, [eax + 68h]// 操作系统会加上这些标志位FLG_HEAP_ENABLE_TAIL_CHECK, // FLG_HEAP_ENABLE_FREE_CHECK and FLG_HEAP_VALIDATE_PARAMETERS,// 它们的并集就是x70//// 下面的代码相当于C/C++的// eax = eax & 0x70and eax, 0x70mov result, eax}return result != 0;}


 

 

四、查询 进程堆 的一些 标志位

 

这个方法是第三个方法的变种,只要进程被调试,进程在堆上分配的内存,在分配的堆的头信息里,ForceFlags 这个标志位会被修改,因此可以通过判断这个标志位的方式来反调试。因为进程可以有很多的堆,因此只要检查任意一个堆的头信息就可以了,所以这个方法貌似很强大,例子如下:

bool HeapFlagsApproach()
{int result = 0;__asm{// 进程的PEBmov eax, fs:[30h]// 进程的堆,我们随便访问了一个堆,下面是默认的堆mov eax, [eax + 18h]// 检查ForceFlag标志位,在没有被调试的情况下应该是mov eax, [eax + 10h]mov result, eax}return result != 0;
}

 

 

 

五、使用 NtQueryInformationProcess 函数

 

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

// 声明一个函数指针。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");elsereturn 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_PARAMETERreturn (GetLastError() != 0x57);
}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全文解析:面向基于区块链的「机器人经济学」概念中,如何验证自主智能体的行为?...

原文来源:arXiv作者:Konstantin Danilov、Ruslan Rezin、Alexander Kolotov、 Ilya Afanasyev「雷克世界」编译:嗯~是阿童木呀、KABUDA、EVA随着AI技术的发展,自主智能体在速度和精确度方面有了很大的提升,变得更加智能…

Ajax--让网站与时俱进

一。加载数据1.追加Html$(#dictionary).load(a.html);2.操作JavaScript$.getJSON(b.json,function(){});3.加载XML文档$.get(d.xml,function(data){});二。选择数据格式:Html:不需要与其它程序共享数据的情况下,以HTML片段提供外部数据。JSON:数据可重用…

小甲鱼 OllyDbg 教程系列 (十七) : 反调试

小甲鱼 OD 教程:https://www.bilibili.com/video/av6889190?p27 ReverseMe.A.B.C.D 下载地址:https://pan.baidu.com/s/1_aVUa6aDATSpE6bQgc6hLA 提取码:ebo2 [调试篇] 调试篇 - 第二十二讲 - OD使用教程22(视频课件试验程序…

一张图看懂微软人工智能

来源:微软科技摘要:对于微软人工智能,你了解多少?是Cortana?是小冰?还是机器翻译?看完下面这张信息图,你会发现你所了解的,很可能只是冰山一角。看完你是否想要立刻参加微…

php中isset() , unnset(), empty()函数

isset()函数 , unnset()函数, empty() 函数是一个语言结构而非函数,因此它无法被变量函数调用。 isset()、empty() 只检测变量,检测任何非变量的东西都将导致解析错误。 后边的语句是错误而且将不会起作用: empty(addslashes($name))。 若想检…

mov 和 lea 的区别有哪些?

From:https://www.zhihu.com/question/40720890?sortcreated 汇编中 mov 和 lea 的区别是什么 ?:https://bbs.csdn.net/topics/320046644 lea 是“load effective address”的缩写, 简单的说, lea指令可以用来将一个…

Guava入门~EventBus~Event Publishing示例

Event Publishing示例 public class SimpleTradeExecutor {private EventBus eventBus;public SimpleTradeExecutor(EventBus eventBus) {this.eventBus eventBus;}public void executeTrade(TradeAccount tradeAccount, double amount, TradeType tradeType){TradeAccountEv…

刘强东宣布: 未来京东将减员50%,每天工作3小时!无人公司来了……

来源:全球人工智能摘要:在这个时代,你的工作会背叛你,你的行业会背叛你,你的专业会背叛你,唯一不能背叛你的,是你的认知和你的能力!京东目前员工的总数是16万,那么庞大的…

Pycharm 快捷键 整理

From:http://www.cnblogs.com/themost/p/6900370.html Pycharm 版本控制之本地 Git 用法:https://blog.csdn.net/u013088062/article/details/50350520PyCharm 中文指南(Win版):https://pycharm.iswbm.com/ github:https://github…

区块链的技术简史与未来前景,从互联网进化角度分析

作者:刘锋 互联网进化论作者摘要:区块链是当前科技领域最令人关注的技术之一,如何理解这个新技术,本文从互联网的技术生态、区块链的诞生、比特币的发展,互联网大脑模型的形成多个维度,对区块链技术的优劣和…

Guava入门~EventBus~细粒度订阅

将交易细分为买/卖: public class SellEvent extends TradeAccountEvent {public SellEvent(TradeAccount tradeAccount, double amount, Date tradExecutionTime) {super(tradeAccount, amount, tradExecutionTime, TradeType.SELL);} }public class BuyEvent ext…

转:Python中的文件和目录操作

转自:http://tech.it168.com/a2009/0703/600/000000600339.shtml 【IT168 技术文档】摘要:对于文件和目录的处理,虽然可以通过操作系统命令来完成,但是Python语言为了便于开发人员以编程的方式处理相关工作,提供了许多处理文件和目…

ELK 日志系统

Elastic 官方文档:https://www.elastic.co/guide/index.html elasticsearch github:https://github.com/elastic/elasticsearch logstash github:https://github.com/elastic/logstash kibana github:https://github.com/elastic…

深入浅出:Microsoft分布式事务处理协调器

深入浅出:Microsoft分布式事务处理协调器 http://www.searchdatabase.com.cn/showcontent_44713.htmposted on 2011-03-19 16:19 Fanr_Zh 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/Amaranthus/archive/2011/03/19/1988870.html

洪小文: 今天的AI只是一个黑盒,仍需与HI密切配合

来源:微软研究院AI头条摘要:在刚刚结束的微软Build 2018开发者大会上,微软小娜展示了自己是如何智能地预定会议室的,似与常人无异,但实际上人工智能还远不像你想的那么聪明!微软亚洲研究院院长洪小文在接受…

Kibana Guide ( Kibana 向导 )

Kibana Guide 官网地址:https://www.elastic.co/guide/en/kibana/current/index.html Kibana 用户指南(构建你自己的仪表盘):https://segmentfault.com/a/1190000015140923 Kibana快速上手:https://www.jianshu.com/…

Guava入门~EventBus~AsyncEventBus

AsyncEventBus 示例 package bbejeck.guava.chapter7.async;import bbejeck.guava.chapter7.EventBusTestBase; import bbejeck.guava.chapter7.subscriber.SlowProcessSubscriber; import com.google.common.eventbus.AsyncEventBus; import org.junit.Before; import org.ju…

iisapp 查看PID所对应的IIS应用程序池及详细介绍

从IIS6.0可以在IIS中架设多个站点并给每个站点指定不同的应用程序池,分别对各程序池进行CPU,内存的使用限制。而每一个应用程序池会在任务管理器中对应一个系统进程(w3wp.exe),每一个进程都有一个PID来标识。当某个w3wp.exe进程占用资源很高的时候如何快…

Python 操作 Elasticsearch 实现 增 删 改 查

Github 地址:https://github.com/elastic/elasticsearch-py/blob/master/docs/index.rst 官网地址:https://elasticsearch-py.readthedocs.io/en/latest/index.html Python-ElasticSearch,python对ES进行写入、更新、删除、搜索&#xff1a…

周鸿祎:quot;安全大脑quot;将成智能经济时代的网络安全中枢

来源:中国经济网摘要:“安全大脑”是一个分布式智能系统,综合利用ABCI(大数据、人工智能、云计算、IoT智能感知、区块链)等新技术,保护国家、国防、关键基础设施、社会及个人的网络安全。5月16日,第二届世界智能大会在天津召开,360集团董事长兼CEO周鸿祎…