驱动
Mikasys
这个作者很懒,什么都没留下…
展开
-
驱动开发 借壳通信
Ring3#include <stdio.h>#include <windows.h>#define LINK_NAME L"\\\\.\\ndis"//控制码起始地址#define IRP_IOCTRL_BASE 0x8000//控制码宏定义#define IRP_IOCTRL_CODE(i) CTL_CODE(FILE_DEVICE_UNKNOWN,IRP_IOCTRL_BASE + i,METHOD_BUFFERED,FILE_ALL_ACCESS)//控原创 2021-10-20 13:44:19 · 256 阅读 · 0 评论 -
驱动开发1
64位新增PG 如果修改SSDT GDT ntosk,直接蓝,而且检查是随机的。DES 强制签名内存操作#include <ntifs.h>//wdm.h//ntifs.hVOID DriverUnload(PDRIVER_OBJECT pDriver){ UNREFERENCED_PARAMETER(pDriver); DbgPrint("卸载成功!\n");}NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver,原创 2021-10-20 13:43:30 · 219 阅读 · 0 评论 -
用户句柄表的遍历
私有句柄表_HANDLE_TABLE_ENTRY的Object直接指向_OBJECT_HEADER不用减#include <ntifs.h>//一个页最大容纳的_HANDLE_TABLE_ENTRY#define MAX_ENTRY_COUNT (0x1000/sizeof(HANDLE_TABLE_ENTRY)) //未公开未文档化typedef PVOID(NTAPI *OBGETOBJECTTYPE)(IN PVOID pObject);EXTERN_C NTKERNE原创 2021-10-20 13:42:27 · 595 阅读 · 0 评论 -
EPROCESS 遍历进程 隐藏 保护
0: kd> dt _KPROCESSnt!_KPROCESS +0x000 Header : _DISPATCHER_HEADER //dt _KEVENT +0x018 ProfileListHead : _LIST_ENTRY //任务管理器上的性能 +0x028 DirectoryTableBase : Uint8B //cr3 +0x030 ThreadListHead : _LIST_ENTRY //当前进程所有线程原创 2021-10-20 13:40:47 · 854 阅读 · 0 评论 -
驱动的遍历和隐藏
DRIVER_OBJECT0: kd> dt _DRIVER_OBJECTnt!_DRIVER_OBJECT +0x000 Type : Int2B +0x002 Size : Int2B +0x008 DeviceObject : Ptr64 _DEVICE_OBJECT +0x010 Flags : Uint4B +0x018 DriverStart : Ptr64 Void原创 2021-10-20 13:39:57 · 303 阅读 · 0 评论 -
C++ 底层分析 3.权限控制 Class
1.将定义与实现分开将定义与实现分离,代码会有更好的可读性,但不是必须的xxx.h 只是一个文件,可以是任何的后缀名,如果你愿意,可以叫xxx.exe#include 的作用只是把里面的内容复制过来 仅此而已.如:#include "abc.exexxx.h 与 xxx.cpp并不要求一定同名2.public private的使用public:这个成员哪里都可以用,不用担心被修改,所以,一旦发布成public的成员,是不能够改名字的.private:这个成员只用于内部使用,不要在其他的地原创 2021-04-27 21:43:07 · 241 阅读 · 0 评论 -
4.Inline Hook模板
#include "stdafx.h"#include "DebugTool.h"DWORD g_dwHookAddr; //Hook开始的地方DWORD g_dwRetAddr; //Hook结束的地方DWORD g_dwLength; //Hook字节数PBYTE g_pCodePatch; //存储Hook原来的硬编码DWORD g_dwHookFlag; //HOOK状态, 1 Hook成功, 0 HOOK 失败typedef struct _REGISTER{ DWORD转载 2020-11-14 11:42:13 · 209 阅读 · 0 评论 -
3.KPCR,等待链表,调度链表
一、内容回顾内容回顾进程在内核中对应结构体:EPROCESS线程在内核中对应结构体:ETHREADCPU在内核中也有一个对应的结构体:KPCR二、KPCR结构kd> dt _KPCRnt!_KPCR +0x000 NtTib : _NT_TIB +0x01c SelfPcr : Ptr32 _KPCR +0x020 Prcb : Ptr32 _KPRCB +0x024 Irql原创 2020-11-11 10:44:37 · 275 阅读 · 0 评论 -
2. ETHREAD和线程断链
一、ETHREAD结构体ntdll!_ETHREAD +0x000 Tcb : _KTHREAD +0x1c0 CreateTime : _LARGE_INTEGER +0x1c0 NestedFaultCount : Pos 0, 2 Bits +0x1c0 ApcNeeded : Pos 2, 1 Bit +0x1c8 ExitTime : _LARGE_INTEGER +0x1c8 LpcRepl原创 2020-11-07 14:36:17 · 1144 阅读 · 0 评论 -
进程线程 1.EPROCESS和进程隐藏
一、EPROCESS结构体EPROCESS结构kd> dt _EPROCESSntdll!_EPROCESS +0x000 Pcb : _KPROCESS +0x06c ProcessLock : _EX_PUSH_LOCK +0x070 CreateTime : _LARGE_INTEGER +0x078 ExitTime : _LARGE_INTEGER +0x080 RundownProtect原创 2020-11-05 22:36:33 · 1400 阅读 · 0 评论 -
8.FindWindow(SSDT Shadow HOOK)
待更。。原创 2020-11-05 21:23:50 · 913 阅读 · 0 评论 -
番外:win32k.sys什么情况下会挂上PTE
一、前因在HOOK SSDT Shadow的时候老师说,必须要调用一个界面函数使自己成为GUI进程(线程),才会给这个进程挂上PTE,我对此表示怀疑,于是有了以下探讨二、探究1、首先来看一下system进程查询所有进程kd> !process 0 0**** NT ACTIVE PROCESS DUMP ****PROCESS 867b5830 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000 DirBas原创 2020-11-08 17:53:52 · 293 阅读 · 0 评论 -
7.HOOK NtTerminateProcess驱动保护进程
1、项目说明将系统服务表中某个函数改成自己的函数,使任务管理器右键无法关闭自己,只有点击自己的关闭按钮才可以正常关闭。2、获取目标进程的进程名kd> dt _Eprocessntdll!_EPROCESS +0x000 Pcb : _KPROCESS +0x06c ProcessLock : _EX_PUSH_LOCK +0x070 CreateTime : _LARGE_INTEGER +0x078 ExitTime原创 2020-11-04 23:33:33 · 1508 阅读 · 3 评论 -
6.SSDT HOOK NtOpenProcess进程保护
代码如下#include <Ntifs.h>//存储原来的函数地址ULONG uOldNtOpenProcess;//调用号ULONG FuctionID = 0x7A;//要保护进程的PIDULONG PID = 1020;typedef NTSTATUS (*NTOPENPROCESS)( PHANDLE ProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes,原创 2020-11-04 21:46:20 · 760 阅读 · 0 评论 -
5.SSDT再增加一个NtReadVirtualMemory函数
代码如下,如果看不懂请看上一篇文章Ring0#include <ntifs.h>#include <ntstatus.h>typedef struct _KSYSTEM_SERVICE_TABLE{ PULONG ServiceTableBase; //函数地址表基地址 PULONG ServiceCounterTableBase; //被访问了多少次 ULONG NumberOfService; //表中服务函数的总数 PUCHAR ParamTable原创 2020-11-04 20:08:08 · 468 阅读 · 1 评论 -
4.逆向分析CloseHandle进Ring0完整过程
一、 内容回顾在上一节课中,我们讲到进0环后,3环的各种寄存器都会保留到_Trap_Frame结构体中,这节课我们来讲解:如何根据系统服务号(eax中存储)找到要执行的内核函数?2种调用方式是如何返回到3环的?二、SystemServiceTable 系统服务表typedef struct _SERVICE_DESCRIPTOR_TABLE { PULONG ServiceTableBase;//SSDT的起始地址 PULONG ServiceCounterTableBase;//被访问了原创 2020-11-04 17:15:43 · 340 阅读 · 0 评论 -
3.逆向分析KiSystemService(填充 _KTRAP_FRAME 部分)
一、回顾想要分析透彻,必须得了解之前的那些结构体(_KUSER_SHARED_DATA、_Trap_Frame、_KPCR、 _KTHREAD)没看的同学先看一下之前的文章逆向分析ReadProcessMemory---->KiFastCallEntry二、分析KiSystemService由于上一篇分析KiFastCallEntry文章的难度更大,分析_KiSystemService的难度小一些,所以前面步骤省略,直接开始分析KiSystemService.text:00466481 _KiSy原创 2020-11-04 11:09:32 · 436 阅读 · 0 评论 -
2.逆向分析KiFastCallEntry(填充 _KTRAP_FRAME 部分)
每个线程KTRAP_FRAME 一个ESP0TSS一个核一个如果只有一个核,那么TSS存的ESP0永远是正在运行的线程的堆栈原创 2020-11-04 10:28:21 · 805 阅读 · 0 评论 -
系统调用 1.API函数的调用过程(3环进0环)
1.API函数的调用过程(3环进0环)一、Windows APIApplication Programming Interface,简称 API 函数。Windows有多少个API?主要是存放在 C:\WINDOWS\system32 下面所有的dll几个重要的DLLKernel32.dll:最核心的功能模块,比如管理内存、进程和线程相关的函数等.User32.dll:是Windows用户界面相关应用程序接口,如创建窗口和发送消息等.GDI32.dll:全称是Graphical原创 2020-11-02 20:24:07 · 910 阅读 · 0 评论 -
番外:IDA的使用
IDA的使用一、打开关闭文件加载符号链接关闭文件(不打包数据库文件)所有文件分着放打包文件(打包数据库文件)四个文件合成一个文件idb收集垃圾,使文件变小解决错误操作唯一的办法(不保留本次的所有操作)二、窗口Ctrl + 鼠标滚轮 使界面变大变小按空格切换到文本界面查看不同窗口显示硬编码ACDUA:字符串C:代码形式D:数据形式U:不定义,以原始字节的形式显示G:跳转指令Alt+F:搜索N:改名新增结构体成员 按DAlt+q 选择类型为结构体原创 2020-11-01 15:09:15 · 271 阅读 · 0 评论 -
10. 内存缺页处理
0x10. 内存缺页处理原创 2020-11-01 14:26:24 · 405 阅读 · 0 评论 -
9.写拷贝
0x9 写拷贝(WriteCopy)一、什么是写拷贝?HOOK了这个Dll某个函数,其他进程受影响吗?答:不受影响!因为有写拷贝!写拷贝由操作系统执行二、低2G的VAD二叉树(记录了哪些线性地址被占用或被占用)使用命令查看vad的地址level //二叉树的级别start //因为单位为4KB,再加3个0即为真正线性地址commit //若为Private(VirtualAlloc申请)为私有,自己独享 READWRITE //可读可写 READONLY //只读原创 2020-10-31 12:57:13 · 882 阅读 · 2 评论 -
8.程序手动实现加载、运行、停止、卸载驱动
0x7.程序实现(ring3)加载、运行、停止、卸载驱动一、手动加载驱动步骤用GetFullPathNameA获取驱动的完整路径用OpenSCManager打开服务控制管理器用CreateServiceA创建服务如果服务创建已存在,直接用OpenServiceA打开服务,否则用StartServiceA开启服务二、卸载用OpenSCManager打开服务控制管理器用OpenServiceA打开服务用ControlService停止驱动服务三、代码实现主要功能:用户输入PID,r原创 2020-10-30 16:14:27 · 1138 阅读 · 2 评论 -
7.ShellCode相关实现
0x7 ShellCode实现一、什么是shellcode?不依赖环境,放到任何地方都可以执行的机器码(硬编码)。二、编写原创 2020-10-28 20:11:37 · 347 阅读 · 0 评论 -
6.ring0与ring3通信
0x6 ring0与ring0通信(常规方式)1、设备对象我们在开发窗口程序的时候,消息被封装成一个结构体:MSG,在内核开发时,消息被封装成另外一个结构体:IRP(I/O Request Package)。在窗口程序中,能够接收消息的只能是窗口对象。在内核中,能够接收IRP消息的只能是设备对象。2、交互数据的方式3、创建符号链接//创建符号链接名称RtlInitUnicodeString(&SymbolicLinkName,L"\\??\\MyTestDriver");//创原创 2020-10-27 23:17:18 · 535 阅读 · 0 评论 -
5.内核空间与内核模块
0x5内核空间与内核模块1.内核空间对于低2G,每个进程是独立的,而高2G是共享的如果在一个驱动中定义一个变量,然后能够在另一个驱动中进行读取,那就说明高2G确实是所有程序共用的!#include <ntddk.h>//卸载函数VOID DriverUnload(PDRIVER_OBJECT driver){ DbgPrint("驱动程序停止运行了.\r\n");}ULONG x = 0x12345678;//入口函数,相当于mainNTSTATUS Driver原创 2020-10-25 15:47:30 · 387 阅读 · 0 评论 -
4.PEB断链隐藏模块
0x4 PEB断链隐藏模块1.如何找到_PEB_LDR_DATA由_TEB找到_PEB,_PEB偏移0xC找到_PEB_LDR_DATAtypedef struct _PEB_LDR_DATA{ ULONG Length; // +0x00 BOOLEAN Initialized; // +0x04 PVOID SsHandle; // +0x08 LIST_ENTRY InLoadOrderModuleList; // +0x0c 加载顺序 LIST_ENTRY InMemoryO原创 2020-10-25 10:53:41 · 1505 阅读 · 1 评论 -
3.内核编程基础
0x3内核编程基础1、未导出函数的使用WDK说明文档中只包含了内核模块导出的函数,对于未导出的函数,则不能直接使用。如果要使用未导出的函数,只要自己定义一个函数指针,并且为函数指针提供正确的函数地址就可以使用了。有两种办法都可以获取为导出的函数地址:<1> 特征码搜索<2> 解析内核PDB文件...原创 2020-10-24 12:37:40 · 335 阅读 · 0 评论 -
2.驱动的执行和调试
0x2 驱动的执行和调试1.驱动的开发流程:#mermaid-svg-jOHq0xtXYcNOFHOo .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-jOHq0xtXYcNOFHOo .label text{fill:#333}#mermaid-svg-jOHq0xtXYcNOFHOo .node rect原创 2020-10-24 10:54:58 · 488 阅读 · 0 评论 -
1.驱动环境配置(vs2010+WDK7600)
0x1 驱动开发环境配置(VS2010+WDK7600)一、安装VS2010和WDK7600vs2010下载链接,安装路径可以自己选,安装包什么的默认就好了,空间实在不够可以把sql那个选项取消WDK7600链接,安装路径自己选,默认安装就好了二、配置驱动环境首先建立一个空项目打开配置管理器新建一个,从Debug处复制添加一个项目属性表将DriverProperty.props文件里的内容换成以下内容<?xml version="1.0" encoding="utf原创 2020-10-19 23:15:25 · 867 阅读 · 0 评论