我尝试用我糟糕的装配技巧来分析一个dll文件,所以请原谅我,如果我无法实现非常微不足道的事情。我的问题是,在调试应用程序时,我发现我只在调试会话中寻找的代码,在我停止调试器后,地址消失了。 dll看起来不会被混淆,因为许多代码都是可读的。看看screenshot。我正在寻找的代码位于debug376部分的地址07D1EBBF。顺便说一句,我从哪里得到这个debug376部分?
所以我的问题是,如何在不调试的情况下找到此功能? 感谢
更新
好吧,正如我所说,一旦我停止调试器,代码就会消失。我甚至无法通过字节序列找到它(但我可以在调试模式下)。当我启动调试器时,代码不会立即被反汇编,我应该在那个地方添加一个硬件断点,只有当断点被命中时,IDA才会显示反汇编的代码。看看这个screenshot 您会看到我感兴趣的代码行,如果程序未在调试模式下运行,则该行代码不可见。我不确定,但我认为这类似于在运行时解压缩代码,这在设计时是不可见的。
无论如何,任何帮助将不胜感激。我想知道为什么代码被隐藏,直到断点命中(它显示为“db 8Bh”等)以及如何在没有调试的情况下找到该地址(如果可能)。顺便说一下,这可能是来自不同模块(dll)的代码吗?
由于
更新2
我发现debug376是在运行时创建的一个段。这么简单的问题:我怎样才能找出这个细分来自哪里:)
答案 0 :(得分:6)
一旦你的程序运行,你会看到调试器窗口中的代码,而且一旦它不再运行,你似乎没有在原始Hex-Dump中找到相同的操作码?
可能对您有所帮助的是内存快照。暂停程序在您感兴趣的说明附近的执行,以确保它们在那里,然后从“调试器”菜单中选择“记忆快照”。然后,IDA会要求您只复制在定义为“loder segments”的段(PE加载程序从预定义表创建的段)中找到的数据或者似乎当前属于已调试程序的“所有段”(< em>包括,这可能是由解包例程,解密器等创建的。转到“所有细分”,您应该很好地查看内存内容,包括调试细分(细分) 在没有调试应用程序的情况下,在IDA中调试时创建或识别。
您可以随时按 Shift + F7 或点击查看&gt;中的“细分”来查看分段列表打开子视图。
请记住,您尝试分析的程序可能会选择在下次加载时创建其他位置,以便让您更难理解正在发生的事情。
更新以匹配您的第二个问题
当程序从某个地方解包数据时,它必须在某处复制内容。 Windows是一个虚拟机,当你尝试在不允许的位置执行或编写代码时,它现在真的很讨厌。所以任何程序,只要我们在windows下都会以某种方式
所以现在,您应该从程序设备开始,从其默认的入口点(OEP)开始,并查找其中一个函数的调用,可能将内存保护设置为PAGE_EXECUTE或后代。之后可能会出现某种循环解密内存内容,将它们复制到新位置。你可能只想跨过它,取决于你对程序的兴趣是justr将光标放在循环之后(通常是IDA中的粗蓝线),然后从右键单击时出现的菜单中单击“Run to Cursor”。汇编代码。
如果失败,只需尝试在kernel32.dll的VirtualAlloc上放置一个硬件断点,看看在进入return语句时是否有任何兴趣,这样你就可以在Alloc或Protect调用之后执行链带到你的任何地方。< / p>
答案 1 :(得分:1)
您需要找到该代码的相对虚拟地址,无论加载地址如何,这都可以让您再次找到它(这些天几乎所有使用ASLR的系统都非常方便)。 RVA通常计算为virtual address - base load address = RVA
,但是,您可能还需要考虑部分基数。
另一种方法是使用IDA的重新定位工具每次将dll重新绑定到同一地址。