
Windows
文章平均质量分 94
liuhaidon1992
此博客主要用于记录自己业余时间学习的内容,方便复习,查看
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
自己实现GetProcAddress
DWORD MyGetProcAddress( HMODULE hModule, // handle to DLL module LPCSTR lpProcName // function name ) { int i=0; PIMAGE_DOS_HEADER pImageDosHeader = NULL; PIMAGE_NT_HEADERS pImageNtHeader = NULL; PIMAGE_E..原创 2020-06-12 16:01:45 · 987 阅读 · 0 评论 -
检测隐藏进程
1. 用 户 态 进 程 检 测 方 法该 方 法 利 用 WindowsAPI检测进程。但是在实际应用中,该方法几乎无法检测到 Rootkit隐藏进程。用户态可以通过CreateToolhelp32Snapshot,Process32First,Process32Next遍历进程。或者通过通过psapi.dll提供的EnumProcesses来枚举进程。也可以使用Native API 中...原创 2020-01-17 14:24:49 · 2879 阅读 · 0 评论 -
x86对抗栈回溯检测
1.原理函数调用 CALL 指令可拆分为两步操作:1)、将调用者的下一条指令(EIP)的地址压栈2)、跳转至将要调用的函数地址中(相对偏移或绝对地址)那么在执行到子函数首地址位置时,返回地址(即调用函数中调用位置下一条指令的地址)就已经存在于堆栈中了,并且是 ESP 指向地址的值。下面通过栈帧的概念,了解编译器在接下来对堆栈进行的操作。简言之,栈帧就是利用 EBP(栈帧指针,请注意不是 ...原创 2020-01-10 16:19:46 · 1072 阅读 · 0 评论 -
驱动黑名单实现
一、 基本思想(1)检测某些名称的驱动是否存在,这一部分有个黑名单(2)检测驱动中部分代码的特征是否匹配,这一部分用另外一个黑名单每一个驱动都要经过以上两重检查,具体的算法实现就是计算驱动名称或部分代码的Hash值,然后在黑名单中进行匹配。所以,你看不到任何敏感的字符串。具体的Hash算法就是变形的CRC32,如下:ULONG GetStringCRCHash(BYTE *Str, ...原创 2020-01-09 09:49:38 · 697 阅读 · 0 评论 -
枚举和移除进程和线程回调
进程回调可以监视进程的创建和退出,这个在前面的章节已经讲过了。 某些游戏保护的驱动喜欢用这个函数来监视有没有黑名单中的程序运行,如果运行则阻止运行或者把游戏退出。而线程回调则通常用来监控远程线程的建立,如果发现有远程线程注入到了游戏进程里,则马上把游戏退出。我们注册的进程回调,会存储在一个名为 PspCreateProcessNotifyRoutine 的数组里。PspCreatePr...原创 2020-01-08 17:12:25 · 823 阅读 · 1 评论 -
枚举和移除对象回调
对象回调是目前绝大多数游戏保护用于保护游戏进程用的回调。对象回调存储在对应对象结构体里, 简单来说,就是存储在 ObjectType. CallbackList 这个双向链表里。1: kd> dt _object_typent!_OBJECT_TYPE+0x000 TypeList : _LIST_ENTRY+0x010 Name : _U...原创 2020-01-08 17:10:56 · 787 阅读 · 0 评论 -
用MDL写入数据
#include <ntddk.h>BOOL MdlWriteMemory(PVOID pBaseAddress, PVOID pWriteData, SIZE_T writeDataSize){ PMDL pMdl = NULL; PVOID pNewAddress = NULL; // 创建mdl pMdl = MmCreateMdl(NULL, pBaseAdd...原创 2020-01-08 17:08:53 · 686 阅读 · 0 评论 -
用cr3读写内存
#define DIRECTORY_TABLE_BASE 0x028 // DirectoryTableBase UINT32 idTarget = 0;PEPROCESS epTarget = NULL;UINT32 idGame = 0;PEPROCESS epGame = NULL;UINT32 rw_len = 0;UINT64 base_addr = 0;...原创 2020-01-08 17:04:16 · 2306 阅读 · 0 评论 -
插入APC读写内存
#include "ntddk.h"#include "a_header.h"NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);NTKERNELAPI VOID NTAPI KeStackAttachProcess(PEPROCESS Process, PKAPC_...原创 2020-01-08 17:03:20 · 857 阅读 · 0 评论 -
遍历vad二叉树来遍历进程里的模块
/* 遍历vad二叉树来遍历进程里的模块*/#include <ntifs.h>typedef struct _MMADDRESS_NODE{ ULONG64 u1; struct _MMADDRESS_NODE* LeftChild; struct _MMADDRESS_NODE* RightChild; ULONG64 StartingVpn; ULONG...原创 2020-01-08 16:53:57 · 1196 阅读 · 1 评论 -
通过PspCidTable枚举进程
如果当前进程为System进程,就意味着此次打开的内核对象访问权限属于内核,那么就使用内核句柄表, 内核句柄与用户句柄不同的地方就在于内核句柄需要或上一个0x80000000即最高位置为1作为标识,但是实际在使用句柄的时候还是不需要这个最高位值的。进程的句柄表由EPROCESS中的ObjectTable成员进行管理, 句柄表有3种内存结构分别为一级表,二级表以及三级表。表的结构由进程中的句...原创 2020-01-08 16:51:34 · 356 阅读 · 0 评论 -
枚举和隐藏内核模块
在 WIN64 上枚举内核模块有两种方法:使用 ZwQuerySystemInformation 的第 11 号功能(SystemModuleInformation)和枚举 KLDR_DATA_TABLE_ENTRY 中的 InLoadOrderLinks 双向链表;隐藏内核模块的通用方法是把指定的驱动对象从 KLDR_DATA_TABLE_ENTRY中的 InLoadOrderLinks 双向...原创 2020-01-08 16:47:12 · 1209 阅读 · 0 评论 -
内核反调试
1.钩子对调试器附加过程中所用到的函数挂钩。比如:NtOpenProcess、ZwDebugActiveProcess、RtlCreateUserThread、NtDebugContinue、NtCreateDebugObject、NtWaitForDebugEvent调试事件采集函数:DbgkCreateThread、DbgkExitThread、DbgkExitProcess...原创 2020-01-08 14:46:44 · 1500 阅读 · 0 评论 -
r3反调试
R3反调试方法非常多,且充斥着各种猥琐的方法。1.调用API反调试IsDebuggerPresent:它查询PEB中的IsDebugged标志CheckRemoteDebuggerPresent:这个函数将一个进程句柄作为参数,检查这个句柄对应的进程是否被调试器附加NtQueryInfomationProcess:它用来提取一个给定进程的信息。第一个参数是进程的句柄,第二个参数告诉我们它...原创 2020-01-08 11:51:55 · 2326 阅读 · 0 评论 -
8种HOOK技术
1.IAT_HOOKIAT是程序中存储导入函数地址的数据结构,如果HOOK了导入函数地址。就可以在函数调用的时候,将函数流程HOOK到我们指定的流程。但是我个人觉得这种方式最好要结合DLL注入的方式,如果单纯的使用HOOK,那么就需要将需要执行的操作的shellcode写入目标进程,如果操作复杂,可能需要的shellcode量特别大,所以我们需要借助DLL注入,这样就将我们需要执行的代码写入...原创 2020-01-07 15:08:45 · 5694 阅读 · 0 评论 -
x64内核hook
x64中系统提供了api帮助我们进行hook,主要是如下三个函数PsSetCreateProcessNotifyRoutineEx,这个函数的作用就是当进程创建的时候会通知你.,PsSetCreateThreadNotifyRoutine,这个函数的作用是 当线程创建的时候会通知你。PsSetLoadImageNotifyRoutine,这个函数的作用是 当模块加载的时候会通知你。...原创 2020-01-07 10:32:16 · 1683 阅读 · 0 评论 -
14种DLL注入技术
本文只是介绍各个注入的核心思想,详细的可以参照文末链接里的源码,一看就明白。本文只是介绍各个注入的核心思想,详细的可以参照文末链接里的源码,一看就明白。本文只是介绍各个注入的核心思想,详细的可以参照文末链接里的源码,一看就明白。第一种 CreateRemoteThread远程线程调用DLL注入是指向某一个特定的进程空间强制插入一个特定的DLL文件映像,值得注意的是这种插入是强制性的插...原创 2020-01-03 10:51:54 · 5372 阅读 · 1 评论 -
DLL劫持原理
系统有一套标准的搜索DLL路径的规则,这套规则又分为两种搜索模式,安全搜索模式,非安全搜索模式。默认情况下启用安全DLL搜索模式。要禁用此功能,需创建HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode注册表值并将其设置为0。如果启用了SafeDllSearchMod...原创 2020-01-03 10:27:05 · 2080 阅读 · 2 评论