欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

好久没发贴,贴个tip:PE 头部校验和(checksum)的计算 (3千字)

好久没发贴,贴个tip:PE 头部校验和(checksum)的计算 (3千字)

;                    如何计算PE头部校验和
;
;
;你应该已经见过LoadPE的校正PE头checksum的功能,想给你自己的工具加一个这种功能?
;yes,it's easy!let's GO!GO!GO!
;
;PE checksum计算算法:
;PE文件修改的时候一般可不用计算checksum,但是由于OS对系统文件校验其checksum
;因此修改PE的时候有时会需要更新其checksum值,一般可以用imagehelp.dll中的函数
;进行计算,不过实际上这玩意很简单,我们完全可以自己来做.假设PE文件大小x,若为奇数
;字节则用0补足文件使x为偶数,然后取文件中所有的字进行带进位加法操作(adc),最后和
;文件大小进行带进位加法操作(adc)得到结果即为checksum结果.当然在计算前应置pe.CheckSum域为0.
;具体见下面的cal_checksum例程.
;enjoy it.
;                                              YJ.Hume.冷雨
include '%fasinc%/win32a.inc'
include '%fasinc%/pestruc.h'
struc OPENFILENAME
{
  .lStructSize        dd      ?
  .hwndOwner          dd      ?
  .hInstance          dd      ?
  .lpstrFilter        dd      ?
  .lpstrCustomFilter  dd      ?
  .nMaxCustFilter    dd      ?
  .nFilterIndex      dd      ?
  .lpstrFile          dd      ?
  .nMaxFile          dd      ?
  .lpstrFileTitle    dd      ?
  .nMaxFileTitle      dd      ?
  .lpstrInitialDir    dd      ?
  .lpstrTitle        dd      ?
  .Flags              dd      ?
  .nFileOffset        dw      ?
  .nFileExtension    dw      ?
  .lpstrDefExt        dd      ?
  .lCustData          dd      ?
  .lpfnHook          dd      ?
  .lpTemplateName    dd      ?
  .size=$-.lStructSize
}
virtual        at 0
ofn    OPENFILENAME       
end    virtual
;-----------------------------------------
.data
opf OPENFILENAME
lpStrFilter    db "PE Files",0,"*.exe;*.dll",0
                db "WDM Files",0,"*.sys",0,0
zTit            db "Hume's PE checkSum 计算器,2K2",0
initial_dir    db ".",0
ms000          db "File OPERATION ERR!",0
fmt            db "The PE-CheckSum of Current file IS:%X",0
buf:            rb 256
.code
StArT:
        mov    [opf.lStructSize],ofn.size
        mov    [opf.lpstrFile],buf
        mov    [opf.nMaxFile],256       
        mov    [opf.lpstrFilter],lpStrFilter
        mov    [opf.lpstrTitle],zTit
        mov    [opf.lpstrInitialDir],initial_dir
        mov    [opf.Flags],81000h
        invoke    GetOpenFileName,opf
        or      eax,eax
        je      exit
       
        mov    eax,ofn.lpstrFile
        invoke    CreateFile,[opf.lpstrFile],0x80000000,0,0,3,0,0
        inc    eax
        je      err
        dec    eax
        push    eax
        invoke    GetFileSize,eax,0
        push    eax
        push    eax
     
        invoke    VirtualAlloc,0,eax,1000h,4
        or      eax,eax
        je      err
        pop    ecx
        push    eax
        mov    esi,eax
        mov    edx,[esp+8]
        invoke    ReadFile,edx,eax,ecx,esp,0
        mov    edi,[esi+3ch]
        add    edi,esi
        mov    dword [edi+peh.CheckSum],0
       
        mov    ecx,[esp+4]
        inc    ecx
        shr    ecx,1
        xor    ebp,ebp
        clc
    cal_checksum:
        adc    bp,word [esi]
        inc    esi
        inc    esi
        loop    cal_checksum
        mov    ebx,[esp+4]
        add    ebp,ebx
       
        pop    eax
        invoke    VirtualFree,eax,ebx,4000h
       
        pop    eax
        pop    eax
        invoke    CloseHandle,eax
        invoke    wsprintf,buf,fmt,ebp
        invoke    MessageBox,0,buf,zTit,40h     
       
       
  exit:
        invoke    ExitProcess,0
       
    err:
        invoke    MessageBox,0,ms000,zTit,20h
        jmp    byte exit
       
.end StArT

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功