我已经转储了进程,并在其中分配了几个转储的内存页。如何在已加载的进程中将IDA中的所有内容加载到一个DB和参考页中?

评论

请澄清:这样,您将转储的进程保存在exe中,然后保存了与内存页面相对应的其他文件?

究竟。所有页面均由该进程分配。

怎么甩?使用Windows的调试API还是其他工具?通过快照将其转储到IDA中?

使用第三方工具,而不是在IDA中使用。

#1 楼

在等待答案的同时,我也进行了一些搜索,以防万一,有人对此问题也很感兴趣。克里斯·卡巴斯基(Kris Kasperski)又名nzumi在他的博客中安静地回答了上述问题。它已经过时了,但我希望它能起作用。如果IDA的人员可以对Kris的解决方案发表评论,并且可以从IDA的v5及以后的版本中引用,我将不胜感激。

Kris的解决方案:

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

提取:


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

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

第一种:我们将下一个文件作为附加加载二进制文件(菜单文件,加载文件,其他二进制文件…)。 IDA Pro不执行任何操作,仅加载文件,让我们解析所有内部PE / ELF结构(我看过一些由Symantec团队编写的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)。

这就是全部。好吧……由于我们具有线性地址空间,因此必须避免文件重叠,这意味着所有文件都应具有不同的基地址。如果它们匹配–在加载之前,我们必须重新设置其中之一(如果文件具有重定位,这很简单,否则,非常棘手,但是有可能)。

因此,我们来插入-in,看起来像这样:


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,将光标移至ds:GetModuleHandleA,然后按“ enter”(输入),然后…什么也不会发生!您进入了notepad.exe的导入表。出口在哪里?某个地方……但这不是问题,实际上,因为我们可以在“ Names Windows”(由Shift-F4调用)中找到GetModuleHandleA或编写简单的IDC脚本以创建导入和导出之间的交叉引用,就像搭桥:-]


我还没有尝试过。

评论


请引用该方法的相关部分。

– 0xC0000022L♦
13年5月26日在22:48

#2 楼

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