2.12 PE结构:实现PE字节注入
本章笔者将介绍一种通过Metasploit生成ShellCode并将其注入到特定PE文件内的后门植入技术。该技术能够劫持原始PE文件的入口地址,在PE程序运行之前执行ShellCode反弹,执行后挂入后台并继续运行原始程序,实现了一种隐蔽的后门访问。而我把这种技术叫做字节注入反弹。
字节注入功能调用WritePEShellCode
函数,该函数的主要作用是接受用户传入的一个文件位置,并可以将一段通过Metasploit
工具生成的有效载荷注入到特定文件偏移位置处。
读者在使用该函数之前需要通过WinHex
找到注入位置,我们以如下截图中的30352
为例;
接着读者需要自行准备一段ShellCode
代码,只保留代码部分去掉头部变量参数,如下所示;
接着我们使用如下这段代码中的WritePEShellCode
函数,通过传入指定PE文件路径,指定文件便宜,以及指定的ShellCode
文件路径,即可自动将其压缩为一行并在压缩后将代码写出到指定的可执行文件内。
// 将ShellCode写出到PE程序的特定位置 |
我们通过传入WritePEShellCode("d://lyshark.exe", 30352, "d://shellcode.txt");
参数,运行后则可将特定文本中的机器码注入到30352
的位置处,读者也可以通过使用WinHex
跳转到对应位置观察,如下所示;
当然了上述方法注入到PE
文件中我们需要手动分析寻找空余块,并在注入成功后还需要自行修正PE
文件内的入口地址等,这种方式适合于对PE
结构非常熟悉的人可以,但也要花费一些精力去寻找分析,如下代码则是实现了自动化注入功能,该代码中FindSpace()
函数用于从代码节的末尾开始搜索,寻找特定长度的空余位置,当找到合适的缝隙后便返回缝隙首地址。
此时dwOep
变量内存储的是该程序原始的OEP
入口位置,接着将入口地址赋值到*(DWORD *)&shellcode[5]
也就是放入到shellcode
机器码的第六个位置处,此处将变更为跳转到原始入口的指令集,接着调用memcpy
函数将shellcode
代码拷贝到新分配的dwAddr
内存中,此处的strlen(shellcode) + 3
代表的是ShellCode
中剩余的\xff\xe0\x00
部分,最后将当前EIP
指针设置为我们自己的ShellCode
所在位置,通过pNtHeader->OptionalHeader.AddressOfEntryPoint
赋值设置此变量,至此这个注入器就算实现啦。
|
读者可自行编译并运行上述代码,当运行结束后会将ShellCode
全局变量中的指令集,写入到lyshark.exe
程序内,并修正当前程序的OEP
入口处,此时读者可运行lyshark.exe
程序,看是否能够正常执行起来,如下图所示;
此时读者可自行打开x64dbg
调试器,观察此时的程序入口处已经变成了0x47BFF3
执行到最后则通过jmp eax
跳转到了原始的程序入口处继续执行,这也就是空字节注入的功能,当读者自己将nop
指令替换为任意特殊的汇编指令时,也就实现了一款植入后门版本的软件。
当我们对特定的程序插入后门后,则还需要对该程序增加一个标志,在PE结构中有许多地方可以写入这个标志,例如DOS
头部存在一个e_cblp
变量,通过向该变量写入一个标志,当需要判断是否被感染时读取此处并检查是否存在特定值即可,如下代码则是一个检查实现方式。
|
由于e_cblp
是第二个字段,所以在填充后我们打开WinHex
就可以看到变化,如下图所示;