反调试
文章平均质量分 55
sanqiuai
QQ群746836277
展开
-
Detours内联HOOK
1.Detours文件夹中有所需要用到的lib文件和h文件2.将Detours文件夹拖动到工作目录下3.附加包含目录,这样在添加头文件时就不需要填写目录而是直接可以填写头文件名,VS可以根据附加包含目录知道头文件在工作目录的哪个文件夹里4.在工程里面添加一个筛选器Detours5将工作目录下的detours41x86.lib直接拖动到工程中的筛选器里面。ps:(当然也可以不拖到库文件到工程中,因为这样有时候可能会感觉很混乱。在连接器-输出里面的附加依赖项中添加 detours41x86原创 2022-05-10 17:20:40 · 585 阅读 · 0 评论 -
页表HOOK
hook一个内核函数,不修改API对应的物理页,而是把与API相关的物理页拷贝一份(PTE,PDE,PPE,PXE四个页),然后修改目标进程的页表映射到拷贝的物理页,使目标进程对此API的操作与其他进程分离,让对此API的hook不会影响到其他进程结构体enum{ PhyPage, PT, PDT, PPT, PXT,};typedef struct _PAGE_INFO{ UINT64 PteBase;//页表基址 UINT32 PXE原创 2021-10-07 01:28:16 · 1336 阅读 · 3 评论 -
PsSetCreateProcessNotifyRoutineEx 防多开
这个函数的功能是设置一个回调钩子,该钩子会在进程创建和进程销毁时被调用,钩子由用户提供API格式NTSTATUS PsSetCreateProcessNotifyRoutineEx( PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine, BOOLEAN Remove);NotifyRoutine 是IN,传入用户指定的回调钩子Remove 是IN ,创建回调钩子时传FALSE,创建了肯定需要在原创 2021-09-06 20:16:42 · 978 阅读 · 0 评论 -
DbgUiRemoteBreakin反调试
DbgUiRemoteBreakin是ntdll提供的用于在目标进程中创建远线程后下软件断点的函数当我们用OD附加调试时,CreateRemoteThread函数在目标程序中创建了一个远程线程,然后在远程线程中调用DbgUiRemoteBreakin函数,DbgUiRemoteBreakin内部调用了DbgBreakPoint函数,DbgBreakPoint函数内部下了一个int 3断点,触发异常让操作系统运行异常处理程序,然后操作系统把控制权交管给调试器ps:DbgUiIssueRemoteBreak原创 2021-09-02 23:08:22 · 2035 阅读 · 0 评论 -
KdDisableDebugger()反调试
NTSTATUS KdDisableDebugger();剥离内核调试器成功,返回 STATUS_SUCCESS如果并没有内核调试器,返回STATUS_DEBUGGER_INACTIVE如果内核调试器处于阻塞状态返回STATUS_ACCESS_DENIEDKdDisableDebugger函数会判断一个全局变量,当系统不是在调试下启动时,该值为1,在调试下启动时该值被置0,且该值只在操作系统启动时被初始化了一次(推测),当该值为0时,KdDisableDebugger会调用相关函数使内核调试器与操作原创 2021-09-01 18:37:21 · 344 阅读 · 0 评论 -
CheckRemoteDebuggerPresent反调试
# include<Windows.h># include<stdio.h>BOOL CheckDebug(){ BOOL isDebugged; CheckRemoteDebuggerPresent(GetCurrentProcess(), &isDebugged); return isDebugged;}int main(){ while (1) { if (CheckDebug()) { MessageBox(0, L"软件正在被调原创 2021-08-26 12:40:08 · 724 阅读 · 0 评论 -
CreateMutex防多开
#include <windows.h># include<stdio.h>int main(int argc, char* argv[]){ //初始化临界区全局原子变量 HANDLE MutexHandle = CreateMutex(NULL, FALSE, TEXT("AAA")); //创建互斥体. 信号量为0. 有信号的状态.wait可以等待 DWORD ErrorCode = 0; ErrorCode = GetLastError原创 2021-08-26 12:38:58 · 694 阅读 · 0 评论 -
ObRegisterCallbacks的运用
ObRegisterCallbacks()有什么用?继从Windows Vista以后的64位系统都PG(PatchGuard)的存在,所以应用程序不能随意的通过 HOOK SSDT 等方式来修改内核,因为会触发 PatchGuard 保护造成蓝屏。所以现在的64系统的程序通过内核函数ObRegisterCallbacks来实现对自身的保护 。本文不会介绍原理之类的,其内部实现可以使用IDA工具查看其反汇编代码,另外,该函数不能运行在XP环境下,且需要在驱动中调用,应用层的程序是调用不了的,并且,如今的原创 2021-08-05 18:19:47 · 4919 阅读 · 0 评论 -
反调试之IsDebuggerPresent()分析
哪个DLL导出了该函数?查MSDN可知学习一个函数最好的方式是在自己的程序里面调用该函数,并分析自己的程序,我用c写了一个简单的程序,函数不断循环打印“I am running…”,并不断检查是否程序被调试,如果程序被调试,则输出“软件正在被调试”,然后退出如何找到main函数打开OD附加调试...原创 2021-08-04 13:24:25 · 795 阅读 · 0 评论