实验目的:

  • 实验在虚拟机中进行,禁止感染非实验文件

  • 感染目标PE文件后,弹出对话框,关闭对话框后继续执行原程序功能;

  • 使用Python编写感染程序,逻辑清晰且模块化,包括感染标志检测和设置、节表操作、Shellcode注入;

  • 可选内容:手动解毒,或编写解毒程序,自动实现病毒代码摘除、执行流程恢复等。

实验环境:

  • Parallels虚拟机模拟Windows11
  • 010 Editor

实验过程:

在PE头之后找到节表,确定最后一个节的相对虚拟地址节大小

image-20250522145920491

这里找到Section[4],节名是.reloc,表明该节为重定位节;

image-20250522145235052

可以看出Seciton[4]的大小是200h

最后一个节的原始数据指针是1800h

这样,我们就可以在节表中得出:

  • 写入名称.vrs,虚拟地址VA6000h,原始数据指针1A00h

  • 原始大小这里写200h

image-20250522170055737

接下来我们还需要修改PE头信息:

  • 找到PE头中的NumberOfSections字段,将其值加一

    image-20250522151850390
  • 找到AddressOfEntryPoint字段,记录原值(用于后续跳回),然后修改为新节的虚拟地址

    image-20250522152135596

    这里原值是1294h的相对虚拟地址,修改为添加的Section[5]的RVA6000h

  • 找到SizeOfImage字段,增加新节的大小(按SectionAlignment对齐)

    image-20250522152030635

接下来添加Shellcode

  • 在文件偏移1A00h处写入shellcode

  • 计算跳转偏移:原入口点(1294h) - (新节RVA(2000h) + shellcode长度F2h) - 5

  • 在shellcode末尾添加跳转指令:E9 9D B1 FF FF

    从当前位置(shellcode末尾)跳转原始入口点(1294h),记得把后面的字节用00填充,补齐200字节

E9

提示:

最后一个节 .reloc RVA = 0x5000, Size = 0x200
新节 .vrs RVA = 0x6000, Size = 0x200

原程序用的是 0x1000 对齐,那么 SizeOfImage 也要按 0x6000 对齐到 0x7000,否则 Loader 会在“越界校验” 时失败

在完成以上步骤后101 Editor还是

1
2
3
4
5
6
7
8
Executing template 'C:\Users\len5010\Documents\SweetScape\010 Templates\Repository\EXE.bt' on 'C:\Users\len5010\Desktop\PyProject\helloworld.exe'...
EXE.bt Begin
Space between DOS header and NT header is 176 bytes
PE32
Space between header and first section is 296 bytes
*ERROR Line 632: Template passed end of file at variable 'Data'.
Executing template 'C:\Users\len5010\Documents\SweetScape\010 Templates\Repository\010.bt' on 'C:\Users\len5010\Documents\SweetScape\010 Templates\Repository\EXE.bt'...
Template executed successfully.

Line 632 Template passed end of file at variable 'Data'意味着:

在尝试读取某个节的原始数据时,根据该节的PointerToRawDataSizeOfRawData,发现要读取的范围超出了文件的实际末尾

重新回顾一下实验:

  1. 我在文件末尾补齐了足够的00了吗?
    • 新节的 PointerToRawData:1A00h
    • 新节的 SizeOfRawData: 200h
    • 文件实际大小: 1A00h + 200h = 1C00h
  2. PointerToRawData 的值是否准确?
    • FileAlignment (400h)的整数倍
    • 指向在文件中写入的shellcode的起始位置(1A00h)
  3. SizeOfRawData 的值是否准确?
  4. NumberOfSections 字段确实增加了1吗

经过排查后,我发现原因是因为我没有把sizeOfcode从0A00改成0C00
修改后,程序成功跳转执行shellcode并返回原程序

shell