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

文章目录

  • 脱壳
    • 0.前置知识
    • 1 .壳的基础知识
      • 1.1壳的加载过程
      • 示例:分析一个简单的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结构
    • 导入表结构
      脱壳入门(一)之分析Aspack壳_第1张图片
  • 熟悉汇编指令

1 .壳的基础知识

1.1壳的加载过程

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

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

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

1.保存寄存器环境

一般是pushad

脱壳入门(一)之分析Aspack壳_第2张图片

2.加载一些必要的API

获取VirtualAlloc / VirtualFree / VirtualProtect API函数地址
脱壳入门(一)之分析Aspack壳_第3张图片

3.解密解压缩代码

脱壳入门(一)之分析Aspack壳_第4张图片

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

脱壳入门(一)之分析Aspack壳_第5张图片
申请了两块内存空间,一块大小0x1800,没分析出保存的是什么,应该是和加密算法有关,另一块大小是(区段大小+0x10E),保存的是解密后的区段代码。
脱壳入门(一)之分析Aspack壳_第6张图片

脱壳入门(一)之分析Aspack壳_第7张图片
循环修复call,jmp跳转的地址(根据分析是修改所有首字节是05的地址)
脱壳入门(一)之分析Aspack壳_第8张图片

脱壳入门(一)之分析Aspack壳_第9张图片

脱壳入门(一)之分析Aspack壳_第10张图片

4.修复重定位

修复重定位的公式:

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

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

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

重定位分为两步:

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

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

脱壳入门(一)之分析Aspack壳_第11张图片

脱壳入门(一)之分析Aspack壳_第12张图片

脱壳入门(一)之分析Aspack壳_第13张图片

5.填充IAT

原理:

① 从导入表中获取dll名称

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

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

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

脱壳入门(一)之分析Aspack壳_第14张图片
根据第四个字段可以找到导入模块名字
脱壳入门(一)之分析Aspack壳_第15张图片

双层循环

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

脱壳入门(一)之分析Aspack壳_第16张图片

脱壳入门(一)之分析Aspack壳_第17张图片
脱壳入门(一)之分析Aspack壳_第18张图片

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

脱壳入门(一)之分析Aspack壳_第19张图片

你可能感兴趣的:(脱壳入门(一)之分析Aspack壳)