加密壳是比较初级的壳,本文最后源码链接中有两套不同实现。实现加密粒度完全不一样。
壳一般可以启到压缩作用和防逆向工程的作用。
DbgView.exe是一个原始程序,Dbgview_pack.ext是被加密后的程序,你可以发现占用磁盘大小减少了一半。
当然本文的源码未做重定向处理所以运行可能会奔溃。但对位于不需要重定向的程序是没有太多问题的。如源码中的扫雷程序。
本文的加密壳原理图:
我们首先编写一个GUI程序让用户选择一个加密的exe程序.
Ui代码的编写工程就跳过、
我们常看点击后的事件处理:
//szSrcExePath 加壳的exe
//szDstExePath 输出加壳后的 exe
bool CPacker::Pack(const char const* szSrcExePath, const char const* szDstExePath)
{
/*
* 1.解析PE
*/
if (!AnalyzePE(szSrcExePath))
{
return false;
}
/*
* 获取导入表信息
*/
if (!GetImpInfos())
{
return false;
}
/*
* 2.压缩节 获取压缩数据
*/
if (!Compress())
{
return false;
}
/*
* 3.获取壳代码
*/
if (!GetCode())
{
return false;
}
/*
* 4.构造带壳PE
*/
//1. 准备节区数据
if (!GetSecData())
{
return false;
}
//2. 构造新的节表
if (!GetNewSecHdrs())
{
return false;
}
//3.构造新的PE头
if (!GetNewPeHdr())
{
return false;
}
//4. 写入文件
if (!WriteNewPE2File(szDstExePath))
{
return false;
}
return true;
}
我们将根据函数调用序列讲解
分别对节压缩,对导入表抹除
对原始EXE整个加密。分为两个仓库存储 一个是shellcode 负责解压缩,一个压缩工具