自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 (恶意软件分类)微软恶意软件分类数据集预处理

之所以将不同恶意软件家族转化为灰度图后分别用不同的文件夹存储,一方面是方便标记类别,其次是可使用。部分的二进制代码片段,此处只将 .bytes文件转化为灰度图像进行分析。文件,.bytes 文件即为恶意软件的。数据集中,每个样本包含。

2023-10-23 10:01:10 655 6

原创 泰坦尼克号宇宙飞船(深度学习)

在环绕半人马座阿尔法星前往第一个目的地——炽热的巨蟹座55 e的途中,粗心的“泰坦尼克”号飞船与隐藏在尘埃云中的时空异常物相撞。可悲的是,它遭遇了与1000年前同名的命运相似的命运。虽然飞船完好无损,但几乎一半的乘客被送到了另一个维度!载着近1.3万名乘客,这艘船开始了它的处女航,将移民从我们的太阳系运送到围绕附近恒星运行的三颗新适宜居住的系外行星。为了帮助救援人员和找回失踪的乘客,你面临的挑战是从飞船受损的计算机系统中恢复的记录中预测哪些乘客被异常运输了。我们收到了来自四光年外的信号情况不妙。

2023-10-15 17:02:55 508 2

原创 (vt) 无限硬件中断的代码实现

在学习vt时了解到无限硬件断点技术,即不依赖于dr寄存器实现硬件断点。由于硬件断点依赖于调试寄存器 dr0-dr3,这就意味着只能设置4个硬件断点。

2023-05-06 15:34:31 607

原创 (x86)硬件断点的原理与测试

硬件中断的原理与测试。

2023-04-30 18:59:50 312

原创 (vt)事件注入与中断拦截

vt虚拟化下的中断拦截以及事件注入的实现。

2023-04-29 20:14:51 326

原创 (x64)内存虚拟化

内存虚拟化+无痕HOOK。

2023-04-27 17:47:39 230

原创 自定义处于qume中的Linux虚拟机int3中断,使得gdb可以调试Linux用户程序

自定义处于qume中的Linux虚拟机int3中断,使得gdb可以调试Linux用户程序。

2023-02-02 17:51:48 214

原创 (x64)Linux中断门状态切换时rsp的获取

(x64)Linux中断门状态切换时rsp的获取。在IA-32e架构中,Interrupt/trap-gate描述符中新增了IST域(, 中断栈表),可以为 interrupt handler 提供额外的stack指针。当中断门描述符表中的IST字段若不为0,则在状态切换时rsp将不会采用 tss.rsp0;若IST=n(1~7),则 rsp=tss.istn。

2023-01-29 13:27:08 171

原创 (x64)Linux下的中断门测试——Cr4.SMEP/SMAP

在Cr4.SMAP/SMEP开启的情况下,以内核态执行用户程序代码或访问数据,将引发错误。

2023-01-29 10:34:52 224

原创 (x64)Linux下的中断门测试

(x64)Linux下的中断门测试

2023-01-28 21:21:33 127

原创 Linux system_call流程分析

Linux system_call流程分析

2023-01-22 21:22:59 218

原创 kali2022编译Linux内核驱动ko文件

kali2022,内核版本6.0.0-kali3-amd64,编译Linux内核驱动ko文件

2023-01-02 20:37:11 2058

原创 x64(win10) KPTI 内核页表隔离机制

Windows10 x64 内核页表隔离机制(KPTI)【实验】

2022-06-27 09:23:41 1048 7

原创 DuiLib Menu 右键菜单消息响应简单实现

DuiLib Menu 右键菜单消息响应简单实现

2022-02-15 19:38:57 682

原创 DuiLib msg 消息类型

DuiLib msg 消息类型

2022-02-07 18:04:48 193

原创 APC初始化 —— 逆向分析 KeInitializeApc

简介操作系统想要实现对正在执行的线程的管理,就要通过 APC 机制实现,即向目标线程的 APC 队列中插入 _KAPC ,以实现对该线程的管理(如挂起、终止)。而向线程插入 APC 就需要先初始化 APC ,在 Windows中使用 KeInitializeApc 函数实现对APC 的初始化。以 PspTerminateThreadByPointer 函数为例,部分重要汇编指令如下:逆向分析KeInitializeApc...

2021-03-19 17:02:37 777

原创 句柄表 ——遍历句柄表实现反调试

简介我们知道,当我们尝试在进程中创建、打开内核对象时,该内核对象的地址会作为句柄项存储在进程的句柄表中。因此,我们可以通过遍历全局句柄表获取操作系统中的全部进程(如 OllyDbg 就实现了进程隐藏,在任务管理器中是无法看到该进程的),然后再遍历每个进程的私有句柄表,检测其私有句柄表中是否存储着被保护进程的内核对象地址 _EPROCESS,就可以得知被保护进程是否被其他进程附加,以达到反调试的目的。当然通过不断将被保护进程的 _EPROCESS.DebugPort 清零,就可以强制实现进程无法被附加调

2021-03-17 15:49:17 755 1

原创 全局句柄表 —— 抹除进程PID

简介进程 PID 是进程的唯一标识,那么如果我们尝试抹除进程的 PID 会发生什么情况呢?本次的测试代码以及关于全局句柄表,可参考全局句柄表 —— 遍历全局句柄表Code驱动程序的关键代码如下:// 该句柄是进程句柄if (!RtlCompareUnicodeString(&pWkPOBJECT_TYPE->Name, &unicode_Process, TRUE)){ DbgPrint("句柄类型: Process, 句柄号: %u.\n", uHand

2021-03-16 21:56:01 718

原创 全局句柄表 —— 遍历全局句柄表

简介进程句柄表是私有的,每个进程都有自己的进程句柄表。除此之外,系统还有一个全局句柄表,全局变量 PspCidTable 指向该表。全局句柄表存储的是操作系统中所有创建的进程、线程的句柄(不会出现重复)。每个进程和线程都有一个唯一的编号:PID 和 CID , 这两个值其实就是全局句柄表中的索引。也就是说,即使我们实现了对进程、线程的断链,但是只要操作系统中创建了进程、线程,全局句柄表中就会记录其对应的句柄(PID/CID),仍然可以通过全局句柄实现对线程、进程的遍历。EnumPspCidTab

2021-03-16 20:58:31 1447 4

原创 时钟中断 (线程切换)—— 逆向分析 KeUpdateRunTime/KiDispatchInterrupt

简介系统时钟可以实现的线程的切换。Windows 系列操作系统的时钟间隔:10 - 20 毫秒,采用 0x30 中断号。在系统时钟下,线程的执行流程:当一个新的线程开始执行时,初始化程序会在 _KTHREAD.Quantum 赋初始值,该值的大小由 _KPROCESS.ThreadQuantum 决定。线程在执行过程中,系统就会调用 KeUpdateRunTime 来记录时间片的使用情况。KiDispatchInterrupt 完成对线程的调度(1)当该线程的时间片耗尽并让出处理

2021-03-14 23:13:55 673

原创 线程切换 ——逆向分析 KiSwapThread

简介在 Windows 内核中,线程的切换是通过 API 函数 KiSwapThread 实现获取将要执行的线程 _KTHREAD 结构体指针,再调用 KiSwapContex/SwapContex 函数实现线程上下文的切换,以实现线程的切换。KiSwapThread/KiSwapContex/SwapContex 直接的调用关系如下:KiSwapThread内核函数 KiSwapThread 的汇编代码分析如下:.text:004050BF ; =============== S U B

2021-03-14 16:16:52 526

原创 线程切换 —— 逆向分析 KiSwapContex/SwapContex

简介在 Windows 内核中,线程的切换是通过底层内核 API 函数 KiSwapContex/SwapContex 实现的。KiSwapContexKiSwapContex 的逆向分析如下:.text:00404828 ; =============== S U B R O U T I N E =======================================.text:00404828.text:00404828.text:00404828 ; __fastcall KiS

2021-03-14 11:09:11 317 5

原创 _ETHREAD断链 —— 实现线程隐藏

简介线程所属的父进程 _EPROCESS 结构体中的 ThreadListHead 成员是当前进程中所有线程的双向链表头,该成员有两个,分别在 0x50 和 0x190 处。我们可以通过该线程链表头进行线程遍历,也可以通过直接遍历 _ETHREAD 结构体中的 ThreadListEntry 成员实现遍历进程中的所有线程,ThreadListEntry 分别位于 0x1b0 和 0x22c 处。我们可以通过 _ETHREAD 的 ThreadListEntry 断链实现线程隐藏。需要注意的是,Threa

2021-03-08 12:42:39 2293

原创 清空 _EPROCESS 结构体中的 DebugPort ,实现进程无法被附加调试

简介在内核 _EPROCESS 中有一个 DebugPort 成员,该成员中存储的是一个内核调试对象地址。当调试器附加进程调试时,操作系统会在内核中创建一个调试对象,并将调试对象的地址写入对应被调试进程的 _EPROCESS 结构体中的 DebugPort 成员中,用于实现调试器与被调试进程之间建立联系。而清空该地址时,调试器将会与被调试进程之间失去关联,即无法继续调试该进程。如果调试器重复多次发起调试请求,操作系统将会重复将调试对象的地址写入被调试进程。如果只将 DebugPort 清空一次,依然会

2021-03-07 11:43:26 661

原创 _EPROCESS断链 —— 实现进程内核隐藏

我们可以利用 _EPROCESS 结构体中的 ActiveProcessLinks 双向链表遍历进系统中的进程,并将特定进程从该双向链表中移除,以达到隐藏特定进程的目的。_EPROCESS_EPROCESS 结构体是内核用于管理和维护进程的结构体,每个进程都会有一个属于自己的结构体。同一个程序创建了多个进程,其就会有对应个数的 _EPROCESS 。_EPROCESS 的结构如下:kd> dt _EPROCESSnt!_EPROCESS +0x000 Pcb

2021-03-06 19:35:07 2287 5

原创 SSDT Hook (HookZwTerminateProcess)—— 实现任务管理器无法关闭进程

本节的目的是通过驱动程序修改 ntoskrnl.exe 程序的 SSDT 表中的函数地址表,以实现 SSDT Hook 。本次的测试函数为 R3 API 函数 ZwTerminateProcess ,通过 Hook 该函数,以实现任务管理器无法强制关闭进程,只有通过进程的关闭方法才可以正常结束进程。Hook 该函数的关键是判断 ZwTerminateProcess 函数中的进程句柄 hProcess 。当进程是通过自身的关闭方法关闭的话,该句柄的值应为 0xffffffff 或 0x00 ,而通过其他进

2021-03-06 15:03:59 571

原创 R0-R3 现场保护(_KTrap_Frame/_KPCR/_ETHREAD)—— 分析内核函数KiSystemService

简介在进程由用户态进入内核态的过程中,发生了 ESP/SS/EIP/CS 的切换。因此,在进程权限切换的工程中,必然要进行寄存器的现场保护。这里,要使用到3个内核结构体:_KTrap_Frame/_KPCR/_ETHREAD。_KTrap_Frame每个线程在内核中都有一个 _KTrap_Frame 结构体,用于操作系统对线程的管理,该结构体时操作系统进行维护的。_KTrap_Frame 的结构如下:kd> dt _KTrap_Frame nt!_KTRAP_FRAME //调

2021-03-05 14:22:03 1106

原创 R3-R0 系统调用(快速调用与中断门)

简介我们知道,通过驱动程序可以实现从用户态进入内核态。而操作系统的 API 函数可以实现进入内核态,那么这是如何实现的呢?操作系统定义了一个用户程序和内核程序都可以访问的一个结构 _KUSER_SHARED_DATA ,而用户态下的该结构和内核态下的该结构都指向同一个物理内存。操作系统通过初始化该结构体,以实现 API 函数直接 call 该结构体下的 SystemCall 中的函数地址( KiFastSystemCall 或 KiIntSystemCall 函数),以实现从用户态进入内核态。_KU

2021-03-03 14:42:05 1022

原创 进程通信——DLL共享节

简介我们可以在 Dll 中申请一个共享节,当进程加载该 Dll 文件后,不同进程都可以实现对该共享节内存的读写,以此实现进程间的数据共享。其中,共享节的申请方式如下:#pragma data_seg(".shared")/* 全局变量, 必须初始化 */#pragma data_seg()#pragma comment(linker,"/section:.shared,rws") // 声明该共享节的属性//也可以使用以下方式定义全局变量, 必须初始化//__declspec(allocat

2021-03-01 10:57:11 383

原创 进程通信——管道

匿名管道我们可以通过创建匿名管道实现进程间的通信,但是进程间的通信方式是建立在父进程与子进程的关系上。测试代码如下:父进程#include <windows.h>#include <stdio.h>int main(){ HANDLE hRead; HANDLE hWrite; CHAR szBuff[100] = {0}; SECURITY_ATTRIBUTES sa;

2021-03-01 10:50:34 86 3

原创 进程通信——共享内存

我们可以通过 CreateFileMapping 申请一块共享内存,并通过 MapViewOfFile 函数将共享内存对象映射进进程的内存空间,以实现进程间的消息通信。BOOL CreateSharedMemory(){ //创建FileMapping对象 hMapObject = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x1000,TEXT("shared")); if(!hMapObj

2021-03-01 10:45:19 68

原创 进程通信——自定义消息

简介对于 Windows 程序而言,其工作机制是基于消息基址实现的,而且系统会有一个系统消息队列用于接收所有进程的消息,通过窗口(控件)句柄分发给特定的进程。因此,我们可以通过消息机制,向特定进程发送消息,以实现进程间的通信。但是,当我们通过句柄向特定进程发送系统定义的消息时, 目标进程中可能存在该消息的处理函数,其处理函数的逻辑必然与我们想要实现的不同,这同样无法达到我们的目的。因此,我们可以通过自定义消息,这样就可以避免被目标进程按照其原本的逻辑处理。我们可以通过 Windows AIP 函数向目

2021-03-01 10:41:04 404 1

原创 进程函数监控项目

简介该项目的目的是向特定进程中注入DLL,实现对目标进程中的特定函数进行监控,可以实现的特定函数的Hook(获取该函数的参数,不影响该函数的正常执行)、以及远程调用。该项目的进程间通信是通过 DLL 共享节实现的。该项目存在的缺点:无法直接通过 DLL 中的函数获取被注入进程中的自定义函数地址(程序编写者自己写的函数地址),只能使用地址数值进行 InlineHook 和远程调用。IATHook、InlineHooK、远程函数调用,由于无法知道函数的参数个数和类型,只能对特定函数进行Hook,

2021-02-28 18:47:19 284

原创 Inline Hook

所谓 InlineHook 的本质就是添加或修改程序函数中的汇编指令(如 jmp、call 指令),以实现程序逻辑改变造成跳转,即 Shellcode 注入。当执行完目标函数后,在将程序 EIP 跳转后原代码处,以避免影响原程序的正常功能。需要注意的是,当程序开始在操作系统中加载运行时,其不同段的属性已经被设置,如代码段为可读可执行但不可写,而数据段则只允许读写而不允许执行等。需要通过 API 函数 VirtualProtect 将目标代码段的属性设置为可读可写可执行,才能实现修改进程代码段,否则写命令将

2021-02-21 19:06:21 126

原创 IAT Hook

在程序执行前,PE 中的 IAT 表中存储的是指向函数的函数名;当程序真正加载时,操作系统才会将函数地址更新并修改 IAT 表,此时的 IAT 表中存储的是函数的地址。由于 dll 程序加载时,可能存在其加载地址和 ImageBase 不同,而且并不是 dll 中所有的函数都会被使用。因此,指在函数被调用时更新其函数地址,更加高效和安全。IAT Hook 的思想就是,将 IAT 表中的函数地址进行修改,指向我们自己编写的函数地址。我们在自己编写的函数中再调用被篡改的函数,以实现该程序功能的正常实现。我们可

2021-02-21 14:30:25 175

空空如也

空空如也

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

TA关注的人

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