zoukankan      html  css  js  c++  java
  • 脱壳入门----基本思路

    前言

    壳,其本质就是一段程序。这段程序就像一层保护壳一样保护软件不被轻易的逆向破解,那么为了对软件的真正面目进行逆向分析并破解我们就需要将这层壳给“剥去”,我们把这个剥去外壳的过程就称为脱壳。

    壳的分类

    壳根据其侧重点的不同可以分为两类。一类壳的主要目的是为了压缩程序减小程序的大小,这种壳称为压缩壳。另一类壳的主要目的是为了对程序进行加密,这种壳称为加密壳。

    脱壳的基本思路

    根据壳保护对象的不同(EXE,dll),我们有两种不同的脱壳思路。之所以脱EXE的壳和脱dll的壳思路不同是因为dll程序涉及到重定位表的操作,而exe一般没有重定位表。

    脱EXE的保护壳


    ① 因为exe在加上外壳后程序的入口是外壳代码的入口,我们需要找到在加壳前程序真正的入口即OEP。方便我们在后面将程序真正的入口修改回来,以及在重建输入表的时候查找IAT。
    ② 因为无论是加密壳还是压缩壳其一般都会对源程序的各个区段进行压缩。当程序运行时会先运行壳代码,这样壳代码会把压缩的数据进行解压缩还原程序真正的面貌使程序正常的运行。那么我们为了得到程序真正的面貌我们就需要在外壳代码将原程序解压缩后dump出程序,一般是在即将进入oep处进行dump,有专门的dump工具如LordPE。
    ③ 一般壳会把程序的输入表破坏。因为没有了输入表,所以壳代码会自己模仿windows加载器的功能填充IAT。为了在脱壳后让PE文件能够让windows加载器加载并填充IAT,我们需要自己重新构建原程序的输入表。重建输入表也有专门的工具,如ImportRE等。
    ④ 在dump文件并修复输入表后一般就算脱壳成功了,但是dump后的pe文件含有多余的壳代码并且有些原程序的资源还在壳代码中(一些特殊的资源数据),所以我们可以对PE文件进行进一步的优化。例如删除多余的壳代码的区段,修正PE文件头等。

    脱DLL的保护壳


    dll脱壳与exe脱壳的主要区别就在于对重定位表的处理,其他步骤都基本相同。
    ②一般壳会完成本应windows加载器完成的重定位任务。为了使我们抓取的dump文件与未加壳前的程序代码相同我们应该跳过壳代码重定位的代码块,如果不跳过这些重定位代码那么我们dump的程序使用重定位的代码的数据将于原文件不同。当我们跳过这些壳的重定位代码后就可以使生成程序中使用重定位的数据与原程序相同。
    ⑤因为壳将原本的重定位表与原程序脱离,所以如果直接让windows加载器加载我们dump的文件的话其是找不到重定位表的,继而无法修正需要重定位的数据,我们需要自己进行重新构建重定位表供windows加载器修正重定位数据使用。

  • 相关阅读:
    eval(data)和eval("("+data+")")的区别
    来自 119.*.*.*的回复: TTL 传输中过期
    小伙伴们,我们一起奋斗吧
    计算机专业学习课程推荐
    sysbench使用教程【转载】
    Docker学习笔记 — Docker私有仓库搭建【转载】
    Linux设置静态IP【转】
    聊一聊PV和并发、以及计算web服务器的数量的方法【转】
    Linux常用Shell脚本珍藏【转载】
    戏说云计算之PaaS,IaaS,SaaS【转载】
  • 原文地址:https://www.cnblogs.com/revercc/p/13435447.html
Copyright © 2011-2022 走看看