免杀——Session0注入
Session0注入什么是Session?Windows将应用程序根据Windows账户分为了多个Session,比如:Administor打开的进程可能属于Session1,而另一个账户Civilian打开的进程就属于Session2。
系统中还存在一种特殊的Session,那就是Windows服务进程,它属于Session0。在在Windows Vista及以后的操作系统中,服务进程无法再与用户进程有交互式操作,也就是Windows服务里无法打开带有UI界面的程序。因此就存在了Session隔离问题。
为什么要注入Session0?在 Session 0 中运行的大多数进程是以 SYSTEM 权限运行的,而普通用户级别的权限(即使是管理员权限)并不能轻易影响或监控 SYSTEM 权限下的进程。
杀软一般不会在系统服务中直接进行杀毒操作,或者对 SYSTEM 权限进程进行强制结束,因为这样做有可能导致系统不稳定或崩溃。因此,如果恶意代码能够成功注入到 Session 0,它可以依托 SYSTEM 权限来规避杀软的检测和干预。
如何注入Session 0的系统进程? 利用ZwCrea ...
免杀——Loader编写
免杀——LoaderLoader的定义Loader 在恶意软件和渗透测试中指的是用于将恶意代码(如 Shellcode、DLL 或其他恶意文件)加载并执行的程序或模块。Loader 的主要任务是帮助攻击者或测试人员将注入目标进程或系统环境中的恶意代码触发其执行。
Loader的大致思路
分配内存:使用 VirtualAlloc 或其他 API 在目标进程中分配内存,并设置适当的执行权限(如 PAGE_EXECUTE_READWRITE)。
写入代码:将 Shellcode、恶意 DLL、或其他代码写入刚分配的内存中。
执行代码:使用 CreateRemoteThread、EnumFontsW 回调、NtQueueApcThread 等方法来启动恶意代码的执行。
清除痕迹(可选):有些 Loader 还会在执行代码后清理其在目标系统上的痕迹,避免被检测到。
一些Demo:指针执行12345678int main(){ unsigned char buf[] = "shellcode"; void* exec = VirtualAlloc(0, sizeo ...
PE
用010Editor解析PE头首先打开模板
然后按 Alt + 4 即可
效果如图
PE头
以上是参考图
1.DOS部分1234567typedef struct _IMAE_DOS_HEADER// 偏移, 意义{ WORD e_magic; // 0x00, 'MZ'(0x5A4D)标识 ......中间成员为兼容16位操作系统,可修改可忽略...... LONG e_lfanew; // 0x3C, PE头的起始地址,默认0xB0处} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
1.WORD e_magic(0x00处)● 对应PE文件的开头,是PE文件DOS头的标识符”MZ”→0x5A4D ○ 对应Winnt.h头文件中宏定义: #define IMAGE_DOS_SIGNATURE 0x4D5A // MZ2.LONG e_lfanew(0x3C处)● 对应PE文件0x3C处指向NT头 ...
无模块注入Dll器项目(安全启动线程版)
无模块注入Dll器项目(安全启动线程版)项目介绍无模块注入DLL器是一个用于将动态链接库(DLL)注入到目标进程的工具。与传统DLL注入器不同,它不通过加载整个DLL模块的方式来实现注入,而是采用内存映射等技术直接将DLL的代码映射到目标进程中执行。该项目的目标是实现一个高效、隐蔽的注入方式,以绕过某些防护机制和检测。
而且与其他Dll注入器不同的是,注入后,是选择了劫持已知线程入口点起的线程,这样能够更有效地避免被检测
小小的局限:
分为32位和64位版本,32位版本只能注入32位dll,64位只能注射64位dll,太懒了哎,宏定义懒得写
另外路径名不支持中文,懒得改了呜呜
主要函数分析:修复重定位表
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455// 修复重定位表VOID RepairFixReloc( DWORD NewImageBase){ DWORD Oep = pNtHeader->OptionalHe ...
x86 C++逆向分析
C++逆向关于Typora插入视频的方法:
Typora视频无法正常显示与mp4格式 - elmagnifico’s blog
直接下载一个格式工厂,然后转一下就行
因为MP4里面又有很多编码,可能Typora不支持
输出配置将 视频编码 改为 AVC(H264)即可,这样qq录屏下来的MP4就可以直接插入Typora了
结构体和类结构体和类 都有构造函数,析构函数,和成员函数,两者的区别只有一个,结构体的访问控制默认为public,类的默认访问控制是private。
值得注意的是,在c++中所谓的private,public,protected都是c++编译器在编译的时候检查的,在实际编译的时候并没有多加什么,也就是说,加这些修饰是给编译器看的,看能否通过。编译成功后,程序在执行过程中不会对访问控制方面又再多检查和限制
结构体大小:首先要解决的是对齐问题:
结构体对齐值编译器可以设置:
当然也可以手动设置
123456789#pragma pack(push) //保存push指令之前的对齐状态#pragma pack(8) //设置对齐值为8字节struct Ve ...
Windows x64内核(7)——强制关闭进程
Windows x64内核强制关闭进程在用户模式下平时想关闭一些软件一般可以在windows自带的任务管理器关闭,但是某些进程,例如安全软件,或者某些病毒,这些权限比较高在内核态,就删不掉。所以我们就需要在内核驱动将其杀死
常见的有三种方法:
1.标准方法就是使用ZwOpenProcess打开进程获得句柄,然后使用ZwTerminateProcess这个内核API实现结束进程,最后使用ZwClose关闭句柄。
2.第二种方法,通过动态定位的方式找到PspTerminateThreadByPointer这个内核函数地址,然后调用该函数结束掉进程中所有的线程,当线程为空则进程也就消亡了。
3.第三种方法,我将其称作是内存清零法,其核心原理是通过打开进程,得到进程的基址,通过内存填充的方式将对端内存全部置0实现类似于结束的效果。
优缺点讲讲这三个的优缺点:
ZwTerminateProcess:
安全性高:这种方法是标准的、合法的内核API调用,不涉及系统内存的非法操作或直接修改内核结构,减少了系统不稳定的风险。 兼容性好:适用于大多数系统和硬件平台,使用的是微软公开的API。
但是! ...
Windows x64内核(6)——遍历进程
Windows x64进程隐藏:断开进程活动链,抹除全局句柄表自己的内容,修改EPROCESS的PID貌似也行……(未完待续)
通过进程活动链偏移是从内核.exe查出来的,多少有点拙劣,不是很想用API,怕Hook
123456789101112131415VOID Traversal_Process(){ PEPROCESS currentProcess = PsGetCurrentProcess(); PLIST_ENTRY currentEntry = (PLIST_ENTRY)((ULONG_PTR)currentProcess + 0x188); // ActiveProcessLinks 的偏移量,WinDbg找出来的 PLIST_ENTRY Temp_PList_Entry = currentEntry->Flink; CHAR* FileName = *(CHAR**)((ULONG64)currentProcess + 0x2e0); KdPrint(("进程:%s\n", FileName)); ...
Windows x64内核(5)——过滤驱动
过滤驱动代码例子来源: Win驱动9]Windows分层驱动_windows分层驱动程序 数据-CSDN博客
过滤驱动是一种独立的驱动程序,直接插入内核驱动栈中,拦截并处理驱动程序之间的数据传输。它可以拦截底层的I/O请求,并在不改变原始请求的情况下,修改、延迟或直接处理这些请求。
过滤驱动:位于设备驱动程序堆栈的上层,负责拦截、修改和处理 I/O 请求或响应,并可能将其转发给目标驱动。
目标驱动:位于设备驱动程序堆栈的下层,直接与硬件交互,处理实际的 I/O 操作。
和注册回调的区别:过滤驱动运行在内核模式下的驱动栈中,拦截并处理I/O请求;回调函数则在某些事件发生时被内核或应用调用,可能在用户模式或内核模式下运行。过滤驱动可以拦截设备级的I/O请求(如文件读写、网络包),而回调函数通常处理系统事件(如进程创建、线程创建、加载模块等)。过滤驱动适合用于文件系统、网络、设备的深度控制和拦截;回调函数则用于监控和响应特定的系统事件,例如进程管理、内存分配等。
最重要的是:这玩意贼稳定,受微软支持的,想附加就附加
当请求完成的时候,会 ...
Windows x64内核(4)——回调函数
Windows x64内核x64内核的回调函数因为x64再想要去Hook例如各种门,SSDT表之类的重要数据结构变得异常困难
为了在内核模式下提供合法的扩展和拦截机制,微软提供了许多回调函数,这些回调允许驱动开发者在特定事件发生时执行自定义代码,而不必直接修改关键的内核数据结构。
还有一点,如果没有加载数字签名,调用以下API可能会报错,我们需要在编译选项加一些东西:/INTEGRITYCHECK
进程监控
API: PsSetCreateProcessNotifyRoutine / PsSetCreateProcessNotifyRoutineEx
描述:
PsSetCreateProcessNotifyRoutine:注册一个回调函数,当进程创建或终止时,系统会调用此回调函数。该函数已被PsSetCreateProcessNotifyRoutineEx替代。
PsSetCreateProcessNotifyRoutineEx:与前者类似,但提供了更多信息,如父进程ID、命令行参数等。
具体代码,用于检测任何进程的创建与卸载
12345678910111213 ...
Windows x64内核(3)——分页机制
Windows x64内核9-9-9-9-12分页机制介绍之前我们学过的x86用的是2-9-9-12和10-10-12的分页机制
x64下,分页大小有4K,2M,1G的大小
如果PDE的PS位为0,则为4K,为1则为2M
如果PDPTE 的PS=1的话,指向 1GB 页
x64下,4k分页变成了9-9-9-9-12的分页机制
虽然64位下的地址有64位,但是实际用到的只有48位,这主要因为以下原因:
当前需求有限:
管理复杂度:
使用完整的 64 位地址空间将引入极大的管理和硬件复杂性。
页表大小和效率:
使用四级页表(9-9-9-9-12 分级结构)能够有效管理 48 位的虚拟地址空间。使用更多位数意味着增加页表层级,可能需要五级或更多级页表,这会带来额外的内存和性能开销。当前四级页表架构已经能够高效地处理 48 位地址,而无需增加复杂性。
我们来依次解析下每一个数字的含义:
PML4(Page Map Level 4):页目录指针表
在windows叫PXE
最高的页表层级,用 9 位来索引 PML4 表项。PML4 表最多可以有 512 个条 ...