二进制安全注入技术

这里的注入和sql注入不一样。

这里的注入是将自己写好的代码到别的进程中去运行,然后别的进制运行之后也会运行自己写的代码。

这个就是基本的注入的想法。

进程注入式一种广泛用于恶意软件和无文件攻击中的逃避技术。详细内容可以看下文。

https://www.freebuf.com/articles/system/187239.html

CreateRemoteThread和LoadLibrary的DLL注入

这个是进程注入最常见的技术。恶意文件将恶意的动态链接库的路径写入另一个进程的虚拟地址空间,通过再目标进程中创建远程线程来确保远程进程加载它。

image-20230606163826362

  1. CreateRemoteThread注入: CreateRemoteThread是Windows API中的一个函数,它允许在目标进程中创建一个远程线程并在其中执行指定的函数。DLL注入通过以下步骤实现:

    1. 首先,加载目标进程并获得其句柄(handle)。
    2. 使用VirtualAllocEx函数在目标进程中分配一块内存,用于存储DLL的路径或代码。
    3. 使用WriteProcessMemory函数将DLL路径或代码写入目标进程的内存空间。
    4. 使用CreateRemoteThread函数创建一个远程线程,并指定刚才写入的DLL路径或代码作为线程函数。
    5. 远程线程在目标进程中执行,加载指定的DLL,从而实现注入。

    CreateRemoteThread注入技术的优点是简单直接,适用于所有Windows版本。然而,它也有一些缺点,例如被一些安全软件检测到并阻止,以及无法注入具有较高权限的进程。

  2. LoadLibrary注入: LoadLibrary是Windows API中的一个函数,用于加载指定的DLL。LoadLibrary注入通过以下步骤实现:

    1. 打开目标进程并获得其句柄。
    2. 使用VirtualAllocEx函数在目标进程中分配一块内存,用于存储DLL路径。
    3. 使用WriteProcessMemory函数将DLL路径写入目标进程的内存空间。
    4. 使用CreateRemoteThread函数创建一个远程线程,并指定LoadLibrary函数作为线程函数,参数为之前写入的DLL路径。
    5. 远程线程在目标进程中执行LoadLibrary函数,加载指定的DLL。

    LoadLibrary注入技术的优点是相对较稳定,被广泛使用。它也可以用于注入具有较高权限的进程,但需要足够的权限来打开目标进程。然而,它也容易被一些防护机制检测到,并且可能受到64位进程和DLL的限制。

恶意软件首先需要选择被注入的目标进程(比如:svchost.exe),这个可以通过调用应用程序编程接口(API)搜索进程来完成:CreateToolhelp32Snapshot,Process32First,Process32Next

  • CreateToolhelp32Snapshot

是用于枚举指定进程或所有进程的堆或模块状态的API,其会返回一个快照

  • Process32First

会检测有关快照中第一个进程的信息,然后通过循环Process32Next来迭代。找到目标进程后,恶意软件通过调用Openprocess获取目标进程的句柄

如图所示,恶意软件调用VirtualAllocEx来获取写入其DLL路径的空间。然后恶意软件调用WriteProcessMemory再已分配的内存中写入路径。最后,为了让代码在另一个进程中执行,恶意软件作者会调用API,比如CreateRemoteThread,NtCreateThreadEx,RtlCreateUserThread。后俩个并未存在应用记录,但是一般的想法就是将LoadLibrary的地址传递给其中一个API,以便进程不得不代表恶意软件执行DLL。

很多杀毒软件都会追踪和标记CreateRemoteThread,此外,注入也需要磁盘上存在恶意DLL。但这是可以被检测到的。考虑到攻击者最常通过注入代码以逃避检测,所以一些老练的攻击者可能并不会使用这种方法。下面的截图展示了一个叫Rebhip的恶意软件应用了此技术。

image-20230606170628326

这里我就不一一介绍了,可以去看看上面我分享的网址

注入分类解析

远程线程注入DLL

远程注入原理是利用Windows系统中CreateRemoteThread()这个API。

其中第四个参数是准备运行的线程,可将LoadLibrary()填入其中,从而将我们自己准备的DLL加载到远程进程空间中执行

  • CreateRemoteThread():是一个用于再目标进程中创建一个远程线程
1
2
3
4
5
6
7
8
9
HANDLE CreateRemoteThread(
HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
  • 参数说明:

    • hProcess目标进程的句柄
    • lpThreadAttributes这是一个指向SECURITY_ATTRIBUTES结构的指针,用于指定线程的安全性
    • dwStackSize指定线程堆栈的大小,0表示使用默认大小
    • lpStartAddress指向线程函数的指针,表示远程线程的入口点。这个函数在目标进程的执行
    • lpParameter传递给线程函数的参数。可以是任意类型的数据,通常是一个指针
    • dwCreationFlags指定线程的创建标志。通常设置为 0
    • lpThreadId用于接收新创建线程的标识符
  • LoadLibrary():是一个windows API函数,用于加载指定的动态链接库(DLL)并返回它的句柄

1
2
3
HMODULE LoadLibrary(
LPCTSTR lpFileName
);

参数lpFileName是一个字符串,指定要加载的DLL文件路径和名称,可以是绝对路径也可以是相对路径

函数LoadLibrary()将加载指定的DLL文件,并且返回一个模块句柄(HMODULE),该句柄可以用于后续操作,比如去调用DLL中的函数或获取DLL中的导出变量。

选择LoadLibrary函数原因:首先,它可以将一个DLL载入内存空间,并执行DLL初始化函数。第二,LoadLibrary在Kernel32.dll中,Kernel32.dll的加载基址在每一个进程中都是一样的,因此LoadLibrary在每一个进程的地址就是一样的

注意:在DLL中,载入窗口命令,必须使用”对话框方式“比如:载入(窗口1,,真)【啥意思我也不懂】

EIP注入

挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,接着将相关指令机器码和数据拷贝到里面去,接着修改目标进程EIP使其强行跳转到我们拷贝进去的相关机器码位置。

攻击者可以通过恶意注入数据,改变EIP寄存器的值,从而控制程序的执行流程,引发安全问题

EIP注入通常是由于缓冲区溢出或格式化字符串漏洞等引起的。攻击者利用程序中存在的输入验证或内存管理错误,将恶意数据输入到缓冲区或格式化字符串的处理过程中,从而覆盖EIP寄存器的值。

消息钩子注入

原理是利用SetWindowsHookEx()这个API,他能拦截目标进程的消息到指定的DLL中导出的函数,利用这个特性可以将DLL注入到指定进程中

在使用SetWindowsHookEx()之前首先需要将HOOK的DLL加载到本身的进程中,以此得到DLL的模块句柄,在使用GetProcAddress()得到DLL中公开的函数xxx()函数地址,最后遍历出待注入进程的线程ID,这样SetWindowsHookEx()就能够利用这些参数进程HOOK。

注意:消息钩子需要有窗口

用于在操作系统或应用程序中注入恶意代码以拦截、篡改或监视系统消息和事件/

通过消息钩子注入,攻击者可以捕获和操作系统级别的事件,如键盘输入、鼠标操作、窗口消息等。

消息钩子是一种机制,允许应用程序监视和响应操作系统中发生的特定事件。它们通常用于开发辅助工具、键盘记录器、窗口管理等应用程序中。然而,攻击者可以利用消息钩子的特性,将恶意代码注入到目标系统或应用程序中,以执行恶意操作。

消息钩子注入攻击可以导致严重的安全问题,包括窃取敏感信息、劫持用户会话、篡改系统行为等

输入法注入

输入法注入原理是利用Windows系统中在切换输入法需要输入字符时,系统就会将在输入法需要的ime文件装载到当前进程中,而因为这个Ime文件本质上只是一个存放在WINDOWS\system32目录下的特殊的DLL文件,所以可以利用这个特性,在Ime文件中使用IMESetPubString()注入DLL文件

也能够直接编写IME文件在其中使用loadLibray()函数载入注入的DLL文件

输入法注入攻击利用了输入法的特性,将恶意代码注入到目标系统或应用程序中,从而实施各种恶意行为。

输入法注入攻击的方式多样,以下是几种常见的注入方法:

  1. 输入法切换注入:攻击者通过在切换输入法时,利用输入法切换事件注入恶意代码。当用户在不同的输入法之间切换时,恶意代码会被执行。
  2. 输入法消息注入:攻击者通过拦截和篡改输入法发送的系统消息来注入恶意代码。这些消息可能包含键盘输入、鼠标操作和窗口消息等。
  3. 输入法补丁注入:攻击者可以修改输入法的二进制文件,插入恶意代码,并在目标系统上加载和执行被篡改的输入法。

输入法注入攻击可能导致以下安全问题:

  1. 窃取敏感信息:恶意输入法可以记录用户的输入,包括用户名、密码和其他敏感信息。
  2. 键盘记录:输入法注入攻击可以用于记录用户的键盘输入,窃取敏感信息。
  3. 远程命令执行:攻击者可以通过输入法注入,在受感染的系统上执行远程命令或恶意软件。

注册表注入

注册表注入的原理是利用在Windows系统中,当注册表一下键值中存在有DLL文件路径的时候,会跟随EXE文件的启动加载这一个DLL文件路径中的DLL文件。假如遇到有多个DLL文件时,需要用逗号或者空格隔开多个DLL文件的路径

注册表注入攻击通常涉及以下两种方式:

  1. 注册表键值修改:攻击者通过修改现有的注册表键值,将恶意代码路径添加到启动项或其他敏感的注册表键中。这样,恶意代码将在系统启动或特定事件触发时被执行。
  2. 注册表项创建:攻击者创建恶意的注册表项,并将其设置为执行恶意代码的入口。这些注册表项通常与系统自动运行、服务启动等事件关联,以确保恶意代码在合适的时机被执行。

注册表注入攻击可能导致以下安全问题:

  1. 恶意代码执行:通过注册表注入,攻击者可以在系统上执行恶意代码,包括远程命令执行、后门程序等。
  2. 系统行为篡改:攻击者可以修改注册表中的系统配置项,改变系统行为,破坏系统稳定性或降低安全性。

APC注入

APC注入可以让一个线程在它正常的执行路径运行之前执行一些其他的代码,每一个线程都有一个附加的API列队,他们在线程处于可警告的时候才会被处理(WaitForSingObjectEx,SleepEx)

如果程序在线程可警告等待状态时候排入一个APC队列,那么线程将开始执行APC函数,恶意代码则可以设置APC函数抢占可警告等待状态的线程。

APC注入攻击的步骤如下:

  1. 攻击者首先获取目标进程的句柄,通常需要具备足够的权限来打开目标进程。
  2. 攻击者在目标进程中分配一块内存,并将恶意代码写入该内存区域。
  3. 攻击者使用操作系统提供的函数,将恶意代码包装成一个APC对象,并将其插入目标进程的APC队列中。
  4. 当目标进程执行到合适的时机,如发生系统调用、线程切换等,操作系统会检查并调度APC对象执行,从而使恶意代码得以执行。

云里雾里