应用程序有哪些方法可以检测到它已被修改?

逆向工程 ollydbg 十六进制
2021-06-19 02:45:57

我正在使用 ollydbg 和一个十六进制编辑器。我确认一旦以任何方式编辑应用程序,它的行为就会与正常情况不同。

我的第一个想法是该文件正在检查校验和值,因此我查看了 olly 中的模块间调用,但没有看到有关校验和的任何信息。我是专门找MapFileAndCheckSum

但我试图将其推理出来,我认为必须在文件中硬编码校验和值,以便可以将其与实际校验和进行比较。所以我想知道从开发人员的角度来看,当应用程序未完成/编译时,如何将校验和值设为硬编码

这让我想到了这个问题。应用程序有哪些方法可以检测到它已被修改?

------- 编辑 ------- 附加信息 ------

我一直在做一些测试,我不得不说我对校验和值的存储位置感到困惑。

  1. 没有与互联网的连接。
  2. 应用程序仅附带一个 dll(我手动提取了安装程序文件)该 dll 文件很旧,并且在应用程序之前最后一次修改。我什至将它与没有此校验和检查且 dll 相同的应用程序的早期版本进行了比较。
  3. 我教过安装程序可能会在注册表中输入校验和值,因此我将 .exe 和 .dll 提取到从未使用过安装程序的单独计算机上。变化仍在检测中!
  4. 这绝对是一个校验和测试,因为我已将单个字节的填充从 00 更改为 20,并且检测到了更改。如果我编辑回 00 应用程序执行正常。

所以现在我想知道是否有可能在输入硬编码校验和值之前计算校验和是什么?我确实意识到在更改硬编码校验和值时实际校验和值会发生变化。我想知道在硬编码和查找匹配项时是否有任何方法可以预先确定校验和值。似乎不可能,但考虑到这种情况,我想不出任何其他方法。

3个回答

应用程序只能检查自身的一部分,不包括校验和部分。您还可以进行运行时解密,如果被篡改,将会被错误地解密。在这个领域几个 研究 项目

我假设您已经对实际文件进行了十六进制编辑。在这种情况下,应用程序可能正在从磁盘读取自身并手动计算校验和。它很可能使用以下方法之一将文件加载到内存中:

  • CreateFile/ OpenFilewith ReadFile(以及它们所有的后缀形式)
  • CreateFileMappingMapViewOfFile(以及它们所有的后缀形式)

您可以使用 Process Monitor 方便地监控与文件相关的 API 调用并按进程名称过滤,或者只是 bp 一切。

还要记住,校验和可以存储在应用程序附带的 dll/任何其他文件中,或从 Internet 下载。

MapFileChecksum 用于使用 Microsoft 的自定义校验和计算存储在 IMAGE_OPTIONAL_HEADER 结构中的可执行文件的校验和。一旦可执行文件被修改,它通常用于重新计算校验和值,因为 Windows 内核在加载驱动程序和系统文件之前检查校验和。但是对于您的应用程序,应用程序可能使用任何类型的校验和(crc32、adler 等),甚至可能使用哈希函数。所以仅仅打破 MapFileChecksum 可能还不够。由于它必须读取它自己的二进制文件来计算校验和/哈希,因此中断文件操作函数并从那里开始。