- 保存入口参数
- 获取壳自己所需要使用的API地址
- 解密原程序各个区块的数据
- IAT的初始化
- 重定位项的处理
- HOOK-API
- 跳到程序原入口点(OEP)
保存入口参数
加壳程序初始化时保存各个寄存器的值,外壳程序执行完毕,再恢复各个寄存器的值,通常用pushad/popad,pushfd/popfd指令来对保护与恢复现场环境
获取壳自己所需要使用的API地址
一般外壳的输入表主要是GetProcAddress,GetModuleHandle和LoadLibrary这几个API函数
LoadLibrary:将DLL文件映像映射到调用进程的地址空间中
GetModuleHandle:获得DLL模块的句柄
GetProcAddress:获得函数的地址
解密原程序各个区块的数据
按照区块加密按照区块解密
IAT的初始化
加壳时,壳会自己构造一个输入表,并将PE头中的输入表指针指向自建的输入表。PE装载器对自建的输入表进行填写,原来的输入表由壳来填写。
壳将新输入表结构从头到尾扫描一遍,对每一个DLL引入的所有函数获取地址,填入IAT表中
重定位项的处理
加壳的DLL比加壳的EXE修正时多一个重定位表
HOOK-API
壳一般都修改了原程序的输入表,自己模仿装载器来填充输入表。在填充过程中,外壳就可以填充HOOK-API的代码地址,间接获得程序的控制权
跳到程序原入口点(OEP)