免杀——VAD树
VAD树前面说的进程隐藏,模块隐藏
但是这个是骗不了例如PCHunter这种软件的
这是因为这种软件用了别的方法去遍历进程和模块
Vad树介绍 VAD(Virtual Address Descriptor)树是Windows操作系统用来管理进程的虚拟内存区域(memory regions)的一种数据结构。它以平衡二叉树(通常是自平衡的AVL树)的形式存在,存储了一个进程中所有的虚拟地址范围(内存区域)。这些虚拟地址区域包含了进程所使用的内存,比如模块加载的内存、堆、栈等。
为了隐藏进程,常见的技术就是断开活动进程链 ,虽然这种方法能够从用户态视角隐藏进程,但它并没有改变内存管理系统和其他内核结构中的信息,进程仍然在系统的其他地方可见。
每一个进程(EPROCESS)都有Vadroot结构,这保存着Vad树的根节点
用windbg可以自动解析Vad树
1!vad [addr]
关于内存的Private,Mapped属性我们可以看到,解析出来的属性里面,内存类别有Mapped,还有Private,只是什么东西?
在windows内存管理里面,只有两种属性,分别是 Private ...
免杀——线程进程隐藏
线程进程隐藏三环TEB/PEBx64下,每个线程都有一个TEB结构来存储线程的一些属性结构,gs:[0x30]寄存器在ring3指向TEB结构,
在0x60的偏移,有一个_PEB结构,PEB就是进程用来记录自己信息的一个结构
在PEB +0x18的位置有一个_PEB_LDR_DATA结构
就会发现有三个链表
链表是这个结构,可以通过这三个链表,遍历到所有模块
因此我们就可以在三环断链来隐藏模块
我们知道如果要枚举模块一般都是使 用 CreateToolhelp32Snapshot 拍摄快照,然后找到模块列表之后进行遍历,其实api也是通过找 _PEB_LDR_DATA 这个结构来获取程序有哪些模块,那么我们如果想隐藏某个dll,就可以通过修改这几 个双向链表的方法来进行隐藏
三环断链代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 ...
APC机制与注入
APC机制与注入APC机制:APC,全称为Asynchronous Procedure Call,即异步过程调用,是指函数在特定线程中被异步执行,在操作系统中,APC是一种并发机制
当使用 CreateThread 创建一个线程时,需要指定一个线程回调函数(入口函数),这是这个线程的主执行体。但是,APC是一个额外的机制,可以在不干扰该线程主任务的情况下,让该线程处理其他的异步操作。
通过APC,你可以在已经运行的线程中插入额外的操作,而不需要创建新的线程。线程会在某些合适的时刻处理APC请求,比如进入等待状态时。
用户模式下的 APC 需要线程主动进入等待状态或调用一些特定的函数才能触发其执行。这意味着线程必须进入某些特殊的状态才能执行 APC,比如调用以下这些函数时:
SleepEx
WaitForSingleObjectEx
WaitForMultipleObjectsEx
这些函数的特点是它们都有一个参数允许线程可被中断以执行 APC,即通过传递 TRUE 给它们的 “alertable” 参数。
如果线程一直在循环
在这种情况下,如果线程只是忙于执行一个循环任务,并且不 ...
免杀——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)); ...