如何在 IDA 中加载转储进程和几个伴随的内存页面?

逆向工程 艾达 恶意软件 反编译
2021-06-27 09:12:11

我已经转储了进程和在其中分配的几个转储内存页。如何将 IDA 中的所有内容加载到一个数据库中并在加载过程中引用页面?

2个回答

在等待答案的同时,我也进行了一些搜索,这里有我所得到的以防万一,有人也对这个问题感兴趣。Kris Kasperski aka nzumi在他的博客中安静地回答了上述问题。它过时了,但我希望它有效。如果来自 IDA 的人可以评论 Kris 的解决方案,并且它适用于 IDA v5 及以后版本,我将不胜感激。

克里斯的解决方案:

如何将两个或多个文件加载到同一个 IDA-Pro 数据库中

提炼:

IDA Pro 具有模拟 x86 CPU 平面内存模型的线性地址空间(嗯,不仅是 x86,它也适用于其他 CPU)。加载器将文件加载到虚拟内存中,并完成所有必须完成的工作。

加载更多文件有两种解决方案

第一:我们将下一个文件作为附加二进制文件加载(菜单文件、加载文件、附加二进制文件...)。IDA Pro 什么都不做,只是加载文件,让我们解析所有内部 PE/ELF 结构(我看到了一些 IDC 脚本,由赛门铁克团队编写,但不记得链接了)。这是一项乏味的工作,所以,谢谢,但不,谢谢!

第二:我们使用IDA Pro函数: bool ida_export load_nonbinary_file (const char *original_file_name, const char *real_file_name, const char *sysdlldir, ushort _neflags, load_info_t *loader),其中“ loader ” – 返回的结果load_info_t *ida_export build_loaders_list( const char *filename), – 参见\IDA\SDK\include\ loader.hpp。当然,我们必须使用qfree函数释放指针(参见文件 pro.h)。

这是所有的了。好吧……既然我们有线性地址空间,我们必须避免文件重叠,这意味着所有文件都应该有不同的基地址。如果它们匹配——我们必须在加载之前重新定位其中一个(如果文件有重定位,这很简单,否则,非常棘手,但是,这是可能的)。

所以,我们来到插件,看起来像这样:

void idaapi run(int arg)
{
load_info_t *ld;
warning(“plugin \”dual-load\” is called!”);

/* NOTE: KERNEL32.DLL and NTDLL.DLL has to be in the current directory!!! */
ld = build_loaders_list(“KERNEL32.DLL”);
load_nonbinary_file(“KERNEL32.DLL”, “KERNEL32.DLL”, “.”, NEF_SEGS | NEF_RSCS | NEF_NAME | NEF_IMPS | NEF_CODE, ld);
/* qfree(ld);

ld = build_loaders_list(“NTDLL.DLL”); */
load_nonbinary_file(“NTDLL.DLL”, “NTDLL.DLL”, “.”, NEF_SEGS | NEF_RSCS | NEF_NAME | NEF_IMPS | NEF_CODE, ld);
qfree(ld);
}

好的,我们将 notepad.exe 加载到 IDA Pro 中,调用我们的插件,然后……玩得开心!!!notepad.exe,kernel32.dllntdll.dll加载到同一个 idb 数据库中!唯一的问题是:IDA Pro 不会在它们之间创建交叉引用。我的意思是,如果你分析notepad.exe,移动光标到 call ds:GetModuleHandleA,按“enter”,然后......没有任何反应!你进入了notepad.exe的导入表。出口在哪里?某处……但是,这不是问题,真的,因为,我们可以GetModuleHandleA在“名称 Windows”(由 Shift-F4 调用)中找到或编写一个简单的 IDC 脚本来创建导入和导出之间的交叉引用,就像建一座桥:-]

我还没有尝试。

如果您使用 IDA 转储进程,那么您可以使用位于调试器菜单中的“获取内存快照”功能将内存内容直接保存到数据库中。