作者:不详 文章来源:不详 更新时间:2005-8-21

现在玩脱壳的人越来越多了,不知道是好事还是坏事。 
    现在玩手动脱壳一般三样工具足矣:loader,ImpREC,TRW2000。也许是这三剑客的功能太强大,因此手动脱壳也变得象流水化作业。大致以下几个步骤就搞定了。 
1)loader找OEP.(OEP就是程序原来的入口点,即Original Entry Point) 
2)TRW2000来Dump。也就是把内存映象保存为文件。 
3)ImpREC修补Import Table.(也就是修补程序原来的API地址)

不过如果这样,那么我想手动脱壳也没有必要了,因为更先进的工具如各种脱壳机会更快捷有效。既然是手动脱壳,当然想对壳有所了解,那么让我们看看壳是如何工作的吧。

现在的执行文件一般都是PE格式,如果你对PE格式一无所知,最好还是去看一看相关的资料。我没有那么地道的专业知识,也怕误人子弟。

相关名词 
1)Entry Point (入口点) 
PE格式的可执行文件的执行时的入口点,即是PE格式中的Entry Point。 
用PEditor或者LordPE之类的PE查看工具看看NotePad.exe,你就会看到Entry Point的值。 
也就是说NotePad.exe在执行时的第一行代码的地址应该就是这个值。(当然应该加上基地址)

2)Section (节区) 
PE格式文件是按节区进行规划组织的,不同的节区一般保存的数据的作用也不相同。通常使用缺省方式编译的程序文件,有CODE/DATA/TLS/.text/.data/.tls/.rsrc/.rdata/.edata/.reloc等不同的名称,有的用于保存程序代码,如CODE和.text节区,有的用于保存程序中的变量的,如DATA/.data节区,有的保存重定位信息,如.reloc,有的用于保存资源数据,如.rsrc。等等等等,当然这是缺省情况下编译器产生的结构。 
而节区名称和节区中的数据其实没有必然的联系, 
节区中保存的数据也没有什么硬性的限制。所以你可以在编译时用开关参数改变这些情况。

3)ImageBase (基地址) 
不仅程序文件按节区规划,而且程序文件在运行时Windows系统也是按节区加载的。那么每一块的节区的顺序如何?起始的地址是什么呢? 
这就由基地址决定。在程序的文件头部保存了每个节区的描述信息,比如有前面提到的节区名称,还有节区的大小,以及节区的相对虚拟地址(RVA)。 
如果我们把节区的相对虚拟地址(RVA)加上基地址(ImageBase)就可以知道节区在内存中的虚拟地址(VA)了。Windows系统就是按照这个要求来加载各个节区的。这样Windows系统依次把各个节区放到了它相应的虚拟地址空间。

所以如果我们把相对虚拟地址(RVA)看成是坐标的偏移量的话,那么ImageBase就是原点了。有了这个原点,一切都简单了。

1)获取壳自己所需要使用的API地址

如果你用PE查看工具看看加壳后的程序文件,会发现未加壳的程序文件和加壳后的程序文件的Import Table不太一样, 
加壳后的Import Table一般所引入的DLL和API很少,甚至只有Kernel32.dll以及GetProcAddress这个API。

我想你不会认为壳只用这个API就可以做所有的事吧。 
壳还需要很多其他的API来完成它的工作。 
当然他并不想让你知道他想用哪个API,所以一般他只是在壳的代码中动态加载这些API,而只把一些你嗅不过什么味道的几个API放在Import Table中。

当然这其中壳可能会用到一些Anti技术,不过这和本文主旨无关,所以就不说了。

2)解密原程序的各个节区(Section)的数据

壳出于保护原程序代码和数据的目的,一般都会加密原程序文件的各个节区。既然是加密保存,那么在程序执行时你总不能也保持加密状态吧,所以解密是壳必做的工作之一。 
一般壳按节区加密的,那么在解密时也按节区解密,并且把解密的节区数据按照节区的定义放在合适的内存位置。

如果加壳时用到了压缩技术,那么在解密之前还有一道工序,当然是解压缩。 
这也是一些壳的特色之一,比如说原来的程序文件未加壳时1-2M大小,加壳后反而只有几百K,这种瘦身技术当然会吸引了不少眼球。

3)重定位 
前面我们提到了ImageBase,即程序的基地址,当然这只是程序文件中声明的,程序运行时能够保证系统一定满足你的要求吗? 
对于EXE的程序文件来说,Windows系统会尽量满足你的要求。 
比如一般EXE文件的基地址为0x400000,而运行时Windows系统提供给程序的基地址也同样是0x400000。在这种情况下就不需要进行地址\"重定位\"了。

由于不需要对EXE文件进行\"重定位\",所以很多壳在加壳时把原程序文件中用于保存重定位信息的节区干脆也去掉了,这样使得加壳后的文件更加小巧。有些工具提供Wipe Reloc的功能,其实就是这个作用。

不过对于DLL的动态链接库文件来说,Windows系统没有办法保证每一次DLL运行时提供相同的基地址。这样\"重定位\"就很重要了。

此时壳中也需要提供进行\"重定位\"的代码,否则原程序中的代码是无法正常运行起来的。从这点来说,加壳的DLL比加壳的EXE更难修正。

4)HOOK-API 
我们知道程序文件中的Import Table的作用是让Windows系统在程序运行时提供API的实际地址给程序使用。 
在程序的第一行代码执行之前,Windows系统就完成了这个工作。

而壳一般都修改了原程序文件的Import Table,那么原程序文件的Import Table由谁来处理呢? 
这当然由壳来自己处理了,因此壳不得不模仿Windows系统的工作来填充Import Table中相关的数据。 
Import Table结构中与实际运行相关的主要是IAT结构, 
这个结构中用于保存API的实际地址,因此壳所需要的就是填充这个结构中的数据。 
不过壳不是填充这些实际的API地址,而是填充壳中用来HOOK-API的代码的地址。

这样壳中的代码一旦完成了加载工作,在进入原程序的代码之后,仍然能够间接地获得程序的控制权。 
因为程序总是需要与系统打交道,与系统交道的途径是API,而API的地址已经替换成了壳的HOOK-API的地址,那么每一次程序与系统打交道,都会让壳的代码获得一次控制权,一来壳可以进行反跟踪继续保护软件,二来可以完成某些特殊的任务。 
其实这就是所谓HOOK技术。

5)最后当然是跳转到程序原入口点。 
这个大家比较熟悉,找的就是它。脱壳时大多数也是在这个时候。从这个时候起壳要把控制权交还给原程序了。

转载于:https://www.cnblogs.com/mo-cuishle/p/3635124.html

浅谈壳的加载步骤及手动脱壳(转载)相关推荐

  1. Java hibernate假外键_浅谈hibernate急迫加载问题(多重外键关联)

    数据库结构如下 strategy中有外键member_id(关联member表)外键strategy_category(关联category表)而member表中有外键position_id(关联po ...

  2. 浅谈android中加载高清大图及图片压缩方式(二)

    这一讲就是本系列的第二篇,一起来聊下关于android中加载高清大图的问题,我们都知道如果我们直接加载原图的话,一个是非常慢,需要等待一定时间,如果没有在一定的时间内给用户响应的话,将会极大影响用户的 ...

  3. php自动加载类与路由,PHP实现路由与类自动加载步骤详解

    这次给大家带来PHP实现路由与类自动加载步骤详解,PHP实现路由与类自动加载步骤详解的注意事项有哪些,下面就是实战案例,一起来看一下. 项目目录如下 入口文件index.php<?php def ...

  4. Python基础知识学习(六)——包与模块:指令、包加载步骤、搜索范围

    目录 1.模块的使用 2.包的使用 当我们项目越来越复杂,将所有功能写进一个脚本显然不是一个最优的方法,分门别类将不同的功能的语句.函数.对象封装在不同的模块里.什么是一个模块?模块非常简单就是一个p ...

  5. 从UIL库谈Android图片加载中需要注意的事情

    Android Universal Image Loader 算是Android中最流行的图片加载库了,作者Sergey的确牛逼,能将整个Android图片加载的点点滴滴考虑的如此全面.网上研究这个开 ...

  6. 尚硅谷2020最新版宋红康JVM教程-中篇-第4章:再谈类的加载器-02和03-类的加载器分类

    引言 JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader). 从概念上来讲,自定义类加载器 ...

  7. 试简述smtp通信的三个阶段的过程_从输入URL到页面加载的过程?《转载》

    这是我看过这个问题最完整/优质的回答了,转来分享 知乎的排版不太好,可以浏览博客原文: http://gaoxiang.ga/index.php/archives/36/​gaoxiang.ga 前言 ...

  8. webrender 查看是否开启_想要体验极致顺滑的网页加载体验?手动开启Firefox WebRender渲染引擎...

    昨天我们提到火狐浏览器最新稳定版Mozilla Firefox v67 版将面向部分用户开启WebRender渲染引擎测试. 据火狐浏览器团队介绍当用户开启新的渲染引擎后 ,  网页加载帧率能够从现有 ...

  9. Javascript在页面加载时的执行顺序(转载)

    原文:http://dancewithnet.com/2007/03/22/order-of-execution-of-javascript-on-web/ 一.在HTML中嵌入Javasript的方 ...

最新文章

  1. 由浅入深解读Redis高级能力及性能调优
  2. hdu 3577(线段树区间更新)
  3. 理解UIView的绘制
  4. C# 控制台或者winform程序开启http的监听状态
  5. Django之验证码的实现,简单快捷的方法
  6. 充值加油卡骗局:一次伪金融诈骗为何能圈数亿
  7. 从零开始的FPGA学习(2)(用三八译码器实现一位全加器)
  8. 针式打印机设置字号大小
  9. Huffman-哈夫曼编码算法详解
  10. MASM32编写TcpStatC再进阶 显示PID和对应进程说明符
  11. 【Bandit Algorithms学习笔记】EXP3算法理论证明
  12. 高铁检测试验软件,高铁规划要点及测试情况分析
  13. Vue 自定义移动端的 滑动事件
  14. 深度学习为什么会出现validation accuracy大于train accuracy的现象?
  15. 密码学原语如何应用?解析单向哈希的妙用|第9论
  16. 我常用的轻量化哈希校验工具,右键菜单栏一键计算文件Hash~
  17. java和android!怒斩获了30家互联网公司offer,分享PDF高清版
  18. 北斗导航 | 北斗/GNSS相关数据下载:IGS/IGMAS/MGEX/DCB/brdc/gamit/bernese/rinex等
  19. “git pull”如何强制覆盖本地文件?
  20. DIY Gamebuino Classic游戏机

热门文章

  1. 敏捷领导力——组织敏捷转型的脚手架(Scaffolding)模型解析
  2. 获得淘口令真实url (item_password)
  3. java抓取并保存图片_【初学】java爬虫并抓取图片保存
  4. mysql-bin什么文件_mysql-bin是什么文件?
  5. 想做搏击风浪的海燕,去小公司吧
  6. 【Unity3D实战】方块跑酷初级开发实战(一)
  7. 静态NAT和动态NAT
  8. VMware 配置虚拟机固定IP
  9. 算法导论 — 思考题3-4 渐近记号的性质
  10. SpringCloud——Nacos下载