脱壳入门(一)之分析Aspack壳

脱壳

0.前置知识

  • 熟悉PE文件结构
    • PE文件的Magic Code是什么
      • MZ头,PE头
    • PE文件头的信息有哪些?
      • 运行平台、时间戳、PE文件属性、区段数量、扩展头的大小
    • PE文件的扩展头的信息有哪些?
      • EP的RVA、ImageBase(400000)、代码段起始地址、数据段起始地址 数据目录表、数据目录表项数量、文件对齐、内存对齐、映像总大小
    • PE文件中区段信息有哪些?
      • 区段名称、虚拟地址、虚拟大小、文件偏移、文件大小(对齐后)、区段属性(C0000020、60000020)
    • PE文件中数据目录表有哪些?
      • 导出表、导入表、异常表、tls表、资源表、IAT、重定位表
    • 一个进程,3环有哪些数据结构
      • 进程环境块(PEB)、线程环境块(TEB)、tls结构
    • 导入表结构
      导入表结构
  • 熟悉汇编指令

1 .壳的基础知识

1.1壳的加载过程

​ 壳和病毒类似,都需要比原程序代码更早获得控制权.壳修改了原程序执行文件的组织结构,从而能够比原代码早获得控制权,而且不会影响原代码的运行.常见的壳的加载过程

  1. 保存入口参数
  2. 获取壳本身需要的API地址
  3. 解密原程序各个区块的数据
  4. IAT初始化
  5. 重定位项的处理
  6. HookAPI
  7. 跳转到程序原入口点(OEP)

示例:分析一个简单的aspack壳

1.保存寄存器环境

一般是pushad

。。。

2.加载一些必要的API

获取VirtualAlloc / VirtualFree / VirtualProtect API函数地址
在这里插入图片描述

3.解密解压缩代码

在这里插入图片描述

根据堆栈可以看出参数的作用,0x1800是申请空间大小

在这里插入图片描述
申请了两块内存空间,一块大小0x1800,没分析出保存的是什么,应该是和加密算法有关,另一块大小是(区段大小+0x10E),保存的是解密后的区段代码。
在这里插入图片描述

在这里插入图片描述
循环修复call,jmp跳转的地址(根据分析是修改所有首字节是05的地址)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.修复重定位

修复重定位的公式:

重定位表中存储两个有用字段:

  1. 需要重定位的分页地址

  2. 需要重定位的分页偏移

重定位分为两步:

  1. 计算出 重定位地址,要重定位的地址=模块基地址+分页地址+分页偏移

  2. 修复要重定位的地址中数据,[要重定位的地址] ­ 默认模块基地址 + 当前模块基地址

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.填充IAT

原理:

① 从导入表中获取dll名称

② 从导入表中的INT,获取函数名称或者序号

③ 通过GetModuleHandleA或者LoadLibraryA获取模块基地址 通过GetProcAddress获取函数地址

④ 将函数地址填充到对应IAT数组中

在这里插入图片描述
根据第四个字段可以找到导入模块名字
在这里插入图片描述

双层循环

  • 外层遍历导入模块
  • 内层遍历DLL模块导入函数,填充IAT表

在这里插入图片描述

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

5.修改属性,跳转原始OEP

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值