壳的加载过程
参考文章:https://blog.csdn.net/m0_37809075/article/details/78876041
壳是什么
在一些计算机软件里有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。
由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为"壳"了。
壳分为加密壳和压缩壳。
壳的加载过程
1、保存入口参数
加壳程序初始化时保存各个寄存器的值,外壳程序执行完毕,再恢复各个寄存器的值,通常用pushad/popad,pushfd/popfd指令来对保护与恢复现场环境
2、获取壳自己所需要使用的API地址
一般外壳的输入表主要是GetProcAddress,GetModuleHandle和LoadLibrary这几个API函数
LoadLibrary:将DLL文件映像映射到调用进程的地址空间中
GetModuleHandle:获得DLL模块的句柄
GetProcAddress:获得函数的地址
3、解密原程序各个区块的数据
按照区块加密按照区块解密
4、IAT的初始化
加壳时,壳会自己构造一个输入表,并将PE头中的输入表指针指向自建的输入表。PE装载器对自建的输入表进行填写,原来的输入表由壳来填写。
壳将新输入表结构从头到尾扫描一遍,对每一个DLL引入的所有函数获取地址,填入IAT表中
5、重定位项的处理
加壳的DLL比加壳的EXE修正时多一个重定位表,因为是4GB空间中,DLL没有占住原来的imagebase地址
6、HOOK-API
壳一般都修改了原程序的输入表,自己模仿装载器来填充输入表。在填充过程中,外壳就可以填充HOOK-API的代码地址,间接获得程序的控制权
7、跳到程序原入口点(OEP)
正常的话也就是跳到imagebase + AddressOfEntryPoint