PE CheckSum生成代码
 

作者:陆麟
转载请征得作者同意.
2002.9.13



一段时间来一直很忙, 期间遇到公司变故, 工作更换, 很久没用更新主页. 今天再度开始.
PE文件中有个字段叫CHECK SUM. 用于检验PE文件的完整性. NT启动时的会检验文件的CHECKSUM, 以确保加载的文件是完整的文件而不是破损的文件.
在开发EXE/DLL时, 一般情况下生成CHECK SUM需要在LINK时加/RELEASE. 这样, CHECK SUM就被加入PE文件中. 否则,CHECK SUM为0. LINK不生成CHECK SUM. 如果需要写个修改PE的文件, 又涉及修改CHECKSUM, 那么通常的做法是调用IMAGEHLP.DLL的CheckSumMappedFile函数来获得.
在比较个别情况下, 并没用条件使用IMAGEHLP.DLL, 嘿嘿, 这种状况可不是谁都能碰到的.:) 那下面的代码就有用了.

汇编原型:
CheckSumFile PROTO ,:DWORD,:DWORD

实现:
CheckSumFile PROC USES esi ecx edx lpFile:DWORD, dwFileLen:DWORD
    xor    edx, edx
    mov    esi, lpFile
    mov    ecx, dwFileLen
    shr    ecx, 1
@CSumLoop:
    movzx    eax, word ptr [esi]
    add    edx, eax
    mov    eax, edx
    and    edx, 0ffffh   
    shr    eax, 10h
    add    edx, eax
    add    esi, 2
    loop    @CSumLoop
    mov    eax, edx
    shr    eax, 10h
    add    ax, dx
    add    eax, dwFileLen
    ret
CheckSumFile ENDP

重新开张第一篇, 希望大家喜欢.:)