简单的PE文件壳设计与验证
date: 2020 /11/6
Mission:
- 实现简单的跳转壳,在PE文件中添加新节,在新节其中加入跳转至原入口的指令,实现对原程序的启动。
- 实现PE文件加密壳,对原程序代码节内容异或运算,在原程序中加入新节实现对原代码节内容解密并启动运行。
Misson Source:CQU
Source Code 测试使用的asm代码
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
.stack 4096
ExitProcess PROTO , dwExitCode:DWORD
MessageBox equ MessageBoxA
MessageBoxA proto : DWORD, : DWORD, : DWORD, : DWORD ;
.data
msg byte 'Hello,Assembly Language!',0
msg_title byte 'Title',0
.code
main proc
invoke MessageBox,NULL, offset msg, offset msg_title, MB_OK
ret
INVOKE ExitProcess,0
main endp
end main
NO.1
记录初始入口点OEP:00001000
1. 添加新区段并记录区段信息
方法1:通过LordPE直接在区段表处添加新段
记录新节点信息
EP:00005000
SIZE:500
文件偏移:00000C00
在NewSec区段添加新数据
修改入口点为EP=00005000
方法2:通过010editor 手动添加新节表
添加一个新节到最后(在这儿我是复制最后一个节表的内容到下一位置,然后修改名称为.NewSEc)
修改节表数目
此时使用010editor观察新节表是否检查到
可以观察到已检查到新节表
但是由于我们只修改了所复制内容的名字,因此我们在这里还要对其对应内容进行修改处理
然后需要修改对应的数据
首先要修改virtual address
因为是直接copy的,根据对齐原则,这里修改4000为5000即可
再修改sizeofrawdata的大小 同方法1中一样 这里修改为500h
使用010editor编辑,到文件末尾增加500h的数据,在这里简单补零即可
同时修改PointerToRawData
计算的结果和我们之前在程序末尾添加0的位置相同说明正确
由于新增了0x500节数据大小.那么我们的PE文件头中镜像大小也要加0x500大小进行映射.注意.要按照内存对齐.
修改完毕
测试运行
仍能运行说明手动添加新节表成功。
4.在ollydbg中添加命令
修改过后程序无法正常运行,因为入口点被修改为了跳转表EP=00005000,因此需要我们在ollydbg中使用反汇编添加跳转指令使其跳转到原先的入口点即OEP=00001000
并保存至桌面,尝试运行。
运行成功
任务完成。
NO.2
任务是对代码段进行加密,并通过一个新区表作为入口实现对源代码解密,使其能够正常运行。
使用NO.1的exe进行加密操作。
首先先使得.text为可写入状态。
使用LordPE
修改为可写入状态
然后使用010editor对其进行加密
找到.text部分
始于400h,大小为200h,故结束于600h前
对所有字节进行xor12的简单加密操作
此时尝试运行,无法正常启动
在 .NewSec段添加解密代码
因为是对.text段的代码进行解密所以要知道其RVA
再次通过LordPE找到
即基地址+虚拟地址= 00400000 + 00001000
在ollydbg反汇编中添加如下指令
ECX为加密段的大小
EBX为加密段.text的位置
EAX为原入口
运行成功,加密text,并通过新节表进行解密的步骤全部完成。
参考学习链接:
简单的手工加壳篇 :https://blog.csdn.net/Winter_Zero/article/details/103726463
手工加壳:https://qwq1503.blog.csdn.net/article/details/102363129