驱动文件在编译时会按照某种算法把这个文件的checksum值写入到PE头中,在加载sys文件的时候,系统会按照这种算法计算一下这个sys文件的checksum值,把结果和PE头中的checksum比较,相等则加载成功,反之则加载失败。
下面是我最近分析过的一个样本的某段代码:
释放的sys文件末尾被追加了随机数据,如果加载的话,操作系统计算该sys文件的checksum值和该文件pe头中的checksum值肯定不一样,必然会导致加载失败,所以在释放了sys文件之后,自己计算checksum值,把这个值写入到PE头中,这样才能保证sys加载成功。我们自己可以测试一下,用FFI打开随便一个sys文件,把其中的checksum值改了,然后用驱动加载工具加载下这个sys文件,结果必然是加载失败,如果把checksum值再改回来,则加载成功。
一点经验:
今后如果遇到释放随机内容的sys,它附近肯定会有计算checksum的代码。