我正在使用ollydbg和十六进制编辑器。我确认一旦以任何方式对应用程序进行了编辑,其行为就会与正常情况有所不同。关于校验和的任何事情。我专门在寻找MapFileAndCheckSum

,但我试图对此进行推理,我认为必须对文件中的校验和值进行硬编码,以便可以将其与实际校验和进行比较。因此,从开发人员的角度来看,我想知道当应用程序不完整/未编译时,如何才能将校验和值变成硬代码。应用程序有什么方法可以检测到它已被修改?

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

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


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

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

#1 楼

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

#2 楼

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

您可以使用Process Monitor来方便地监视与文件相关的API调用并按进程名称进行过滤,或者仅对所有内容进行bp。 >还要记住,校验和可以存储在应用程序随附的dll /其他任何文件中,也可以从Internet下载。

评论


是的,我十六进制编辑了文件。我对Process Monitor不太熟悉,我在应用程序上找到了CreateFile和ReadFile。计算出的校验和值在过程监视器中是否可见?如果是这样,我该去哪里找?

–GuYY
2014年2月11日下午6:25

您是否更改了磁盘上的原始文件?如果是这样,那么实际上检查磁盘版本的字节基础内存应该没有任何区别。

– PhoeniX
2014年2月11日,7:31

不是100%我了解“在磁盘上”,我尝试使用hex应用程序永久进行hex编辑并检测到更改,但是当我在olly change中执行hex编辑时未检测到。但是我需要将十六进制更改永久化

–GuYY
2014年2月11日在7:38



因此,如果仅更改内存,则在应用程序执行期间不会检测到更改?在磁盘上,我的意思是您使用十六进制编辑器编辑exe,然后执行它。

– PhoeniX
2014年2月11日9:00

是的,如果在olly中打开时未检测到我更改十六进制,那是正确的。在运行之前在olly中打开应用程序后,我正在进行更改。运行前是否可能已完成校验和检查?初始化?

–GuYY
2014年2月11日在9:34



#3 楼

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