- 博客(41)
- 收藏
- 关注
原创 驱动开发 借壳通信
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 273
原创 驱动开发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 243
原创 用户句柄表的遍历
私有句柄表_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 624
原创 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 894
原创 驱动的遍历和隐藏
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 319
原创 Msf木马偷其他程序的Token 实现提权
#include <windows.h>#include <TlHelp32.h>#include <iostream>DWORD getParentProcessID() { //返回explorer.exe的pid HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 process = { 0 }; process.dwSize = sizeo
2021-10-20 13:38:50 2189
原创 使用upx压缩生成的vs程序
属性-生成事件-后期生成事件-命令行$(SolutionDir)..\tools\upx-win64\upx.exe -7v "$(TargetPath)"
2021-10-20 13:36:28 257
原创 x64 Global HANDLE 全局句柄表
全局句柄表0: kd> dq PspCidTablefffff800`04070408 fffff8a0`00004880 00000000`00000000fffff800`04070418 ffffffff`80000020 00000000`00000101fffff800`04070428 ffffffff`80000298 ffffffff`80000024fffff800`04070438 00000000`00000000 00000000`00000113fffff
2021-10-20 13:34:50 873
原创 Ring3下蓝屏的代码demo
0x00 前言蓝屏死机(英语:Blue Screen of Death,缩写:BSoD)指的是微软Windows操作系统在无法从一个系统错误中恢复过来时所显示的屏幕图像。如下图所示经典的XP蓝屏早在XP时代,大家应该经常能够看见蓝屏。处在Win10时代,Win11即将面世的今天,由于PG、各种验证机制的保护,以及MS各种漏洞补丁的修补,虽然不像之前那样漏洞百出,仍人宰割,但是还是存在着各种各样的问题,从我们今天讲的内容就可见一斑。0x01 Ring3蓝屏的方式简单的可以分成2类,实际上全是一类,
2021-10-20 13:30:48 530
原创 C++ 底层分析 7.malloc free new delete
1.malloc和free底层调用malloc->_nh_malloc_dbg->_heap_alloc_dbg->_heap_alloc_base->HeapAllocfree->_free_dbg->_free_base->HeapFree
2021-04-27 21:46:01 149
原创 C++ 底层分析 6.模板、引用、友元、运算符重载
1.模板#include <iostream>using namespace std;template<class T>void Swap(T &a,T &b){ a = a + b; b = a - b; a = a - b;}int main() { double a = 1.5456456456,b = 2.5456546546; printf("%lf %lf\n",a,b); Swap(a,b); printf("%lf %
2021-04-27 21:45:27 275
原创 C++ 底层分析 5.动态绑定、多态
1.多继承无函数覆盖struct Base1 { public: virtual void Fn_1() { printf("Base1:Fn_1...\n"); } virtual void Fn_2() { printf("Base1:Fn_2...\n"); } }; struc
2021-04-27 21:44:45 178
原创 C++ 底层分析 4.虚函数表
kd> u IopCreateFile l200nt!IopCreateFile:80576c2c 6a3c push 3Ch80576c2e 6898a14d80 push offset nt!GUID_DOCK_INTERFACE+0x54 (804da198)80576c33 e8485ffcff call nt!_SEH_prolog (8053cb80)80576c38 64a124010000 mov ea
2021-04-27 21:44:20 140
原创 C++ 堆栈小问题
下面两个程序最终i的值不一样,但是反汇编居然一样,太诡异了#include <iostream>using namespace std;int main() { int i = 10; &i; if(i == 10) { int i = 3; //最终i=10 //i = 3 //最终i = 3 } return 0;vs2010使得上述代码的反汇编完全一样,让人琢磨不透,最终还是用vc6发现了端倪结论:以这
2021-04-27 21:43:44 120
原创 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 261
原创 C++ 底层分析 2.构造-析构,继承
析构函数(初始)可以没有,有了必须按照规则用作用:初始化对象用的,创造对象的时候调用特点:3个重载:函数名字一样 参数个数或者类型不一样析构函数(清理)
2021-04-27 21:42:30 283
原创 C++ 底层分析 1.this 指针
1.结构体参数传递:相当于复制一份,浪费空间struct Base{ int x; int y; int z;};void function(Base b){}int main(int argc, char* argv[]){ Base base; function(base); return 0;}2.结构体指针参数传递:只传结构体首地址,节省空间struct Base{ int x; int y;};int Max(Base* pb){ if (pb-&g
2021-04-27 21:42:05 245
转载 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 224
原创 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 290
原创 番外: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 308
原创 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 1167
原创 进程线程 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 1449
原创 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 1555 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 798
原创 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 487 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 357
原创 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 459
原创 2.逆向分析KiFastCallEntry(填充 _KTRAP_FRAME 部分)
每个线程KTRAP_FRAME 一个ESP0TSS一个核一个如果只有一个核,那么TSS存的ESP0永远是正在运行的线程的堆栈
2020-11-04 10:28:21 844
原创 系统调用 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 933
原创 番外:IDA的使用
IDA的使用一、打开关闭文件加载符号链接关闭文件(不打包数据库文件)所有文件分着放打包文件(打包数据库文件)四个文件合成一个文件idb收集垃圾,使文件变小解决错误操作唯一的办法(不保留本次的所有操作)二、窗口Ctrl + 鼠标滚轮 使界面变大变小按空格切换到文本界面查看不同窗口显示硬编码ACDUA:字符串C:代码形式D:数据形式U:不定义,以原始字节的形式显示G:跳转指令Alt+F:搜索N:改名新增结构体成员 按DAlt+q 选择类型为结构体
2020-11-01 15:09:15 290
原创 9.写拷贝
0x9 写拷贝(WriteCopy)一、什么是写拷贝?HOOK了这个Dll某个函数,其他进程受影响吗?答:不受影响!因为有写拷贝!写拷贝由操作系统执行二、低2G的VAD二叉树(记录了哪些线性地址被占用或被占用)使用命令查看vad的地址level //二叉树的级别start //因为单位为4KB,再加3个0即为真正线性地址commit //若为Private(VirtualAlloc申请)为私有,自己独享 READWRITE //可读可写 READONLY //只读
2020-10-31 12:57:13 899 2
原创 8.程序手动实现加载、运行、停止、卸载驱动
0x7.程序实现(ring3)加载、运行、停止、卸载驱动一、手动加载驱动步骤用GetFullPathNameA获取驱动的完整路径用OpenSCManager打开服务控制管理器用CreateServiceA创建服务如果服务创建已存在,直接用OpenServiceA打开服务,否则用StartServiceA开启服务二、卸载用OpenSCManager打开服务控制管理器用OpenServiceA打开服务用ControlService停止驱动服务三、代码实现主要功能:用户输入PID,r
2020-10-30 16:14:27 1194 2
原创 7.ShellCode相关实现
0x7 ShellCode实现一、什么是shellcode?不依赖环境,放到任何地方都可以执行的机器码(硬编码)。二、编写
2020-10-28 20:11:37 386
原创 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 556
原创 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 402
原创 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 1558 1
原创 3.内核编程基础
0x3内核编程基础1、未导出函数的使用WDK说明文档中只包含了内核模块导出的函数,对于未导出的函数,则不能直接使用。如果要使用未导出的函数,只要自己定义一个函数指针,并且为函数指针提供正确的函数地址就可以使用了。有两种办法都可以获取为导出的函数地址:<1> 特征码搜索<2> 解析内核PDB文件...
2020-10-24 12:37:40 351
原创 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 504
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人