![]() |
1
2
“exe”文件格式(可能是微软的PE32+文件格式)不包含任何汇编语言。相反,如果包含机器代码(CPU执行的一组数字)和数据;标题描述了程序的不同部分应该加载到内存中的位置。 机器代码通常可以反汇编。这可以通过多种方式防止(自我修改代码、跳转到指令中间等巧妙技巧);但大多数工具(如C编译器、链接器等)不支持自我修改代码或巧妙的技巧,因此它们大多只在极端情况下使用(手工编写的程序集,旨在混淆调试器等)。 另一种理论上可以防止反汇编的方法是加密;可能是操作系统在第一次执行时对页面/代码片段进行解密,并在短时间内未使用时丢弃解密的页面/代码片段。这不受任何操作系统的支持(据我所知);可能是因为它的性能成本很高。
原始机器代码的反汇编不能只是“重新组装”成机器代码。如果修改机器代码,则可以更改原始程序(例如,禁用激活检查)。然而,有一些方法可以防止这种情况,包括: a) 数字签名。其基本思想是,可执行文件的发布者为其文件创建一个安全哈希(“大校验和”),然后用私钥对结果进行加密;其他任何人(操作系统)也可以创建文件的安全哈希,并将其与发布者的预期结果(使用发布者的公钥解密发布者的结果)进行比较,以确定文件发布后是否被修改(如果被篡改,则拒绝执行)。Windows、MacOS、UEFI安全引导等都使用/支持此功能。 b) 没有返回“是或否”结果的激活函数(黑客很容易猜到返回的“正确”值),但有一个返回更复杂内容的激活函数(例如,解密所需配置或机密数据所需的加密密钥),黑客几乎不可能猜到返回的“正确”值。 c) 将激活检查从可执行文件转移到其他文件(动态链接/共享库、操作系统、互联网上的远程服务器等)。 |