返回介绍

18.6 编写脚本化加载器

发布于 2024-10-11 21:05:47 字数 2996 浏览 0 评论 0 收藏 0

在 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_fileload_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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文