https://github.com/mhaskar/Shellcode-In-Memory-Decoder
流程
打开一个进程并检索该进程的HANDLE。
在进程中分配空间(检索内存地址)。
将数据(shellcode)写入该进程中。
执行shellcode。
我们可以使用几个Win32 API执行这些步骤:
OpenProcess()
VirtualAllocEx()
WriteProcessMemory()
CreateRemoteThread()
正常情况下,我们将原始shellcode直接写入到内存中,但是如果AV /EDR检测到了Shellcode,它们肯定会发出警报
所以我们在二进制文件中使用可逆的方式把shellcode编码,再解码写入内存来规避防护。
比如加、减、异或、交换。
使用cs生成个shellcode
该脚本读取我们的shellcode的每个操作码,然后将其与字节0x01(在这种情况下为我们的密钥)进行异或,将其打印为如下的shellcode :
现在,我们将开始实现将为我们执行shellcode注入的C代码。
编译方式
x86_64-w64-mingw32-gcc decoder.c -o decoder.exe -w
我将逐步介绍每个win32 API。
打开过程并获取一个句柄
我们需要选择一个向其注入shellcode的进程,然后需要检索该过程的句柄,以便可以对其执行一些操作,我们将使用OpenProcess win32 API
该代码将您要获取其句柄的进程ID作为第一个参数,然后它将使用具有PROCESS_ALL_ACCESS访问权限的OpenProcess()来打开该进程并将该句柄保存在变量process中,最后,为我们打印
成功检索到该句柄
检索句柄后的下一步将是在该进程内分配空间,我们可以使用VirtualAllocEx()
base_address代表分配的内存的地址
16行,我们将打印分配的内存的地址,并将其写入数据
0x29d0000作为地址,
使用x64dbg附加explorer.exe进程,转到这里看看
可以看到函数VirtualAllocEx已为我们在explorer.exe中分配了内存空间,我们准备写入数据。
接下来我们解码shellcode并写到内存中
即使使用这种类型(这里用的是异或)的编码,我们的shellcode也可能会被标记,因此请确保在操作中使用之前使用更强的编码并对其进行测试。
这里为测试就只使用的0x01
这段代码将使用密钥0x01对每个字节进行解码后,将我们的shellcode写入内存中
运行
如图所见,我们将每个字节写入地址,现在我们用x64dbg进行调试,然后转到地址 0x3ce0000查看一下:
可以看到shellcode已经写入进去了。
下一步就是执行shellcode了
使用CreateRemoteThread()函数来执行