Windows 下常见反调试方法.docxVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
仁人教育 仁人教育 Windows 下常见的反调试方法 稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度。 ? ①最简单也是最基础的,Windows提供的API接口:IsDebuggerPresent(),这API实际上就是访问PEB的BeingDebugged标志来判断是否处于调试状态。 if (IsDebuggerPresent()) //API接口 { AfxMessageBox(L检测到调试器); } else { AfxMessageBox(L没有检测到调试器); } ②自己用汇编实现实现IsDebuggerPresent,如何获得PEB呢?在应用层,fs寄存器是指向当前线程的TEB结构的,而在内核层,fs寄存器指向PCR(Processor Control Region)的内存,其数据类型是KPCR。所以可以通过当前线程的TEB获得PEB,再取出BeingDebugged的值。 mov eax, fs:18h // TEB Self指针 mov eax, [eax+30h] // PEB movzx eax, [eax+2] // PEB-BeingDebugged _asm { push eax; //TEB mov eax, fs:[0x30]; // PEB movzx eax, byte ptr[eax + 2]; //BeingDebugged mov dword ptr[Value], eax; //取值 pop eax; } if (Value) //判断 { AfxMessageBox(L检测到调试器); } else { AfxMessageBox(L没有检测到调试器); } 讲个题外话,也是关于FS寄存器的前两天有人是问了我一个问题,说是怎么让dll只被特定的进程加载,了解fs寄存器之后就很简单了,在dll加载的DllMain()函数中对加载的当前进程进行判断,看是否是自己的目标进程,如果不是,就拒绝被加载。下面是一段测试代码,可以获得当前进程的进程名。 #include windows.h //这段测试代码可以获得当前进程名 #include stdio.h int main(void) { LPSTR name; __asm{ mov eax,fs:[0x18] //得到Teb 当线程运行于用户空间时段寄存器FS指向当前线程的TEB,FS:[0x18] 就是指在 //Self,其内容就是TEB的起点 mov eax,[eax+0x30] //Teb偏移0x30处指向Peb mov eax,[eax+0xc] //Peb偏移 0xc 处指向 进程加载的模块的信息 _PEB_LDR_DATA结构 mov eax,[eax+0xc] mov eax,[eax+0x30] mov name,eax } wprintf(L%s\n,name); return 0; } ③NtGlobalFlag 也是类似于BeingDebugged的一个标志,在Peb中取出。如果是调试状态下, NtGlobalFlag的值会是0x70,正常情况下不是。之前是利用fs寄存器获得的Peb基地址,这里使用Native API 的方法。 HANDLE hProcess = NULL; DWORD ProcessId = 0; PROCESS_BASIC_INFORMATION Pbi; PFNZwQueryInformationProcess pfunc_ZwQueryInformationProcess = NULL; ProcessId = GetCurrentProcessId(); hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, ProcessId ); if (hProcess != NULL) { HMODULE hModule = LoadLibrary(Lntdll.dll); pfunc_ZwQueryInformationProcess = (PFNZwQueryInformationProcess)GetProcAddress(hModule, ZwQueryInformationPro

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档