- 献词
- 致谢
- 前言
- 第一部分 IDA 简介
- 第 1 章 反汇编简介
- 第 2 章 逆向与反汇编工具
- 第 3 章 IDA Pro 背景知识
- 第二部分 IDA 基本用法
- 第 4 章 IDA 入门
- 第 5 章 IDA 数据显示窗口
- 第 6 章 反汇编导航
- 第 7 章 反汇编操作
- 第 8 章 数据类型与数据结构
- 第 9 章 交叉引用与绘图功能
- 第 10 章 IDA 的多种面孔
- 第三部分 IDA 高级应用
- 第 11 章 定制 IDA
- 第 12 章 使用 FLIRT 签名来识别库
- 第 13 章 扩展 IDA 的知识
- 第 14 章 修补二进制文件及其他 IDA 限制
- 第四部分 扩展 IDA 的功能
- 第 15 章 编写 IDA 脚本
- 第 16 章 IDA 软件开发工具包
- 第 17 章 IDA 插件体系结构
- 第 18 章 二进制文件与 IDA 加载器模块
- 第 19 章 IDA 处理器模块
- 第五部分 实际应用
- 第 20 章 编译器变体
- 第 21 章 模糊代码分析
- 第 22 章 漏洞分析
- 第 23 章 实用 IDA 插件
- 第六部分 IDA 调试器
- 第 24 章 IDA 调试器
- 第 25 章 反汇编器/ 调试器集成
- 第 26 章 其他调试功能
- 附录 A 使用 IDA 免费版本 5.0
- 附录 B IDC/SDK 交叉引用
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
18.6 编写脚本化加载器
在 IDA 5.6 中,Hex-Rays 引入了使用 Python 或 IDC 脚本实现加载器的功能。在宣布此项新功能的 Hex 博客文章中 1,Hex-Rays 的 Elias Bachaalany 描述了一个加载器,该加载器以 Python 实现,用于加载一个包含 shellcode 的特定类型的恶意.pdf 文件。虽然该加载器不会将.pdf 文件的恶意本质类推到所有的.pdf 文件,但该加载器是如何在 IDA 中加载不受支持的文件格式的范例。
1. 参见: http://www.hexblog.com/?P=110 。
脚本化加载器能够以 IDC 或 Python 实现,并且至少需要 accept_file
和 load_file
这两个函数,它们的功能与我们前面讨论基于 SDK 的加载器时提及的函数的功能类似。simpleton 文件格式的 IDC 加载器如下所示:
#include #define SIMPLETON_MAGIC 0x1DAB00C //Verify the input file format // li - loader_input_t object. See IDA help file for more information // n - How many times we have been called //Returns: // 0 - file unrecognized // Name of file type - if file is recognized static accept_file(li, n) { auto magic; if (n) return 0; li.readbytes(&magic, 4, 0); if (magic != SIMPLETON_MAGIC) { return 0; } return "IDC Simpleton Loader"; } //Load the file // li - loader_input_t object // neflags - refer to loader.hpp for valid flags // format - The file format selected nby the user //Returns: // 1 – success // 0 – failure static load_file(li, neflags, format) { auto magic, size, base; li.seek(0, 0); li.readbytes(&magic, 4, 0); li.readbytes(&size, 4, 0); li.readbytes(&base, 4, 0); // copy bytes to the database loadfile(li, 12, base, size); // create a segment AddSeg(base, base + size, 0, 1, saRelPara, scPub); // add the initial entry point AddEntryPoint(base, base, "_start", 1); return 1; }
除了用 IDC 函数替代 SDK 函数外,IDC 版本的 simpleton 加载器与 C++ 版本的加载器之间的相似性(如前所述)应相当明显。要安装加载器脚本,只需将它们复制到/loaders 目录中即可。
Python 也可用于开发加载器并实现更加稳健的开发流程,因为它可以在更大程度上访问 IDA 的基本 SDK 。以 Python 实现的 simpleton 加载器如下所示:
#Verify the input file format
# li - loader_input_t object. See IDA help file for more information
# n - How many times we have been called
#Returns:
# 0 - file unrecognized
# Name of file type - if file is recognized
def accept_file(li, n):
if (n):
return 0
li.seek(0)
magic = struct.unpack("I", li.read(4))[0]
if magic != 0x1DAB00C:
return 0
return "Python Simpleton Loader"
#Load the file
# li - loader_input_t object
# neflags - refer to loader.hpp for valid flags
# format - The file format selected nby the user
#Returns:
# 1 – success
# 0 – failure
def load_file(li, neflags, format):
li.seek(0)
(magic, size, base) = struct.unpack("<III", li.read(12))
# copy bytes to the database
li.file2base(12, base, base + size, 1)
# create a segment
add_segm(0, base, base + size, ".text", "CODE")
# add the initial entry point
add_entry(base, base, "_start", 1)
return 1;
编写加载器(以及插件)脚本的一个最大优势在于,通过它们可以为可能最终使用 SDK 实现的模块快速创建原型。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论