【学习笔记】从eXeScope到汇编与反汇编、加壳与脱壳的理解


        由于博主需要对.exe文件的内部程序进行修改,因此今天面向百度编程学习了如何修改.exe文件。通过百度,笔者发现了eXeScope这款神器,并基于此神器对“汇编与反汇编”、“壳”的概念有了一定程度的了解。特写作此文,记录下自身的收获。


目录

  • 汇编Assembly
  • 反汇编Disassembly
  • eXeScope
    • 软件介绍:
    • 壳的概念
    • 壳的种类
    • 加壳和脱壳技术
    • 加壳的解压原理


        首先我们来看下面这么一幅图,该图展示了如何将一个c程序变成一个可执行程序。
【学习笔记】从eXeScope到汇编与反汇编、加壳与脱壳的理解_第1张图片

        基于此图,我们来说说汇编与反汇编。


汇编Assembly

  • 动词,指的是把汇编语言翻译成机器语言的过程。
  • 名词,指的便是汇编语言。

反汇编Disassembly

  • 动词,指的是由已生成的机器语言(二进制语言)转化为汇编语言的过程,也可以说是汇编的逆向过程。
  • 名词,指的是有机器语言经过反汇编过程生成的汇编语言。
  • 通过反汇编生成的汇编代码,每一行前面都有一串16进制的数字(0x开头)。这些数字就是每一行汇编代码对应的机器代码。
  • 该技术常用于软件破解、外挂技术、病毒分析、逆向工程、软件汉化等领域,学习和理解反汇编对软件调试、系统漏洞挖掘、内核原理及理解高级语言代码具有相当大的帮助,软件的一切神秘运行机制全都在反汇编代码里。
  • 软件逆向技术是通过阅读程序的反汇编流程并对应CPU的各种状态,从而推测出程序运作原理。逆向技术能够很好的帮助我们研究和学习闭源软件,通过逆向技术我们可以研究学习闭源软件的实现原理,取长补短为己所用。一个优秀的C程序员,应当理解机器的底层实现细节和程序的运行原理。

eXeScope

        介绍完汇编和反汇编后,我们来正式说说eXeScope这款神器。

软件介绍:

        你想自定义.exe应用软件吗?例如:更改字体,更改菜单,更改对话框的排列,等等。但你会认为这是不可能的,因为你没有资源文件。eXeScope能在没有资源文件的情况下分析、显示不同的信息,重写可执行文件的资源,包括(EXE,DLL,OCX)等。eXeScope是方便强大的汉化工具,可以直接修改用 VC++ 及 DELPHI 编制的程序的资源,包括菜单、对话框、字串表等。
【学习笔记】从eXeScope到汇编与反汇编、加壳与脱壳的理解_第2张图片

        观察上图我们可以发现,导入的.exe程序一般都具有“头部”、“导入”、“资源”三部分,而我们若要对.exe程序进行修改,则需要打开“资源”旁边的“+”号,找到里面的“对话框”,根据软件的前端显示便能为所欲为。除此之外,“资源”里面的“版本”我们也能进行任意修改。
        根据软件介绍并经过测试,我们自己的.exe程序可以被轻易修改。但是为什么我们从网上下载的程序却几乎都不能直接这样修改呢?
        那是因为很多程序在发布的时候就已经被作者加了壳。经过测试,将.exe程序用UPX加壳后,直接用eXeScope打开无法进行修改,哪怕是强行修改后保存再运行也会出错。但是使用UPX脱壳插件对加了壳的程序进行脱壳,脱壳后程序又可以直接用eXeScope修改了。市面上的.exe程序大多都加过壳。简单的壳可以直接用插件脱,复杂的壳或者生僻的壳没有脱壳机的就很难脱了。
        接下来我们再来说说“壳”的相关概念吧。


壳的概念

        在一些计算机软件里有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行、拿到控制权,然后完成它们保护软件的任务。就像动植物的壳一般都是在身体外面一样理所当然(但后来也出现了所谓的“壳中带籽”的壳)。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为“壳”了。就像计算机病毒和自然界的病毒一样,其实都是命名上的方法罢了。 从功能上抽象,软件的壳和自然界中的壳相差无几。无非是保护、隐蔽壳内的东西。而从技术的角度出发,壳是一段执行于原始程序前的代码。原始程序的代码在加壳的过程中可能会被压缩、加密。当加壳后的文件执行时,壳-这段代码先于原始程序运行,他把压缩、加密后的代码还原成原始程序代码,然后再把执行权交还给原始代码。

壳的种类

        软件的壳主要分为加密壳、压缩壳、伪装壳、多层壳等类,目的都是为了隐藏程序真正的OEP。OEP:(Original Entry Point),程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP),只要我们找到程序真正的OEP,就可以立刻脱壳。PUSHAD(压栈)代表程序的入口点,POPAD(出栈)代表程序的出口点,与PUSHAD相对应,一般找到这个OEP就在附近啦。
        当作者编好软件后,编译成exe可执行文件。这时:
        ① 有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名,即为了保护软件不被破解,通常都是采用加壳来进行保护。
        ② 需要把程序搞的小一点,从而方便使用。于是,需要用到一些软件,它们能将exe可执行文件压缩。
        ③ 在黑客界给木马等软件加壳脱壳以躲避杀毒软件。
        实现上述功能的这些软件统称为加壳软件。

加壳和脱壳技术

        加壳,是一种通过一系列数学运算,将可执行程序文件或动态链接库文件的编码进行改变(目前还有一些加壳软件可以压缩、加密驱动程序),以达到缩小文件体积或加密程序编码的目的。加壳一般是指保护程序资源的方法。
        脱壳,一般是指除掉程序的保护,用来修改程序资源。相应的,有加壳也一定会有解壳(也叫脱壳)。脱壳主要有两种方法:硬脱壳和动态脱壳。
        硬脱壳:指找出加壳软件的加壳算法,写出逆向算法,就像压缩和解压缩一样。由于,目前很多“壳”均带有加密、变形的特点,每次加壳生成的代码都不一样。硬脱壳对此无能为力,但由于其技术门槛较低,仍然被一些杀毒软件所使用。
        动态脱壳:由于加壳的程序运行时必须还原成原始形态,即加壳程序会在运行时自行脱掉“马甲”。目前,有一种脱壳方式是抓取(Dump)内存中的镜像,再重构成标准的执行文件。相比硬脱壳方法,这种脱壳方法对自行加密、变形的壳处理效果更好。

加壳的解压原理

        加壳工具在文件头里加了一段指令,告诉CPU,怎么才能解压自己。现在的CPU速度都很快,所以这个解压过程你看不出什么东西、软件一下子就打开了。只有你的机器配置非常差时才会感觉到不加壳和加壳后的软件运行速度的差别。当你加壳时,其实就是给可执行的文件加上个外衣。用户执行的只是这个外壳程序。当你执行这个程序的时候这个壳就会把原来的程序在内存中解开,解开后,以后的就交给真正的程序。所以,这些的工作只是在内存中运行的。通常说的对外壳加密,都是指很多网上免费或者非免费的软件,被一些专门的加壳程序加壳,基本上是对程序的压缩或者不压缩。因为有的时候程序会过大,需要压缩。但是大部分的程序是因为防止反跟踪,防止程序被人跟踪调试,防止算法程序不想被别人静态分析。加密代码和数据,保护你的程序数据的完整性,不被修改或者窥视你程序的内幕。
        加“壳”虽然增加了CPU负担,但是减少了硬盘读写时间,实际应用时加“壳”以后程序运行速度更快(当然有的加“壳”以后会变慢,那是选择的加“壳”工具问题)。
        一般软件都会加“壳”,这样不但可以保护自己的软件不被破解、修改还可以增加运行时启动速度。
        加“壳”不等于木马,我们平时的绝大多数软件都加了自己的专用“壳”。
        RAR和ZIP都是压缩软件,不是加“壳”工具,他们解压时是需要进行磁盘读写,“壳”的解压缩是直接在内存中进行的。用RAR或者ZIP压缩一个病毒你试试,解压缩时杀毒软件肯定会发现。而用加“壳”手段封装木马,能发现的杀毒软件就少得多。
        木马加壳的原理很简单,在黑客营中提供的多数木马中,很多都是经过处理的,而这些处理就是所谓的加壳。当一个程序生成好后,很轻松的就可以利用诸如资源工具和反汇编工具对它进行修改,但如果程序员给程序加一个壳的话,那么至少这个加了壳的程序就不是那么好修改了,如果想修改就必须先脱壳。


你可能感兴趣的:(学习笔记)