直接系统调用 VS 间接系统调用
前言上文中我们讲述了直接系统调用技术,它可以不使用ntdll中的Syscall(系统调用)指令,自己在代码中实现、用以绕过针对ntdll中函数的hook,特点是Syscall指令在程序自身的内存空间中,而不是ntdll的内存空间中,由此,AV/EDR也有了相应的检测机制,如果发现Syscall指令不在ntdll内存空间中,则将其视为可疑的IoC,攻击者为了消除这个IoC,间接系统调用技术在此背景下诞生
本文主要讲述间接系统调用,先回顾一下用户模式API Hook,然后是直接系统调用的实现细节,最后将直接系统调用改为间接系统调用,并分析二者的区别,并在文末介绍间接系统调用的一些限制
用户模式API Hook用户模式API Hook让EDR能够动态审查Windows API,多数EDR会使用Inline Hook(内联Hook),在内存中插入jmp指令,使程序执行流程进入EDR的hooking.dll
当EDR研判当前Windows API不是恶意的,会跳转回ntdll.dll,并执行Syscall继续进入内核,如果研判当前Windows API是恶意的,则会终止执行
直接系统调用躲避E ...
直接系统调用之从上层API到下层API的旅程
前言各家安全厂商基本都实现了用户模式Hook,简单说就是恶意软件使用Windows API时,被安全厂商重定向到它自己的Hooking.dll,然后进一步分析,如果研判代码没有恶意行为则放行,如果研判代码有恶意行为则拦截,这促使攻击者使用了新的技术,例如Unhooking、直接系统调用、间接系统调用、等等
本文主要介绍直接系统调用,并介绍如何在Visual Studio中通过C++创建一个使用直接系统调用的Loader,我会先用Win32 API写一个Loader,然后Win32被替换为直接系统调用
直接系统调用技术已经诞生好几年,不是一个新技术,本文中我想重新回顾一下这个话题,探讨一下直接系统调用涉及的知识,以及如何实现基于它的Loader,并使用诸如API Monitor、Dumpbin和x64dbg等工具来分析这个Loader,例如,查看Loader是否正确导入Windows API,以及Syscall在PE结构的哪个节区执行
什么是系统调用系统调用英文System Call,简称Syscall,单纯讲系统调用概念是什么,对初学者来说可能不太好理解,我们通过一个例子来说明,用户模 ...
高级进程注入之利用线程名和APC(下)
前言书接上文,高级进程注入之利用线程名和APC(上)
上文中已经介绍了相关的API,本文会讲述利用线程名实现注入的细节,相比较传统的进程注入需要创建线程,这是一个不需要创建线程的新技术
介绍通常,向一个进程的内存写入内容需要我们在打开进程句柄时带有写权限,也就是PROCESS_VM_WRITE,https://learn.microsoft.com/en-us/windows/win32/procthread/process-security-and-access-rights但这可能被AV/EDR视为可疑指标,利用线程名注入允许我们无需写权限实现远程写入
我们需要的权限如下
1234567891011HANDLE open_process(DWORD processId, bool isCreateThread){    DWORD access = PROCESS_QUERY_LIMITED_INFORMATION // 想要读取远程进程的PEB地址,需要这个权限,后文会提到        | PROCESS_VM_READ                         ...
高级进程注入之利用线程名和APC(上)
前言进程注入是攻击方武器库中最重要的技术之一,本文将会介绍如何使用线程描述相关的API实现绕过AV/EDR的进程注入,最后会提供相应的检测方式。(线程描述相关的API,线程描述和线程名是一个意思)
进程注入是高级恶意软件中一定会使用的技术,它的用途包括:1、AV/EDR躲避:隐藏恶意代码在一个合法的进程中2、操作现有进程:经典的就是lsass进程的dump3、权限提升
由于读取现有进程的内存危害很大,所以各种AV/EDR都会重点监控并阻止这个行为,不过监控也是基于已知的技术,一旦有未知技术,AV/EDR将很难监控,这本质是一个猫鼠游戏,并且永远不会结束。攻击方一直在尝试使用新技术躲避检测,比如在2016年FortiGuard Labs公开的原子爆炸技术,它使用原子表传递代码到远程进程中,再比如2023年SafeBreach公开的池聚会技术,线程池被滥用在远程进程的上下文执行代码,想了解各种注入技术,可以查看2019年BlackHat UAS中分享的Windows Process Injection in 2019
本文要介绍的技术称之为“线程名调用”,这项技术允许植入shellcode ...
APC系列之用户模式APC
前言这个系列的目的是希望你能系统的理解APC的内部原理(不再是零散的理解)
我重构了用户模式和内核模式下APC相关的函数,希望更好的理解APC机制,在文章的最后会分享源码
在这个系列中,我将探讨下面的主题1、用户模式下APC的使用2、内核模式下APC的使用3、用户模式下APC内部原理4、内核模式下APC内部原理5、“Alerts”的概念以及它和APC的关系6、APC在Wow64中的应用7、如何在用户模式和内核模式下干扰微软对APC的ETW监控8、如何使用APC安全的卸载一个驱动程序9、像Procmon和Process Hacker这类安全工具如何利用APC10、CET(用于检测ROP的CPU Shadow Stack)如何影响APC11、关于APC机制有文档的源代码12、关于APC的逆向工程练习13、接下来文章中的惊喜
本文是系列的第一篇文章,讲述用户模式下APC,是这个系列中相对简单的部分,文中我将一边讲解,一边分享代码
APC介绍APC全称Asynchronous Procedure Call,译为“异步过程调用”,是Windows中使用的一种机制,这种机制的核心是一个队列,通常称 ...
Windows下32位汇编学习(二)PE文件解析
引言想开发反病毒引擎,第一步总是对PE文件进行解析,虽然有点落伍,但这是基础,想开发病毒也同理,很多的病毒样本在使用Indirect Syscall + 调用栈欺骗前,都需要动态调用API,这个时候就需要你了解PE文件的结构,通过解析PE文件找到IAT,进而找到PEB来动态获取地址,所以不想学也得学~
本文会介绍从书中学到的部分知识,以及通过C++和汇编分别实现一个PE文件解析器
本篇博客的学习参考罗云彬老师的《Windows环境下32位汇编语言程序设计》,尤其是第17章的“PE文件”
正文借用一下罗云彬老师的图,PE文件从文件头到文件尾依次是:DOS部分、PE头、节表、节数据DOS部分:包括DOS标识和DOS代码,为了兼容DOS系统而保留的部分PE头:包括PE标识、PE头、PE可选头节表:下面节数据的起始位置、大小节数据:就是代码段、数据段上面是用通俗的语言描述,在代码中是下面的样子  
DOS部分12345IMAGE_DOS_HEADER {    e_magic    2字节    // DOS标识    ...    e_lfanew    4字节    // PE头 ...
通过APC执行Shellcode
前言本篇博客主要介绍APC是什么、APC函数何时被执行,不会包含太多深层次的分析,主要是介绍APC如何被用来执行shellcode
APC介绍APC,全称Asynchronous Procedure Calls,译为异步过程调用,在Windows下是一种机制(我猜测在其他操作系统下也是类似的机制),允许异步执行函数,所谓的异步执行,指的是当前线程执行过程中,有一个异步执行任务,当前线程无需等待这个异步执行任务,可以继续执行,相对应的,同步执行,指的是当前线程执行过程中,有一个同步执行任务,当前线程需要等待这个同步执行任务,无法继续执行,同步执行的结果当场就返回了,异步执行的结果是通过一个回调机制返回
Windows中关于APC的一个重要特点是,只有线程处于警报状态时,线程APC队列中的APC函数才会执行,通过调用SleepEx()、WaitForSingleObjectEx()、SignalObjectAndWaitEx()、SignalObjectAndWait()、WaitForMultipleObjectsEx()可以让线程处于警报状态
Windows中的APC包含多种类型,也分 ...
回调函数
恶意的Loader和PIS(Position-Independent Shellcode)会使用各种技术来绕过AV/EDR和安全人员的分析,其中代码执行这个环节经常会通过“回调函数”的方式来隐蔽的执行。回调的本质是将函数A的地址传给函数B,在函数B执行的过程中,触发某个条件后,停下来执行函数A
回调分为异步的和同步的
异步的回调例如,鼠标移动时,对应的Hook被触发,Hook处理的同时,鼠标继续移动
同步的回调例如,函数A要读取数据B,触发某个条件后,函数C修改数据B,然后函数A继续读取数据B
下面是一个回调函数的示例
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475#include <windows.h>// 声明窗口过程回调函数,用于处理窗口消息LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg ...
一次简单的钓鱼分析之FTP执行LNK
01 引言吾爱上看到一篇病毒分析文章,初步看了一眼像是FTP执行LNK的方式,早在2022年甚至更早就公开的技术了,好像24年HVV期间用来社工钓鱼还火过一阵,借着这个机会学习记录一下原文地址:https://www.52pojie.cn/thread-2054571-1-1.html
02 正文FTP的交互式命令行中,可以通过!的方式执行命令,如下图还有一个命令行选项-s,可以批量执行某个文件中的命令,如下图
下面是钓鱼样本中的部分命令,在注释中有详细解释
123456789101112131415161718192021222324252627282930313233343536373839404142# copy /Y                       目的路径有同名文件时,不提示直接覆盖# "_\_\_\_\_\_\_\_\doc\*.*"     恶意攻击者刻意构造的多级目录,每级目录的名字都为_# >nul                          正常copy一个文件,cmd会有输出,移动了哪些文件,此命令屏蔽这些输出!call ...
“WorstFit”学习
前言翻推特时看到Orange的一篇文章:“WorstFit: Unveiling Hidden Transformers in Windows ANSI!”,被标题吸引点进去看看,仔细研读后发现,文章展现了一个新的攻击面,漏洞很精彩。由于时间有限这里只做一个简单的学习笔记。文中甚至揭露了ElFinder在Windows下的一个后台RCE 0day(ElFinder是一款开源的基于PHP的Web文件管理系统)
原文链接:https://blog.orange.tw/posts/2025-01-worstfit-unveiling-hidden-transformers-in-windows-ansi/
漏洞背景知识点1Windows最初用的字符集是ANSI,后来扩展到Unicode字符集,但Windows承诺永远向后兼容,所以现在仍然兼容ANSI字符集。兼容ANSI字符集的方式是,内部有一个API RtlUnicodeStringToAnsiString(或者WideCharToMultiByte)将Unicode字符转换为ANSI字符。我们都知道,Windows下的GetCurrent ...
