脱壳
0.前置知识
- 熟悉PE文件结构
- PE文件的Magic Code是什么
- MZ头,PE头
- PE文件头的信息有哪些?
- 运行平台、时间戳、PE文件属性、区段数量、扩展头的大小
- PE文件的扩展头的信息有哪些?
- EP的RVA、ImageBase(400000)、代码段起始地址、数据段起始地址 数据目录表、数据目录表项数量、文件对齐、内存对齐、映像总大小
- PE文件中区段信息有哪些?
- 区段名称、虚拟地址、虚拟大小、文件偏移、文件大小(对齐后)、区段属性(C0000020、60000020)
- PE文件中数据目录表有哪些?
- 导出表、导入表、异常表、tls表、资源表、IAT、重定位表
- 一个进程,3环有哪些数据结构
- 进程环境块(PEB)、线程环境块(TEB)、tls结构
- 导入表结构
- PE文件的Magic Code是什么
- 熟悉汇编指令
1 .壳的基础知识
1.1壳的加载过程
壳和病毒类似,都需要比原程序代码更早获得控制权.壳修改了原程序执行文件的组织结构,从而能够比原代码早获得控制权,而且不会影响原代码的运行.常见的壳的加载过程
- 保存入口参数
- 获取壳本身需要的API地址
- 解密原程序各个区块的数据
- IAT初始化
- 重定位项的处理
- HookAPI
- 跳转到程序原入口点(OEP)
示例:分析一个简单的aspack壳
1.保存寄存器环境
一般是pushad
2.加载一些必要的API
获取VirtualAlloc / VirtualFree / VirtualProtect API函数地址
3.解密解压缩代码
根据堆栈可以看出参数的作用,0x1800是申请空间大小
申请了两块内存空间,一块大小0x1800,没分析出保存的是什么,应该是和加密算法有关,另一块大小是(区段大小+0x10E),保存的是解密后的区段代码。
循环修复call,jmp跳转的地址(根据分析是修改所有首字节是05的地址)
4.修复重定位
修复重定位的公式:
重定位表中存储两个有用字段:
-
需要重定位的分页地址
-
需要重定位的分页偏移
重定位分为两步:
-
计算出 重定位地址,要重定位的地址=模块基地址+分页地址+分页偏移
-
修复要重定位的地址中数据,[要重定位的地址] 默认模块基地址 + 当前模块基地址
5.填充IAT
原理:
① 从导入表中获取dll名称
② 从导入表中的INT,获取函数名称或者序号
③ 通过GetModuleHandleA或者LoadLibraryA获取模块基地址 通过GetProcAddress获取函数地址
④ 将函数地址填充到对应IAT数组中
根据第四个字段可以找到导入模块名字
双层循环
- 外层遍历导入模块
- 内层遍历DLL模块导入函数,填充IAT表
5.修改属性,跳转原始OEP
今天的文章脱壳入门(一)之分析Aspack壳分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/24136.html