为什么程序在多个调试器下运行失败?

逆向工程 艾达 视窗 ollydbg 调试 可执行
2021-06-25 00:55:39

首先,我是逆向工程领域的计算机科学初学者。我遇到了一个程序,我想为自己进行逆向工程,看看它是如何工作的,我可以篡改什么以及如何篡改(意味着我还没有获得源代码)。出于明显的原因,我不会给出软件的名称,所以我会将该软件称为“X”(多么通用)。

所以情况是,当我启动 IDA Pro 并将“X”放入其中时,它设法成功加载了子例程,但是,许多库函数显然没有命名,例如“unnamed_libname_[number]”,我发现搜索有困难通过它们并分析它们。此外,字符串几乎不存在——只有 Windows API 的函数名称,例如 IsDebuggerPresent 和 ReleaseMutex,它们出现在那里,但我正在努力解决的问题更早出现。

当我在加载它之后运行“X”(它是一个 32 位 .exe 应该很重要)时,程序很快就会导致一个错误,即:“[address]:[address] 处的指令引用了内存在 0x0 处。内存无法写入 -> [大量零](exc.code c0000005,tid [id]”并且它失败的指令显然是

security.dll : [address] mov     byte ptr [eax], 0

我尝试回溯,尽管我觉得这很困难,尤其是因为我不知道要寻找什么或期待什么,所以我尝试了一些其他工具来帮助更好地理解这一点并意识到问题所在。

我尝试的下一个调试器是 OllyDbg,在我加载并运行 .exe 之后,OllyDbg 只是关闭,然后什么也没有发生。没有 .log 文件,没有错误信息,什么都没有。当我尝试附加它时,我的断点不起作用,OllyDbg 的一个功能是“执行直到返回”,当我想按下按钮时使用它。什么也没有发生,Olly 也没有停止这个过程,即使它肯定已经收到了大约一打的回报。

显然,有些奇怪的事情正在发生。

然后我打开 Dependency Walker,因为它可能会提供有关使用的 .dll、它们的功能等的一些信息,希望能够找到有关“security.dll”的信息,实际上在谷歌上几乎没有关于这个 .dll 的结果, 位于 SysWOW64。在 DW 中加载 .exe 需要一些时间,在它准备加载后,它会抛出数百个错误,例如“打开文件时出错。系统找不到指定的文件”。根据某些人的说法,这不是问题 - 这些是在运行时加载的延迟加载依赖项,并且 DW 最初不知道它们位于何处......好吧!人们建议对其进行分析,所以我尝试这样做。当我现在在 Dependency Walker 下(使用默认设置)分析应用程序并运行它时,会抛出一个“应用程序错误”窗口,说“ 应用程序无法正确启动([地址])。单击“确定”关闭应用程序。”并在日志文件中显示以下错误:

Started "[program name].EXE" (process 0x2AF4) at address 0x00400000.  Cannot hook module.
Loaded "NTDLL.DLL" at address 0x77850000.  Cannot hook module.
Loaded "KERNEL32.DLL" at address 0x759D0000.  Cannot hook module.
Loaded "KERNELBASE.DLL" at address 0x747E0000.  Cannot hook module.

其次是:

DllMain(0x747E0000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNELBASE.DLL" called.
DllMain(0x747E0000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNELBASE.DLL" returned 1 (0x1).
DllMain(0x759D0000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNEL32.DLL" called.
DllMain(0x759D0000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNEL32.DLL" returned 1 (0x1).
Injected "DEPENDS.DLL" at address 0x08370000.
DllMain(0x08370000, DLL_PROCESS_ATTACH, 0x00000000) in "DEPENDS.DLL" called.
DllMain(0x08370000, DLL_PROCESS_ATTACH, 0x00000000) in "DEPENDS.DLL" returned 1 (0x1).
Exited "[program name].EXE" (process 0x2AF4) with code -1073741502 (0xC0000142).

在这一点上,我完全不知道我能/应该做什么。很可能所有这些都是某种现象的征兆,这意味着程序中更深层次的东西导致了所有这些,但我不知道它可能是什么,它可能在哪里以及如何分析和修复它。

我认为这可能与反调试技术有关,因为程序运行良好,而无需尝试所有这些花哨的反向操作,但正如我之前所说,我一无所知。

如果有人碰巧知道在几个调试器中可能导致这种行为的原因,出现的症状以及我可以解决这种情况的方法,那将有很大帮助!

另外,反汇编窗口中可能不会出现字符串的原因是什么,例如“选项”或向用户提供的消息?目录中不存在其他可能包含此类数据的文件。

我还认为它可能与混淆/打包有关,尽管 PEiD 在我扫描时没有给出任何结果,而且在 IDA 和 OllyDbg 等调试器下无法正常运行有点不合逻辑。

所有的答案衷心感谢!

2个回答

关于 security.dll,它是 SSPI 函数的标准 Windows DLL。关于程序 X,鉴于它在调试器下运行时不起作用并且不包含人类可读的字符串,它强烈建议它已打包并且解包存根和/或原始程序包含反调试代码。这是相当普遍的。

security.dll抛出的异常可能是与反调试无关的第一次异常,security.dll中有代码处理。但是,如果它与您程序的反调试代码有关,那么它可能看起来像 security.dll 中的异常以充当红鲱鱼并减慢分析速度。

它很可能被打包并使用了多种工具,特别是该.exe文件是使用 Armadillo v.8 或更高版本打包的。Armadillo 有一个带有内置 security.dll 文件的调试阻止程序功能,与 Windows security.dll 文件无关。

Armadillo 使用自己的 security.dll(从内存加载)和一些反调试。某些版本创建两个进程 - 第二个进程首先调试 - 在异常时 - 在第一个进程中解包代码块。

根据以上评论回答。

欢迎来到逆向工程的世界!您面临的是不同种类的反调试技术。您提到了“IsDebuggerPresent 和 ReleaseMutex”。这些是 Windows 注册表中的记录,当您在 Windows 中以调试模式运行程序时,它们会被启用。它们通常与一些会导致调试困难的例程相关联,例如您面临的指令失败 (0x0) 以及许多其他也可能导致根本不让代码执行的事情。这些事情通常是由一些称为打包程序的程序引起的,它在主程序之前工作。手动拆包需要大量的研究和经验。由于您是初学者,我建议您开始使用简单的 C/C++ cmd 程序或任何其他语言可以构建您的可执行文件供您调试。熟悉程序集,以及您的操作系统与内存和处理器的通信方式。在获得一些经验和信心后,开始使用打包程序和打包的可执行文件。最后,但并非最不重要的一点,我会给你最好的免费书籍链接,以便在那里倒车。阅读一些东西,甚至将其作为参考。

您真诚的,一位计算机科学系的同学。