这是绕过反调试措施的好方法吗?

逆向工程 部件 静态分析
2021-06-19 14:43:59

我正在分析的这个程序充满了反调试。如果在我启动应用程序之前加载了大多数调试器,它甚至不会运行。

我尝试使用 IDA 对其进行静态分析,但它是用 OOP 语言编写的,并且有很多对寄存器内部指针的调用;所以我一直被困在挖掘中。

所以,我想知道是否可以用调用上方的代码修补 .exe 以记录寄存器值,也许还有指令行。然后我可以看到正在调用哪些函数/方法。

我在 .exe 的末尾添加了一堆零字节,它运行了,所以它似乎没有任何校验和验证。

这可能吗?

3个回答

我认为 CRC 例程在代码内部,对于代码的不同部分可能不止一个。在整个文件的末尾不需要校验和。例如,其可能的字节数总和并将其与寄存器内的值进行比较。您是在调试 win32/64 还是 android 文件?

  1. 我会尝试确定它编写的 OOP 语言可能有工具/IDA 脚本来帮助进行静态分析
  2. 我发现逆转这种应用程序的最简单方法是使用时间旅行调试跟踪(或类似方法)在 Windows 平台上,这是通过从 Windows 10 商店下载 WinDbg 预览版来实现的。下载后,如果需要,您可以复制文件并运行它们,而无需安装到没有 Windows 商店的机器上。更多信息可在时间旅行文档中找到。这些跟踪一旦生成,您就可以逐条指令或断点后退/前进。

例如,我使用此命令显示写入文件的所有文本的时间旅行位置,然后我可以单击生成的超链接以在该文本写入文件时转到精确的寄存器/线程/内存状态

bp kernel32!WriteFile "!position;.printf \"%mu\",@rdx;g"

前进使用g命令,后退g-,向前单t步指令和向后步指令t-

  1. 还要考虑识别使用的反调试技术然后隐藏它,这里有一些例子

这取决于您要实现的目标:

  1. 源代码提取(说用小的修改复制它)
  2. 程序修补

对于第一种情况,我通常会尝试在挂起进程后使用附加的非侵入式调试器。如果这不起作用,我会在暂停进程时SysInternals Process ExplorerWinDbg之后转储整个进程。我使用的Ghidra确实分析了整个转储。我注意到IDA在分析这些转储时存在问题(有时未检测到特殊部分),但您可以将它们组合起来。这将使您能够分析代码。如果代码是自我修改的,你应该使用第二种方法。

对于第二种情况(也是最后的手段),我使用经过特殊修改的 VM 以非侵入式模式远程调试应用程序。VM 是用自定义的 rootkit 制作的,可以隐藏您想要的进程(特别是调试器),这样您就可以在内核模式下调试整个系统而不会被检测到。