好酷屋

ida pro使用教程-ida pro最新使用教程

好酷屋

发布于2023-04-04

好酷屋教程网小编为您收集和整理了ida pro使用教程-ida pro最新使用教程的相关教程:IDAPro能够创建其执行的映射,以符号表示(汇编语言)显示处理器实际执行的二进制指令。IDAPro中已经实现了先进的技术,以便它可以从机器可执行的代码生成汇编语言源代码,并使这种复杂的代码更具人

IDA Pro能够创建其执行的映射,以符号表示(汇编语言)显示处理器实际执行的二进制指令。IDA Pro中已经实现了先进的技术,以便它可以从机器可执行的代码生成汇编语言源代码,并使这种复杂的代码更具人类可读性。

调试功能通过动态分析增强了 IDA。它支持多个调试目标,并且可以处理远程应用程序。其跨平台调试功能可实现即时调试,轻松连接到本地和远程进程,并支持 64 位系统和新的连接可能性。

几天前,我们从一位IDA用户那里收到了一个小型无害的可执行文件(test00.zip;使用密码123解压缩两次),无法在IDA中调试。断点不会中断,并且程序将失控,就好像调试器太慢而无法捕获它一样。当我们第一次在IDA中加载程序时,它抱怨找不到导入部分。这种类型的情况经常受到受保护的可执行文件,打包的蠕虫等的影响。

第二件值得注意的事情是,切入点跳跃…无处。标记为红色的地址通常反映 IDA 无法解析的位置。

此代码采用尝试来防止反汇编,因此,默认加载参数不合适。这种类型的模糊代码演示了一键式方法固有的问题。

但是,如果我们进一步研究,例如通过在手动模式下加载文件,该怎么办?在此模式下,用户可以指定应加载文件的哪些部分。为了安全起见,让我们加载所有部分。让我们取消选中”制作导入部分”复选框,以避免”缺少导入”消息。我们有这个:

一旦我们回答了有关文件每个部分的问题,我们将得到这个列表:好多了!

现在我们摆脱了未解析的地址,我们可以分析程序。我们的可执行文件的第一个指令是跳转,它跳转到程序头:loc_400158。嗯,程序头不应该包含任何代码,但这个程序滥用了约定并跳转到它。一个有趣的副作用是程序头是只读的。这可以解释为什么断点不能放在那里。

无论如何,让我们看看该程序的工作原理。我们看到程序将一个指针加载到ESI中,该指针立即复制到EBX:

HEADER:00400158 mov esi, offset off_40601CHEADER:0040015D mov ebx, esi

(Ctrl-O 将第一条指令中的十六进制数转换为标签表达式)

稍后,EBX 的值用于调用子例程:

HEADER:00400169 call dword ptr

这样的调用在列表中很常见,因此让我们找出该函数及其功能。显然,指向该函数的指针位于此处:

__u_____:0040601C off_40601C dd offset __ImageBase+130h

如果我们点击__ImageBase,我们将看到的是一个dwords数组。IDA 将程序标头表示为数组,这在我们的例子中是不正确的。我们取消定义数组(热键 U),返回指针(热键 Esc),然后再次跟随指针。这一次,我们将最终到达地址0x400130,该地址应包含一个函数。我们确信这一点,因为0x400169的指示间接地0x400130。我们按 P(创建过程或函数)告诉 IDA 在当前地址应该有一个函数。虽然该功能现在在屏幕上,但我们只有一半!似乎编写该程序的人希望它对其进行混淆,并将该功能分成几部分。IDA 现在知道如何处理这些碎片化的功能,并在屏幕上显示有关其他功能部件的信息:

但它只引用了其他部分。如果将整个函数放在一个页面上,那就太好了。有一个特殊的命令可以帮助我们:在IDA中生成函数流程图的命令,它的热键是F12。对于像我们这样的碎片化函数,此命令特别有趣,因为该函数的所有部分都将出现在屏幕上:

显示 main 函数的流程图可能会很有趣(很长的函数,请继续滚动!

快速浏览流程图就会发现,函数在其”ret”指令(0x4001FA)处只有一个出口。我们可以在那里放置一个断点,让程序运行。现在,在我们这样做之前,让我们重复一遍,在计算机上运行不受信任的代码不是一个好主意。对于此类测试,最好有一个单独的”沙盒”机器,例如使用IDA提供的远程调试工具。因此,当将在调试器下启动新文件时,IDA 会显示一条警告:忽略风险自负。

由于断点位于程序头中,并且程序头受系统写保护,因此我们不能使用普通的软件断点。我们必须使用硬件断点:首先按 F2 创建断点,然后右键单击并选择”编辑断点”以将其更改为”执行”事件上的硬件断点:

设置断点后,我们按 F9 启动调试器。当我们到达断点时,程序将被解压缩到”MEW”段中。我们跳转到那里并将所有内容转换为代码(执行此操作的最快方法是在断点处按 F7)。

现在我们有一个非常好的列表,但有一个主要问题:它是短暂的 – 一旦我们停止调试会话,列表就会消失。

原因当然是列表显示内存内容,并且当进程死亡时,内存将不复存在。如果能够将内存保存到数据库中并在没有调试器的情况下继续分析,那就太好了。我们将考虑将该功能添加到IDA的未来版本中,但与此同时,我们将不得不手动完成。当然,通过”手动”,我们并不意味着在纸上逐个复制字节。我们可以使用内置的IDC语言来实现这一点。

有两个要保存的内容,因为它们将在调试器停止时消失:内存内容和导入的函数名称。可以使用以下 4 行脚本保存内存内容:

auto fp, ea;fp = fopen("bin", "wb");for ( ea=0x401000; ea

脚本运行后,我们将在磁盘上有一个名为”bin”的文件。它将包含”MEW”段中的字节。如您所见,我对十六进制地址进行了硬编码:毕竟,它是一个一次性脚本,旨在运行一次。

我们还必须保存导入的函数名称。例如,查看0x401002的呼叫:

MEW:00401002 call sub_4012DC

如果我们想知道被调用函数的名称,我们按几次Enter键以按照链接进行操作,最后得到名称:

kernel32.dll:77E7AD86kernel32.dll:77E7AD86 kernel32_GetModuleHandleA: ; CODE XREF: sub_4012DCjkernel32.dll:77E7AD86 ; DATA XREF: MEW:off_402000okernel32.dll:77E7AD86 cmp dword ptr , 0

当我们退出调试器时,kernel32.dll段将与其所有名称,指令,函数和所有内容一起从列表中消失。在此之前,我们必须复制函数名称:

auto ea, name;for (ea = 0x401270; ea

现在我们已经运行了这些脚本,我们可以停止调试器(按 Ctrl-F2)并复制回内存内容。”文件,加载”菜单中的”加载其他二进制文件”命令是要走的路:

请注意,没有必要创建细分,它已经存在(清除”创建细分”标志)。此外,地址在段落中指定,即向右移动4。

加载文件,按P在0x401000瞧,你有一个很好的列表:

其余的分析是留给读者的愉快和令人愉快的任务,因为……你猜对了。

以上就是好酷屋教程网小编为您收集和整理的ida pro,ida pro使用教程-ida pro最新使用教程相关内容,如果对您有帮助,请帮忙分享这篇文章^_^

本文来源: https://www.haoku5.com/IT/642be47d89c4e2e63a026af7.html

相关推荐

    热门专题