自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 收藏
  • 关注

原创 KiFindReadyThread函数分析

示意大概如下,也就是不同颜色的长条就是不同的WaitListEntry,这些长条被集中在一个DispatcherReadyListHead中,当然,应该要有32个,我这里只是示意一下。我们找到了eax是从一个edi所索引的地方取出来的,这个edi就是我们的第二个参数,它也是一个prcb,所以我们就可以知道这个0x31ec是什么,没错,就是位图。所以我们这里为了加深印象,windbg看一下,就知道,这个KiFindReadyThread所代表的函数是Prcb,这样,我们就找到了第一个参数。

2025-03-05 15:37:22 682

原创 线程结构基本介绍

StackLimit和InitialStack中间所开辟的这段栈空间就是我们线程的栈空间,其中紫色部分还要用做KTRAP,红色部分是浮点,只有绿色部分是真正线程栈的所在地。这个东西在我们调试的时候还是比较有用的,如果我们写驱动蓝屏了,就可以在查看当前线程,然后去找到这个esp的值,去看看具体蓝屏的原因。同样是用windbg来查看我们进程的具体情况,可以看到有很多的信息,我们的线程地址是 88287370。线程对应的结构也有KTHEARD和ETHREAD,dt打开看一下。继续往下看,几个重要的值。

2025-03-05 08:57:54 137

原创 进程结构(初)

先随便来打开一个进程,这里我就开了一个CE为例首先在windbg中用命令来遍历进程我们会看见这样的结果,一般新开的进程都在最下面87137218就是我们进程的地址了,进程空间本质上就是一块内存我们的信息都按照EPROCESS这个结构来存,乍一看,很多,但是不用担心,我们会一点点基本的解析。

2025-02-21 09:29:42 254

原创 SSDT_HOOK

先放一个成品小demo。

2025-02-20 08:20:11 240

原创 17.系统调用 下

在经历了这么多复杂的机制后,iret返回的KTRAP_FRAME五个值也对应了我们所学习的知识,不知道大家有没有感受到系统设计之美(😀。如果翻一翻上篇,就会知道这是一个SystemcallRet的位置,我们到ntdll中去找到这个KiFastSystemCallRet。到这里,我们就基本的,初步的了解了有关win系统调用的流程,知道了几个结构,也就可以继续开始我们下一阶段的学习了。书接上文,我们继续分析,这一段主要是几个蓝屏的处理,以及对于Irql的验证,以及etw调用。接下来是性能统计和APC相关操作。

2025-02-08 16:06:50 1942

原创 16. 系统调用 上

如果我们已经稍微熟悉了ntdll里面的基本结构,我们就可以知道从R3转向R0的入口大概都是一个汇编,这里以OpenProccess函数为例这里强调一下,图中红框标出的位置就是同一段汇编的两个不同的声明,所以Nt开头和Zw开头是一样的可以看到,汇编就只有短短的几行,这里注释一下这是什么意思呢?这就说明,在ntdll封装的实现中,本质上也是一个转发,在找到了不同的系统服务例程号(不同函数不同)后,去找到KiFastCallEntry这个函数,然后根据具体的调用号来进入内核调用。

2025-02-08 16:05:48 982

原创 阶段性demo 键盘信息过滤

本来想按照理论+实践的方式继续向下写文章,但是写来写去发现这一阶段涉及的知识实在是太多太杂,如果什么都事无巨细的去讲解,那么这样反倒会让文章变得杂乱,所以我打算直接上一个demo代码,然后根据这个demo代码来补全我们现阶段应该知道的知识(不一定理解深入,先会用经过调试,在停止服务后,任意按下一个按键就蓝屏,所以问题就在这个驱动卸载函数里面。更加精确的定位应该在这个DeAttach函数中,但是反正也不影响我们使用,就懒得搞了(菜这也是为后来的自己或者其他人指个路//设备卸载函数。

2024-12-17 00:37:10 866

原创 驱动的通信

试想一下,我们未来写的某个驱动,他要发挥作用,那么处在R0的它必须要R3的程序相互通信,传输字符串,传输结果,传输数据(如果不能正常的做到这一点那么就算你随便读内存了也看不见啊是不是)第二个参数是DeviceExtensionSize,它会指定一个额外的空间来存储结构信息,比如我们创建了某个设备它有一些额外的参数,信息,就可以被存储在这个扩展出来的空间里面。上面的两个参数,一个是我们的设备对象,一个就是我们刚刚介绍的IRP。然后,在最后,我们写一个程序来和我们的设备通信。,暂时不需要了解IRP的结构特征。

2024-12-10 16:42:45 564

原创 驱动断链的研究

那既然我们已经正确的找到这个双向链表了,剩下的事情就好办多了,使用我们之前驱动篇基础里面介绍过的API来初始化一个Unicode字符串,然后用这个字符串去对比某个目标模块,如果一致,就按照链表断链的方式将其从双向链表中删除,继续修改我们的代码。我们看见了第一个InLoadOrderLinks里面的双向链表,所以我们用它给的Flink来访问链表里面的下一个节点,由于我们的MyDriver2是最后一个加载的驱动,所以它的下一个也就是我们的第一个驱动,果不其然,是我们的内核。这是真正的断掉了吗?

2024-12-09 15:36:53 1019

原创 驱动篇的开端

首先看右边,我红圈标出来的地方默认会有inf文件,里面会标记我们驱动的信息,如果不填编译器会报错,这里我们暂时不需要,因为我们现阶段还是只是在不验证驱动签名的Win7上进行开发,等到后续介绍到Win10之后,我们会重新介绍inf,我们的驱动依次有NT(不支持即插即用功能),WDM(支持即插即用功能),WDF(以WDM为基础的框架,为了简化我们开发的流程),以及UMDF,KMDF(用户,内核)。这时候如果我们按下卸载驱动,会发现我们是卸载不掉的,这是因为我们在之前的代码中没有留下卸载驱动的函数,把它补上。

2024-12-03 23:10:44 1056

原创 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 261

原创 零地址挂页

我们现在是用windbg手动去修改PTE,但是随着我们学习的深入,我们就可以使用程序来自动化这一过程,来达到我们注入shellcode的效果。

2024-11-26 23:11:47 823

原创 页的初步认识

我们在之前的学习中,已经学习了相当一部分有关段的知识,CPU提供了段的机制来给我们的内存进行保护,但实际上我们在x86下的段base是0,实际上并没有偏移。

2024-11-25 23:13:11 686

原创 中断门的研究

在介绍中断门之前,我们先介绍IDT表如果我们查看IDT表的解析结构,就会发现它和之前我们学习的GDT表非常类似IDT也是由段描述符组成的,既然我们之前已经介绍过了调用门,那么这个中断门我们自然是十分轻松的与调用门使用call来调用不同,中断门我们使用int指令来调用,没错,就是我们之前经常用到的int 3之流,在执行完之后会通过中断门跳入到对应的int 3函数中(int 3其实是一个函数,不只是指令怎么简单,我们马上来证明)

2024-11-18 00:04:19 493

原创 代码段数据段的划分

所以,综上所述,对于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 338

原创 调用门提权

在我写的2.保护模式+段探测这篇文章中,我们提到了S位对于段描述符的控制,之前我们已经介绍了代码段和数据段,现在我们来把目光转到系统段在这么多中结构里面,我们今天要介绍的就是编号为12的,32位调用门结合上面的图,我们先暂时只需要记住,当S = 0 ,type = C,那么这说明这个段描述符是一个调用门也就是下图所示。

2024-11-17 23:57:26 862 1

原创 DB Type

其中这张表里面Read可读,Write可写,Execute可执行,accessed被访问过,expand-down表示向下扩展,conformimg表示一致位,这几个里面一致位如果是1,那么就说明这个段所指的内存是纯段没有页的,但是现在的操作系统基本上都有分页,故不再赘述。左边是正常的向上拓展,即base到Limit这一段距离的内存有效,右边是base到Limit这一段距离无效,也就是向下拓展,总的来说,向下拓展就是段所指的这部分内存无效。S位会决定是下面哪种表格,当s = 1 时,说明此时是数据段。

2024-11-17 23:48:09 356

原创 段探测的研究

而base的值为 00 0000,再添加上两段分开的00,

2024-11-17 23:44:42 716

原创 Windows内核编程准备

本课程涉及的驱动,是利用驱动程序的高级权限,去做一些用户层不能做的工作,严格来说,这些写出来的东西不能算是驱动,因为它不会驱动任何设备。

2024-11-17 23:36:32 373

原创 某杀软环境下的添加账户

我们在某个杀软环境下,正常添加账户一般是会被直接拦截的。

2024-11-17 00:33:16 425

原创 UAC ByPass的研究

(User Account Control)是Windows Vista(及更高版本操作系统)中一组新的基础结构技 术,可以帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统,同时也可以帮助组织部署更易于管理 的平台使用UAC,应用程序和任务总是在非管理员帐户的安全上下文中运行,但管理员专门给系统授予管理员 级别的访问权限时除外。UAC会阻止未经授权应用程序的自动安装,防止无意中对系统设置进行更改。

2024-11-17 00:21:46 962

原创 SSDT Hook

系统服务描述符表这里以Windows XP SP3为例第一个参数指向的是内核函数存储的首地址第三个参数11c(284)代表的是SSDT表有多少个内核函数第四个参数指向的是一个地址,这个地址表示的内核函数相对应的参数个数比如0x2c = 44,44/4 = 11个参数。

2024-11-17 00:13:17 3834

原创 Session注入

在进行Dll注入的时候,我们发现没法注入一些系统进程提示我们缺少权限或者拒绝访问,甚至干脆就是什么反应都没有这时候我们考虑往更加底层去跟函数,我们不能再使用在用户层所给我们的函数,我们自己去寻找内核层的函数。

2024-11-17 00:09:21 1120

原创 WinDefender Weaker

Windows Vista / Server 2008引入 了受保护进程的概念,其目的不是保护您的数据或凭据。其最初目标是保护媒体内容并符合DRM (数字版权管理)要求。Microsoft开发了此机制,以便您的媒体播放器可以读取例如蓝光,同时 防止您复制其内容。当时的要求是映像文件(即可执行文件)必须使用特殊的Windows Media证 书进行数字签名(如Windows Internals的“受保护的过程”部分所述)。在实践中,

2024-11-17 00:03:17 827

原创 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 952

原创 DLL注入

在DLL注入的时候,起的是远程的线程在上面的参数中,lpStartAddress就是线程的函数,使用LoadLibrary的地址作为线程函数的地址,这样我们就可以用LoadLibrary来起lpParameter中装载的dll路径。

2024-11-16 00:27:23 517

原创 DLL劫持

打开我们的Process Monitor,来监测一下某些程序启动的事件,这里我们要注意一个细节,当我们想要寻找存在Dll劫持的程序的时候,要把exe托出它原来的环境来执行,原因是上面所提到的dll加载顺序,我们需要保证找到的dll,一定是exe所在目录加载的。随着版本的更新,代码的更迭,应用程序自带的Dll数不胜数,几乎随便打开一个应用程序的主目录,都能看见一大把Dll,它们中的很多都满足被劫持的条件。这样进行劫持,还是有可能会让我们的程序没有办法正常运行,因为我们链上了一个原本不存在的dll,这样。

2024-11-16 00:17:27 1182

原创 C语言基础

多用于虚拟设备驱动。此关键字可以使编译器在生成代码时不包含任何注释或标记。仅可以对函数的定义使用,不能用于数据声明、定义,或者函数的声明。如果想要使用x64,需要额外弄一个asm文件,这个后面会说这里给出一个默认C调用的demo,裸函数可以依照这个结构。

2024-11-16 00:05:55 735

原创 R3隐藏导入表

通过pe文件,我们可以看见IAT导入表,在这个表中,记录了PE文件的使用以及相关的dll模块我这里在vs2022中用dumpin /imports 命令举例这里我们可以看见,很多api,其中,等api会被重点盯防那么,怎么在导入表中隐藏这些api呢首先我们使用的方法可以是,不直接调用这些函数,转而从kernel32里面直接找到这些函数的真实加载地址来做到不出现敏感api这里我就不放截图演示导入表了,但是同时我们会获得一个疑问那如果杀软连都查,那么怎么办呢。

2024-11-16 00:03:36 620

原创 内存加载检测

上面没有提到,在win10里面加载驱动是需要Kernel-Mode driver manager的,如果提示Open handle error那么检查有没有用管理员权限其次,win10以上不接受没有数字签名的驱动,这个可以关掉最后就是,在测试几个注入和shellcodeloder的过程中Session注入在dll进程所附加的活动确实没有启动,但是在线程中的活动照常启动了(疑惑。

2024-11-15 23:54:32 1064

原创 进程强杀的研究

任务管理器是怎么结束一个进程的呢它也是调用一个WINAPI,叫做TerminateProcess由于它也是一个三环的API,在面对杀软或者一些跑在0环的程序束手无策随便写了个demo,用ida打开,发现它也是从kernel32中去导入按照一般的winapi的规律,我们直接到ntdll去找相关api。

2024-11-15 23:52:29 442 1

原创 进程和线程

(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基 本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,**进程是线程的容器。**程序是指令、数据及其组织形式的描述,进 程是程序的实体(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作 单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执 行不同的任务。

2024-11-15 23:42:40 1035

原创 APC注入

异步过程调用(APC, Asynchronous Procedure Call)是一种在Windows操作系统中使用的机制,允许在一个线程中调用另一个线程的函数,而不会阻塞调用线程。这种机制常用于需要在后台执行任务的情况,比如处理I/O操作或定时处理等。

2024-11-15 23:40:30 643

原创 [MTCTF 2021]Random

拿到题目之后,将其拖入查壳软件中进行查壳,可以看见其中并未加壳jiang'qi将其拖入IDA中进行分析。

2023-09-21 08:07:09 344

原创 【BUUCTF】 HCTF2018 WarmUp

前面的部分重新赋予$page,且这部分必须包含source.php或者hint.php,因此我们可以猜出这个请求应该是。大致意思是,只有链接中包含了file文件请求且通过了checkFile函数的验证,那么将把链接包含的file文件include到页面中,否则输出一张图片(推测为那个滑稽头像)可以看到 函数会检查file请求是否为空,是否是字符串等,且只有在参数中包含了source .php或者hint.php时才会生效。按照常规思路f12,看一看有什么,结果发现了一个名为source.php的注释。

2023-08-19 10:24:31 274

原创 [python] 记录一次简单网络工具“netcat”的编程

还可以改进的地方:增加对于同一主机其他端口的扫描功能增加对于输入命令错误时服务器端的容错率写注释的时候几乎全部是用翻译软件写的,英语大退步(bushipython很多语法也忘了,不得不说还是要加强对于编程的练习,不过最后看到程序能够正常运行,还是挺开心的。

2023-06-22 00:50:27 611 2

原创 [BUUCTF] 刮开有奖

大概如下修改,将(a1+数字)视为数组里面的编号,其中注意将偏移中乘4操作去掉(机器语言地址+4),总的来说哪里红了改哪里。想起搜索字符串的时候搜到过base64 的base,猜测第二个处理的函数sub_40100为base64加密。进入对v7进行某种操作的函数sub_4010F0,分析后发现应该是要使用脚本来反推。按照下面这段的逻辑拼接出string即为flag。随手在函数和字符串中搜索flag,没有发现。双击进入DialogFunc这个函数,分析。拖入IDA中,嗯,看函数应该没有加壳。

2023-06-11 20:30:11 418 1

原创 【BUUCTF】JustRE

分析下来发现,主函数中不存在和flag有关的信息。双击 aBjdDD2069a4579。flag为将19999和0填入字符串中。发现一个疑似flag的字符串。按x寻找相关联,之后反编译。

2023-06-09 09:22:33 253

原创 【NSSCTF 2022】sign-ezc++

发现存在一个give_flag函数 ,点进去看,是flag生成的过程。函数中除了this指针外没有传参数,因此flag中应该一开始就存有值。答案为NSSCTF{this_is_NISA_re_sign}想到human类中可能存在答案,在右边函数窗口搜索human。将两行数据复制,注意dup(x)相当于两个相同的x。拖入IDA中发现可以直接看到主函数。

2023-06-09 08:51:25 313

原创 【BUUCTF】 xor~SimpleRev

按题目意思本题关键在于异或,将程序拖入IDA中,发现有主函数快速分析其逻辑后,可以知道_b为本体中输入字符串所放置的变量,其由memset初始化,再由getline接受字符串可以看见flag应该为一个33位的字符串,且异或从第二个字符开始_b 与global相比较得出结论,尝试搜索global,无果打开字符串表,发现一个疑似目标字符串从"f"到"O"一共33 个字符,故编写脚本(也可以一个一个复制),将字符相异或可以得到答案为flag{QianQiuWanDai_YiTongJiangHu}

2023-06-01 17:42:43 299

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除