欢迎加入我的知识星球,目前正在更新免杀相关的东西,129/永久,每100人加29,每周更新2-3篇上千字PDF文档。文档中会详细描述。目前已更新65+ PDF文档
加好友备注(星球)!!!
介绍
代码注入是一种将恶意代码注入目标进程内存并在目标进程的上下文中执行的技术,也称之为进程注入,攻击者可以通过代码注入技术,将其恶意代码插入到目标进程中,比如explorer.exe
或svchost.exe
等等,并在目标进程中运行这些恶意代码。
一般攻击者会选择合法的系统进程作为目标进程以掩盖恶意活动,恶意代码注入到目标进程的内存后,可以执行各种恶意的操作。
注入的代码可能是一个模块,比如EXE
文件,动态链接库DLL
或者直接的shellcode
,一旦代码被注入到远程进程中,那么攻击者就可以执行以下的一些操作了。
-
强制执行恶意代码: 攻击者可以强制远程进程执行注入的代码,并将远程进程的API调用重定向到该模块中的恶意函数,恶意函数可以拦截API调用的输入参数,同时过滤输出参数,篡改正常功能。
-
攻击者可以强制远程进程执行注入的代码,进行恶意操作,例如下载额外的文件或记录键盘输入(键盘记录)。
-
向已经运行的进程注入代码,允许攻击者在系统中持久化存在,增强恶意软件的隐蔽性。
-
注入代码到可信的进程,例如系统进程之后,攻击者可以绕过安全产品,并隐藏其恶意行为,使用户难以察觉。
进程内存
在windows操作系统中,每当创建一个新的进程时,系统都会为该进程分配一个独立的,私有的内存地址空间,这被称之为进程内存。
每一个进程内存都有自己专属的内存地址空间,这个地址空间与其他进程隔离,确保一个进程不会直接影响到另外一个进程的内存,这意味着如果A进程崩溃了,是不会影响B进程的。
进程内存实际上是虚拟内存的一部分,虚拟内存并非是真实的物理内存,而是由操作系统的内存管理器创建的一种假象
。通过虚拟内存,操作系统可以将其有限的物理内存映射到更大的地址空间,从而支持更多的程序运行。
Shellcode注入
恶意软件直接注入到目标进程的内存中,而不需要将相关组件写入磁盘,攻击者一般通过CreateRemoteThread
函数来创建一个远程线程,然后将新线程的起始地址指向注入代码块中的代码或函数。这种方法的优势在于恶意进程无需将恶意DLL文件写入到磁盘中,恶意软件可以直接从二进制文件的资源段(.rdata
)读取,或者通过网络获取并直接进行代码注入。
其实shellcode注入很简单,一般都是通过VirtualAllocEx
函数在远程进程中申请一块内存,然后通过WriteProcessMemory
函数将其shellcode
写入到目标进程的内存中,再去通过VirtualProtect
将其远程进程中的内存更改为可读可写可执行的权限,最后通过CreateRemoteThread
函数来创建一个远程线程,将新线程的起始地址指向shellcode
或函数。
首先第一步肯定是需要枚举进程的,枚举进程很简单,无非就是创建进程快照,然后遍历,判断传递进来的进程名是否是一样的,然后通过OpenProcess
函数来获取到该进程句柄。
如下图我们可以看到现在已经将shellcode
写入到目标进程中了。
最后通过CreateRemoteThread
函数创建线程去执行。
现在让我们将其恶意文件拉到IDA
中查看。我们可以在导入的函数中看到了OpenProcess
函数,VirtualAllocEx
函数。以及CreateRemoteThread
函数。这些函数都是用于进程注入的。
我们可以双击OpenProcess
函数,然后右键->Jump to...或直接按下x键,来到调用该函数的地方。
前面的三个push
是调用OpenProcess
函数之前需要传递的参数。
我们需要在VirtualAllocEx
函数这里也去下一个断点。
在CreateRemoteThread
函数以及WriteProcessMemory
函数这里下一个断点。
现在让我们来调试一下,这里首先把notepad.exe
进程打开,然后在IDA
这里按下debugger
即可。
从压入到栈中的参数可以得知,这个恶意文件注入的目标进程是notepad.exe
这个进程。
现在我们来看看恶意软件的下一步应该就是申请远程进程中的内存了。如下图是调用了VirtualAllocEx
函数所申请的远程进程内存,这里调用完VirtualAllocEx
函数之后的返回值会存储在EAX
寄存器中。这里EAX
寄存器的值为0xB670000
,我们在Process Hacker
中也可以直接查看。
那么申请完内存之后,恶意软件会通过WriteProcessMemory
函数将shellcode
写入到目标进程内存中。我们再来观察内存可以看到,shellcode
已经被写入了。
紧接着恶意软件通过调用VirtualProtect
函数将其远程进程内存更改为可读可写可执行的权限。
在接着就是创建远程线程去执行shellcode
了,将线程的起始地址指向shellcode
的地址。这里主要我们需要查看lpStartAddress
参数,这里是push eax
,将eax
寄存器中的值压入到栈中,为调用CreateRemoteThread
函数参数做准备,这里eax
寄存器中的值其实就是我们前面申请远程进程内存的地址,也就是shellcode
的地址。
本次就到这里 期待和您的下次相遇!!!!
原文始发于微信公众号(Relay学安全):恶意软件分析-代码注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论