05月07, 2018

windows anti-debugging

WIndows操作系统中提供一些API,应用程序可以通过调用这些API,来探测自己是否正在被调试。 1)反调试最简单的方法是在恶意代码运行期间修改恶意代码,使其不能调用掉时期的API函数,或者修改这些API函数的返回值,确保恶意代码执行合适的路径。 2)比较复杂的方法是hook这些函数,例如使用rootkit技术。

IsDebuggerPresent 探测调试器是否存在,查询进程环境块PEB中的IsDebugged标志,进程没有运行在调试器环境中,函数返回0,调试附加了进程,函数返回一个非零值。

CheckRemoteDebuggerPresent NtQueryInformationProcess OutputDebugString 在调试器中显示一个字符串,同时,可以用来检测调试器的存在。 使用SetLashError函数,将当前的错误码设置为一个任意值,如果进程没有呗调试器附加,调用OutputDebugString函数,因为这个函数失败,重新设置了错误码,因此GetLastError获取的错误码应该不是我们设置的任意值。 如果进程被附加并调用OutputDebugString函数,那么调用这个函数会成功,这时GetLastError获取的错误代码不变。

进程运行时,位置fs:[30h]指向FEB的基地址,为了实现反调试技术,恶意代码通过这个位置检查BeingDebugged标志,这个标志标识进程是否正在被调试。

本文链接:https://harry.ren/post/anti-debugging.html

-- EOF --

Comments