通过调试我们之前加壳后的程序。
发现从这个代码执行过后,跳转到了一个新的模块
这个函数又是返回一个地址 然后跳转到新的模块
跳过去第一句又是pop,所以有经验的人很容易看出来其端倪 。(这个壳相当于什么都没有保护)
我们可以对这段代码进行加密,比如可以用vm虚拟机的技术
也可以将这段代码删掉,开头就变成int3,int3就会崩溃,到了异常的检测,在壳处理程序里再对这个异常检测里面去恢复整个过程,这样分析难度就大大增加了。
我们就把这段代码删掉,利用异常机制,然后让它自动跳转。
在PushCode函数 AddCode 函数 中参数添加 是否隐藏的参数
信息映射到UI层。
增加结构体成员 是否隐藏标志位
typedef struct CODEContext
{
unsigned start;
bool hide;
unsigned short r_couent; //重定位信息
unsigned short len; //代码长度
}*PCODEContext;
再将写入这块客户端代码扩上if
if (!hide)
{
memcpy(buffer, _AsmCode, 11);//写入客户端跳转带代码
char* _pushIndex = _AsmCode + 3;//修改序号
_pushIndex[0]++;//
}
_dataHead += sizeof(CODEContext);
这样就删除了客户端原本的代码自己添加的那段代码
ShellExecute(this->GetSafeHwnd(), L"open", OutFilePath, NULL, NULL, SW_SHOW);//添加自动打开文件夹
接下来就要在注入的模块中接管异常来实现对壳程序代码的恢复