记录一次PE文件感染注入shellcode的实验过程和错误
实验目的:
实验在虚拟机中进行,禁止感染非实验文件
感染目标PE文件后,弹出对话框,关闭对话框后继续执行原程序功能;
使用Python编写感染程序,逻辑清晰且模块化,包括感染标志检测和设置、节表操作、Shellcode注入;
可选内容:手动解毒,或编写解毒程序,自动实现病毒代码摘除、执行流程恢复等。
实验环境:
- Parallels虚拟机模拟Windows11
- 010 Editor
实验过程:
在PE头之后找到节表,确定最后一个节的相对虚拟地址和节大小
这里找到
Section[4],节名是.reloc,表明该节为重定位节;
可以看出
Seciton[4]的大小是200h最后一个节的原始数据指针是
1800h
这样,我们就可以在节表中得出:
写入名称
.vrs,虚拟地址VA6000h,原始数据指针1A00h原始大小这里写
200h
接下来我们还需要修改PE头信息:
找到PE头中的
NumberOfSections字段,将其值加一
找到AddressOfEntryPoint字段,记录原值(用于后续跳回),然后修改为新节的虚拟地址
这里原值是
1294h的相对虚拟地址,修改为添加的Section[5]的RVA6000h找到SizeOfImage字段,增加新节的大小(按SectionAlignment对齐)

接下来添加Shellcode
在文件偏移1A00h处写入shellcode
计算跳转偏移:
原入口点(1294h) - (新节RVA(2000h) + shellcode长度F2h) - 5在shellcode末尾添加跳转指令:E9 9D B1 FF FF
从当前位置(shellcode末尾)跳转原始入口点(1294h),记得把后面的字节用00填充,补齐200字节
提示:
最后一个节 .reloc RVA = 0x5000, Size = 0x200
新节 .vrs RVA = 0x6000, Size = 0x200原程序用的是 0x1000 对齐,那么
SizeOfImage也要按 0x6000 对齐到 0x7000,否则 Loader 会在“越界校验” 时失败
在完成以上步骤后101 Editor还是
1 | Executing template 'C:\Users\len5010\Documents\SweetScape\010 Templates\Repository\EXE.bt' on 'C:\Users\len5010\Desktop\PyProject\helloworld.exe'... |
Line 632 Template passed end of file at variable 'Data'意味着:
在尝试读取某个节的原始数据时,根据该节的PointerToRawData和 SizeOfRawData,发现要读取的范围超出了文件的实际末尾
重新回顾一下实验:
- 我在文件末尾补齐了足够的00了吗?✅
- 新节的 PointerToRawData:1A00h
- 新节的 SizeOfRawData: 200h
- 文件实际大小: 1A00h + 200h = 1C00h
- PointerToRawData 的值是否准确?✅
- FileAlignment (400h)的整数倍
- 指向在文件中写入的shellcode的起始位置(1A00h)
- SizeOfRawData 的值是否准确?✅
- NumberOfSections 字段确实增加了1吗✅
经过排查后,我发现原因是因为我没有把sizeOfcode从0A00改成0C00
修改后,程序成功跳转执行shellcode并返回原程序