脱壳第一篇(基础知识)

南笙酒味 提交于 2019-12-27 11:02:37

什么是壳 ? 壳的作用是什么?

简单举个例子:鸡蛋

“ 鸡蛋壳 ” 也是壳,其作用就是保护里面的蛋白和蛋黄。
“ 软件上的壳 ” 本质上就是代码,但是我们形象的称之为壳。其作用就是保护程序,确切的说是隐藏OEP( 原始入口点 )

在吃鸡蛋的时候,我们要做的第一件事,就是“ 脱壳 ”。
同样的,“ 软件上的壳 ”也是类似的,程序在运行的时候,首先就是运行壳的代码(程序自己给自己脱壳)。

那么怎么辨别软件是否被加了壳?

上面我们简单明了的知道了什么是壳 (本质上就是代码 ),以及壳的作用是什么( 保护程序,隐藏OEP )。那么,如何区分程序有没有被加壳呢?
以VS2017编写的一个控制台程序为例,简单输出一句话。

#include<stdio.h>
#include<stdlib.h>

int main()
{
	printf("这是VS2017编写的程序,Debug版本\n");

	system("pause");
	return 0;
}

在这里插入图片描述

无壳程序

用VS2017编译生成的EXE,默认是没有加壳的;现在我们用PEid查壳工具验证下。
在这里插入图片描述

重要信息:
  1. EP区段:. text (即代码段)
  2. 连接器版本:14.16(VS2017)
  3. 结果信息栏:什么都没找到,说明没有壳。(仅针对这个程序而已)
  4. 区段信息:这里的目的是大概知道Debug版本的区段信息是比较多的(VS2017的是9个区段),针对Release版本来说(VS2017的是5个区段)
    在这里插入图片描述
重要信息:
  1. 导入表:这里加载的模块里面的函数都可以正常显示,说明没有加密IAT;变相的说明这个程序没有加壳。(加壳要是不加密IAT,只能说对自己的技术非常的自信)
拖进OD,记录这个没有加壳程序的入口特征

在这里插入图片描述

重要信息:
  1. OEP:这个就是VS2017 Debug版 控制台版本的程序入口点(EP)
补充:

Debug版本:也是调试版本;不做任何优化,为开发人员提供强大的应用程序调试能力。
Release版本:通常称为发布版本,是为用户使用的,不允许在发布版本上进行调试
区别:Debug程序通常比Release程序要慢,尤其是处理视频方便Release要比Debug快很多;所以市面上的程序大多为Release版

有壳程序

刚才看了没有加壳的程序,现在我们对这个程序进行简单的加壳;看下加壳后的程序又是怎么样的?跟没有加壳的程序有什么区别。(对这个程序的加壳操作,请访问…)

1、查壳:不要急着拖去OD,先了解下程序的基本信息。

在这里插入图片描述
在这里插入图片描述

重要信息:
  1. EP区段:即入口点的区段,没有加壳程序的区段都是 . text(代码段)。
    这里的EP区段是 . Pack段,可以推测这个程序很大概率上有加壳。
  2. 区段数量:有10个区段,说面这个程序很大概率上是Debug版的程序;在真正逆向的时候,程序多为Release版。
  3. 链接器版本:14.*,的为VS2017
  4. 结果信息栏:什么都没找到,结果只有两种。要么没有加壳,要么这个是未知的壳。
    由于EP区段并不是. text段(代码段),所以这个很有可能是未知的壳
2、导入表:

在这里插入图片描述

重要信息:
  1. 导入地址表:由于我只加密了代码段,并没有加密IAT;所以函数名称都可以正常显示出来。
3、OD查看:

在这里插入图片描述
综合:1、EP段不是. text段,单纯这部已经很大可能说明加壳了。正常如果你不加壳,你只是单纯的修改区段名,混弄谁呢?你只修改区段名又不会影响OEP
2、链接器版本,这个不是非常可信。因为链接器版本是可以造假的,但是可以作为参考(仅供参考)
3、区段的数量那么多,可以推测出这个程序可能是Debug版本,但是一般我们要逆向的程序多为Release版
4、导入表,一般情况下加壳必然会加密IAT。但是这里我并没有加密IAT,所以我们可以看到函数名;但是IAT被加密的程序,函数名一般都是不能显示不出来的,要么就是显示一两个不完整的。
在这里插入图片描述
5、双击程序,这个是控制台程序。所以有三种可能,VS的Debug、Release、汇编写的。
首先,不可能是汇编写的,因为只是简单的输出一句话,就用了38.2KB。完全不符合汇编的特点。
再比较Debug 和 Release 的入口特征(查程序的入口特征请访问…),发现都匹配不上,所以可以断定这个程序就是被加了壳。

补充:什么是OEP ?什么是EP ?

先说EP(EntryPoint)入口点的意思,所谓的EP就是拖到OD后,在主模块入口点断下的位置(因为程序从入口点开始执行)。
至于OEP(Original EntryPoint),对于没有加壳的程序来说,EP和OEP都是一样的;而对于加了壳的程序来说,EP就是壳代码的开始执行的位置,而OEP则是加壳前的程序入口点(原程序的入口点)。
所以,脱壳就是找OEP;只有找到原始的入口点才能开始真正的逆向分析程序。

至此,壳的基础知识就到此为止了。

写博客纯属就是记笔记,加深对知识的理解;所以还大家多多指教,要是发现错误的地方,还请大家指正。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!