- 博客(59)
- 收藏
- 关注
原创 APC的进一步研究
在R3中,我们插入APC节点是从NtQueueApcThread开始的,我们可以得到他的汇编,可以看见就是传了几个参数,然后进入了NtQueueApcThreadEx。
2025-06-28 00:33:57
786
原创 APC的初步研究
当我们的线程正常运行的时候,我们相关的环境被保存在Apcstate里面,当我们的线程挂靠的其他进程,也就是要用到其他进程的环境时,这时候,我们当前的环境就会被保存到SavedApcState。于是乎,我们便得到了两个函数以及其相关定义,里面有些定义不好解释,但是我先挂在这里,方便后续的翻看,等到我们学习了更多APC相关的知识,我们会对这些参数有着更加深刻的理解。然后我在代码中打印了路径,第一个路径我们是在驱动中System进程的空路径,第二个则是我们指定的线程的进程的路径。
2025-06-18 10:49:00
1001
原创 更进一步深入的研究ObRegisterCallBack
00000000;0000000000000034RegistrationHandle实际的结构就是上面写的 _OB_HANDLE,然后回调链表的实际结构就是 _OB_LIST_ENTRY。
2025-06-12 23:31:57
1224
原创 对象回调初步研究
这里有一个问题我没有解决,那就是在停止驱动的时候会蓝屏,0x00000039,在取消回调的时候回调句柄是被赋了值的,但是我一直没搞清楚为什么会蓝屏。中间还修改了DriverSection的Flags的值,把它改了回去,但是还是无济于事。
2025-06-09 09:36:19
1102
原创 回调监控初步研究
windows提供了API用来监控我们的线程进程的创建和销毁。主要是下面几个函数//进程线程//模块先从最简单的PsSetCreateProcessNotifyRoutine开始。
2025-05-27 11:30:29
783
原创 私有句柄表探究
在上篇文章中我们介绍了全局句柄表,同样与之对应的还有私有句柄表。首先写一段代码来尝试打开进程句柄,我这里还是以CFF为例(什么软件其实无所谓,主要能使用OpenProcess打开就行)运行这个程序,得到结果这些返回的16进制数就是我们这次打开的句柄在我们写的代码所运行的这个程序中的私有句柄表中的位置。我这里程序名称叫做OpenReverseCollapse,这里可以看见EPROCESS的位置,当然也可以直接用 ObjectTable中的这个地址。
2025-05-26 00:45:19
865
原创 KiFindReadyThread函数分析
示意大概如下,也就是不同颜色的长条就是不同的WaitListEntry,这些长条被集中在一个DispatcherReadyListHead中,当然,应该要有32个,我这里只是示意一下。我们找到了eax是从一个edi所索引的地方取出来的,这个edi就是我们的第二个参数,它也是一个prcb,所以我们就可以知道这个0x31ec是什么,没错,就是位图。所以我们这里为了加深印象,windbg看一下,就知道,这个KiFindReadyThread所代表的函数是Prcb,这样,我们就找到了第一个参数。
2025-03-05 15:37:22
811
原创 线程结构基本介绍
StackLimit和InitialStack中间所开辟的这段栈空间就是我们线程的栈空间,其中紫色部分还要用做KTRAP,红色部分是浮点,只有绿色部分是真正线程栈的所在地。这个东西在我们调试的时候还是比较有用的,如果我们写驱动蓝屏了,就可以在查看当前线程,然后去找到这个esp的值,去看看具体蓝屏的原因。同样是用windbg来查看我们进程的具体情况,可以看到有很多的信息,我们的线程地址是 88287370。线程对应的结构也有KTHEARD和ETHREAD,dt打开看一下。继续往下看,几个重要的值。
2025-03-05 08:57:54
234
原创 进程结构(初)
先随便来打开一个进程,这里我就开了一个CE为例首先在windbg中用命令来遍历进程我们会看见这样的结果,一般新开的进程都在最下面87137218就是我们进程的地址了,进程空间本质上就是一块内存我们的信息都按照EPROCESS这个结构来存,乍一看,很多,但是不用担心,我们会一点点基本的解析。
2025-02-21 09:29:42
354
原创 17.系统调用 下
在经历了这么多复杂的机制后,iret返回的KTRAP_FRAME五个值也对应了我们所学习的知识,不知道大家有没有感受到系统设计之美(😀。如果翻一翻上篇,就会知道这是一个SystemcallRet的位置,我们到ntdll中去找到这个KiFastSystemCallRet。到这里,我们就基本的,初步的了解了有关win系统调用的流程,知道了几个结构,也就可以继续开始我们下一阶段的学习了。书接上文,我们继续分析,这一段主要是几个蓝屏的处理,以及对于Irql的验证,以及etw调用。接下来是性能统计和APC相关操作。
2025-02-08 16:06:50
2638
原创 16. 系统调用 上
如果我们已经稍微熟悉了ntdll里面的基本结构,我们就可以知道从R3转向R0的入口大概都是一个汇编,这里以OpenProccess函数为例这里强调一下,图中红框标出的位置就是同一段汇编的两个不同的声明,所以Nt开头和Zw开头是一样的可以看到,汇编就只有短短的几行,这里注释一下这是什么意思呢?这就说明,在ntdll封装的实现中,本质上也是一个转发,在找到了不同的系统服务例程号(不同函数不同)后,去找到KiFastCallEntry这个函数,然后根据具体的调用号来进入内核调用。
2025-02-08 16:05:48
1059
原创 阶段性demo 键盘信息过滤
本来想按照理论+实践的方式继续向下写文章,但是写来写去发现这一阶段涉及的知识实在是太多太杂,如果什么都事无巨细的去讲解,那么这样反倒会让文章变得杂乱,所以我打算直接上一个demo代码,然后根据这个demo代码来补全我们现阶段应该知道的知识(不一定理解深入,先会用经过调试,在停止服务后,任意按下一个按键就蓝屏,所以问题就在这个驱动卸载函数里面。更加精确的定位应该在这个DeAttach函数中,但是反正也不影响我们使用,就懒得搞了(菜这也是为后来的自己或者其他人指个路//设备卸载函数。
2024-12-17 00:37:10
973
原创 驱动的通信
试想一下,我们未来写的某个驱动,他要发挥作用,那么处在R0的它必须要R3的程序相互通信,传输字符串,传输结果,传输数据(如果不能正常的做到这一点那么就算你随便读内存了也看不见啊是不是)第二个参数是DeviceExtensionSize,它会指定一个额外的空间来存储结构信息,比如我们创建了某个设备它有一些额外的参数,信息,就可以被存储在这个扩展出来的空间里面。上面的两个参数,一个是我们的设备对象,一个就是我们刚刚介绍的IRP。然后,在最后,我们写一个程序来和我们的设备通信。,暂时不需要了解IRP的结构特征。
2024-12-10 16:42:45
795
原创 驱动断链的研究
那既然我们已经正确的找到这个双向链表了,剩下的事情就好办多了,使用我们之前驱动篇基础里面介绍过的API来初始化一个Unicode字符串,然后用这个字符串去对比某个目标模块,如果一致,就按照链表断链的方式将其从双向链表中删除,继续修改我们的代码。我们看见了第一个InLoadOrderLinks里面的双向链表,所以我们用它给的Flink来访问链表里面的下一个节点,由于我们的MyDriver2是最后一个加载的驱动,所以它的下一个也就是我们的第一个驱动,果不其然,是我们的内核。这是真正的断掉了吗?
2024-12-09 15:36:53
1266
原创 驱动篇的开端
首先看右边,我红圈标出来的地方默认会有inf文件,里面会标记我们驱动的信息,如果不填编译器会报错,这里我们暂时不需要,因为我们现阶段还是只是在不验证驱动签名的Win7上进行开发,等到后续介绍到Win10之后,我们会重新介绍inf,我们的驱动依次有NT(不支持即插即用功能),WDM(支持即插即用功能),WDF(以WDM为基础的框架,为了简化我们开发的流程),以及UMDF,KMDF(用户,内核)。这时候如果我们按下卸载驱动,会发现我们是卸载不掉的,这是因为我们在之前的代码中没有留下卸载驱动的函数,把它补上。
2024-12-03 23:10:44
1148
原创 PAE的研究
我们知道,10-10-12分页的表示范围是有极限的,1024 * 1024 * 1024 * 4 也就是4GB,但是我们现在大部分的操作系统,包括我们平时所使用的个人电脑,基本上都超过了这个内存,所以,一定是有新的分页方式代替了原有的分页。选用的进程DirBase是0670d440 ,我们的PDPTE也是8个字节,按照我们之前所学,找到了GDT表的物理地址的位置,验证了我们之前的理论知识。首先先把页切回2-9-9-12,看CR3的值像下面一样就可以了。将这个地址按照2-9-9-12的顺序拆开。
2024-11-27 11:18:53
328
原创 零地址挂页
我们现在是用windbg手动去修改PTE,但是随着我们学习的深入,我们就可以使用程序来自动化这一过程,来达到我们注入shellcode的效果。
2024-11-26 23:11:47
889
原创 页的初步认识
我们在之前的学习中,已经学习了相当一部分有关段的知识,CPU提供了段的机制来给我们的内存进行保护,但实际上我们在x86下的段base是0,实际上并没有偏移。
2024-11-25 23:13:11
854
原创 中断门的研究
在介绍中断门之前,我们先介绍IDT表如果我们查看IDT表的解析结构,就会发现它和之前我们学习的GDT表非常类似IDT也是由段描述符组成的,既然我们之前已经介绍过了调用门,那么这个中断门我们自然是十分轻松的与调用门使用call来调用不同,中断门我们使用int指令来调用,没错,就是我们之前经常用到的int 3之流,在执行完之后会通过中断门跳入到对应的int 3函数中(int 3其实是一个函数,不只是指令怎么简单,我们马上来证明)
2024-11-18 00:04:19
542
原创 代码段数据段的划分
所以,综上所述,对于ss堆栈段来说,需要DPL和RPL保持一致,再由CS和SS必须保持一致的原则我们可以知道 对于堆栈来说,只有DPL== RPL==CPL,那么代码才能正常执行。所以我们在这里可以把ss改为R3,也就是4b,多余的过程就不截图了。CPL是当前进程的权限级别(Current Privilege Level),是当前正在指向的代码段所在段的成绩,也就是CS段的DPL。首先还是得到现在GDT表,然后把index为4的段描述符放到index为9的地方,并且改变其DPL为0环,00cff300。
2024-11-18 00:02:37
410
原创 调用门提权
在我写的2.保护模式+段探测这篇文章中,我们提到了S位对于段描述符的控制,之前我们已经介绍了代码段和数据段,现在我们来把目光转到系统段在这么多中结构里面,我们今天要介绍的就是编号为12的,32位调用门结合上面的图,我们先暂时只需要记住,当S = 0 ,type = C,那么这说明这个段描述符是一个调用门也就是下图所示。
2024-11-17 23:57:26
1077
4
原创 DB Type
其中这张表里面Read可读,Write可写,Execute可执行,accessed被访问过,expand-down表示向下扩展,conformimg表示一致位,这几个里面一致位如果是1,那么就说明这个段所指的内存是纯段没有页的,但是现在的操作系统基本上都有分页,故不再赘述。左边是正常的向上拓展,即base到Limit这一段距离的内存有效,右边是base到Limit这一段距离无效,也就是向下拓展,总的来说,向下拓展就是段所指的这部分内存无效。S位会决定是下面哪种表格,当s = 1 时,说明此时是数据段。
2024-11-17 23:48:09
420
原创 Windows内核编程准备
本课程涉及的驱动,是利用驱动程序的高级权限,去做一些用户层不能做的工作,严格来说,这些写出来的东西不能算是驱动,因为它不会驱动任何设备。
2024-11-17 23:36:32
482
原创 UAC ByPass的研究
(User Account Control)是Windows Vista(及更高版本操作系统)中一组新的基础结构技 术,可以帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统,同时也可以帮助组织部署更易于管理 的平台使用UAC,应用程序和任务总是在非管理员帐户的安全上下文中运行,但管理员专门给系统授予管理员 级别的访问权限时除外。UAC会阻止未经授权应用程序的自动安装,防止无意中对系统设置进行更改。
2024-11-17 00:21:46
1186
原创 SSDT Hook
系统服务描述符表这里以Windows XP SP3为例第一个参数指向的是内核函数存储的首地址第三个参数11c(284)代表的是SSDT表有多少个内核函数第四个参数指向的是一个地址,这个地址表示的内核函数相对应的参数个数比如0x2c = 44,44/4 = 11个参数。
2024-11-17 00:13:17
5876
原创 Session注入
在进行Dll注入的时候,我们发现没法注入一些系统进程提示我们缺少权限或者拒绝访问,甚至干脆就是什么反应都没有这时候我们考虑往更加底层去跟函数,我们不能再使用在用户层所给我们的函数,我们自己去寻找内核层的函数。
2024-11-17 00:09:21
1193
原创 WinDefender Weaker
Windows Vista / Server 2008引入 了受保护进程的概念,其目的不是保护您的数据或凭据。其最初目标是保护媒体内容并符合DRM (数字版权管理)要求。Microsoft开发了此机制,以便您的媒体播放器可以读取例如蓝光,同时 防止您复制其内容。当时的要求是映像文件(即可执行文件)必须使用特殊的Windows Media证 书进行数字签名(如Windows Internals的“受保护的过程”部分所述)。在实践中,
2024-11-17 00:03:17
1016
原创 Inline Hook
我们之前提到过SSDT Hook IAT Hook等,这种Hook需要基于 这些SSDT,IAT这些表的Hook但是如果我们需要找一些未导出的函数,那么就很难去进行Hook,这就引出了另一种Hook,也就是在代码里面Hook,InlineHookAPI函数都都由操作系统所提供的DLL文件中引来,当在使用某个API函数时,在运行程序后,程序会主动把API所需的DLL链接进入进程中,这样,程序就会像调用自己的函数一样调用API这些在DLL文件中的函数,在加载的时候以写拷贝的权限在进程中申请内存。
2024-11-16 00:36:30
1091
原创 DLL注入
在DLL注入的时候,起的是远程的线程在上面的参数中,lpStartAddress就是线程的函数,使用LoadLibrary的地址作为线程函数的地址,这样我们就可以用LoadLibrary来起lpParameter中装载的dll路径。
2024-11-16 00:27:23
576
原创 DLL劫持
打开我们的Process Monitor,来监测一下某些程序启动的事件,这里我们要注意一个细节,当我们想要寻找存在Dll劫持的程序的时候,要把exe托出它原来的环境来执行,原因是上面所提到的dll加载顺序,我们需要保证找到的dll,一定是exe所在目录加载的。随着版本的更新,代码的更迭,应用程序自带的Dll数不胜数,几乎随便打开一个应用程序的主目录,都能看见一大把Dll,它们中的很多都满足被劫持的条件。这样进行劫持,还是有可能会让我们的程序没有办法正常运行,因为我们链上了一个原本不存在的dll,这样。
2024-11-16 00:17:27
1747
原创 C语言基础
多用于虚拟设备驱动。此关键字可以使编译器在生成代码时不包含任何注释或标记。仅可以对函数的定义使用,不能用于数据声明、定义,或者函数的声明。如果想要使用x64,需要额外弄一个asm文件,这个后面会说这里给出一个默认C调用的demo,裸函数可以依照这个结构。
2024-11-16 00:05:55
870
原创 R3隐藏导入表
通过pe文件,我们可以看见IAT导入表,在这个表中,记录了PE文件的使用以及相关的dll模块我这里在vs2022中用dumpin /imports 命令举例这里我们可以看见,很多api,其中,等api会被重点盯防那么,怎么在导入表中隐藏这些api呢首先我们使用的方法可以是,不直接调用这些函数,转而从kernel32里面直接找到这些函数的真实加载地址来做到不出现敏感api这里我就不放截图演示导入表了,但是同时我们会获得一个疑问那如果杀软连都查,那么怎么办呢。
2024-11-16 00:03:36
739
原创 内存加载检测
上面没有提到,在win10里面加载驱动是需要Kernel-Mode driver manager的,如果提示Open handle error那么检查有没有用管理员权限其次,win10以上不接受没有数字签名的驱动,这个可以关掉最后就是,在测试几个注入和shellcodeloder的过程中Session注入在dll进程所附加的活动确实没有启动,但是在线程中的活动照常启动了(疑惑。
2024-11-15 23:54:32
1237
原创 进程强杀的研究
任务管理器是怎么结束一个进程的呢它也是调用一个WINAPI,叫做TerminateProcess由于它也是一个三环的API,在面对杀软或者一些跑在0环的程序束手无策随便写了个demo,用ida打开,发现它也是从kernel32中去导入按照一般的winapi的规律,我们直接到ntdll去找相关api。
2024-11-15 23:52:29
602
1
原创 进程和线程
(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基 本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,**进程是线程的容器。**程序是指令、数据及其组织形式的描述,进 程是程序的实体(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作 单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执 行不同的任务。
2024-11-15 23:42:40
1087
原创 APC注入
异步过程调用(APC, Asynchronous Procedure Call)是一种在Windows操作系统中使用的机制,允许在一个线程中调用另一个线程的函数,而不会阻塞调用线程。这种机制常用于需要在后台执行任务的情况,比如处理I/O操作或定时处理等。
2024-11-15 23:40:30
884
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅