首先,我是逆向工程领域的计算机科学初学者。我遇到了一个程序,我想为自己进行逆向工程,看看它是如何工作的,我可以篡改什么以及如何篡改(意味着我还没有获得源代码)。出于明显的原因,我不会给出软件的名称,所以我会将该软件称为“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 等调试器下无法正常运行有点不合逻辑。
所有的答案衷心感谢!