【问题标题】:What's debug section in IDA Pro?IDA Pro 中的调试部分是什么?
【发布时间】:2012-06-09 01:07:46
【问题描述】:

我尝试用我糟糕的汇编技能分析一个 dll 文件,如果我无法实现非常琐碎的事情,请原谅我。我的问题是,在调试应用程序时,我只在调试会话中找到我要查找的代码,在我停止调试器后,地址就消失了。 dll 看起来没有被混淆,因为许多代码都是可读的。看看screenshot。我要查找的代码位于 debug376 部分的地址 07D1EBBF。顺便说一句,我从哪里得到这个 debug376 部分?

所以我的问题是,如何在不调试的情况下找到此功能? 谢谢

更新

好的,正如我所说,一旦我停止调试器,代码就会消失。我什至无法通过字节序列找到它(但我可以在调试模式下)。当我启动调试器时,代码不会立即反汇编,我应该在那个地方添加一个硬件断点,只有当断点被命中时,IDA才会显示反汇编代码。看看这个screenshot 您会看到我感兴趣的代码行,如果程序未在调试模式下运行,则该代码行不可见。我不确定,但我认为这类似于在运行时解包代码,在设计时不可见。

无论如何,我们将不胜感激。我想知道为什么该代码被隐藏,直到断点命中(它显示为“db 8Bh”等)以及如果可能的话如何在不调试的情况下找到该地址。顺便说一句,这可能是来自不同模块(dll)的代码吗?

谢谢

更新 2

我发现 debug376 是在运行时创建的一个段。这么简单的问题:我怎样才能知道这个片段来自哪里:)

【问题讨论】:

    标签: reverse-engineering disassembly ida


    【解决方案1】:

    因此,一旦您的程序运行,您就会在调试器窗口中看到代码,并且一旦它不再运行,您似乎在原始 Hex-Dump 中找不到完全相同的操作码?

    拍摄内存快照可能会对您有所帮助。在您感兴趣的指令附近暂停程序的执行以确保它们在那里,然后从“调试器”菜单中选择“Take memory snapshot”。 IDA 将询问您是否只复制在定义为“加载程序段”(PE 加载程序从预定义表中创建的段)或当前似乎属于被调试程序的“所有段”的段中找到的数据(包括,可能是由解包例程、解密器等创建的)。选择“All segments”,您应该可以看到内存内容,包括您的调试段(一个段 在不调试应用程序时在 IDA 中创建或识别)。

    您可以随时通过按Shift+F7或在查看中点击“Segments”来查看细分列表 > 打开子视图

    请记住,您尝试分析的程序可能会选择在下次加载分段时在其他位置创建分段,以使您更难理解发生了什么。

    更新以匹配您的第二个问题

    当程序从某处解压数据时,它必须在某处复制内容。 Windows 是一个虚拟机,现在当你试图在不允许的位置执行或编写代码时,它会让你非常讨厌。所以任何程序,只要我们在windows下都会以某种方式

    1. 注册一堆新内存或覆盖它已经拥有的内存。这通常是通过调用类似 malloc 之类的东西来完成的[你的代码看起来好像它可能是一种非常密集的指针语言......也许是 VB 或面向对象的东西] 它主要归结为对 VirtualAlloc 或 VirtualAllocEx 来自 Windows 的 kernel32.dll,有关其调用约定的更多详细信息,请参阅 http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887(v=vs.85).aspx
    2. 如果在调用VirtualAlloc 时可能尚未设置Windows 异常处理并将内存范围标记为可​​执行。这将通过再次从 kernel32.dll 调用 VirtualProtect 来完成。有关更多信息,请参阅 http://msdn.microsoft.com/en-us/library/windows/desktop/aa366898(v=vs.85).aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa366786(v=vs.85).aspx

    所以现在,您应该在程序中迈出一步,从其默认入口点 (OEP) 开始,并寻找其中一个函数的调用,可能将内存保护设置为 PAGE_EXECUTE 或后代。之后可能会出现某种循环解密内存内容,将它们复制到新位置。您可能只想跳过它,这取决于您对程序的兴趣,只需将光标放在循环之后(通常是 IDA 中的粗蓝线),然后从右键单击出现的菜单中单击“运行到光标”汇编代码。

    如果失败,只需尝试在 kernel32.dll 的 VirtualAlloc 上放置一个硬件断点,看看在进入 return 语句时是否有任何有趣的事情,以便在 Alloc 或 Protect 调用之后执行链将带你到任何地方。

    【讨论】:

      【解决方案2】:

      您需要找到该代码的相对虚拟地址,这将允许您再次找到它,而不管加载地址如何(对于现在几乎所有使用 ASLR 的系统来说都非常方便)。 RVA 通常计算为virtual address - base load address = RVA,但是,您可能还需要考虑部分基数。

      另一种方法是每次使用 IDA 的变基工具将 dll 变基到相同的地址。

      【讨论】:

      • 但是我停止调试后找不到字节序列,代码就消失了,消失了:|
      • @Davita:这就是为什么你需要在开始调试时记下它的地址和模块的基础。
      • 对不起,我真的是这里的初学者。如果你不介意的话,你能给我一步一步的指导吗? :( 再次非常感谢您的帮助
      • @Davita:不幸的是,我只使用 IDA 进行静态流分析,因为我更喜欢使用 ollydbg 进行调试(另外我没有任何 x64 应用程序要调试),有一本关于使用 IDA 进行调试可能会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多