?? exe文件的自身校驗(yàn).txt
字號:
當(dāng)我們完成一個工程,編譯成可執(zhí)行文件后,一般是不希望這個可執(zhí)行文件被人改動的,那么這里就講述一下這是如何做到的。
其實(shí)這并不難,只要一個API函數(shù)就可以完成,這就是MapFileAndCheckSum。這個函數(shù)的作用是1)映象文件,2)從映象文件中接受原始的校驗(yàn)和,它是在編譯時有編譯器寫入文件的,3)計算文件的校驗(yàn)和。如果文件在編譯后被改動,那么原始的校驗(yàn)和就會和計算得出的校驗(yàn)和不同,由此可知文件被改動。下面的程序中,HeadChksum是原始的校驗(yàn)和,Chksum是計算得出的校驗(yàn)和,最后比較他們是否相同來判斷文件是否被改動。
程序是BCB5寫的,要加上imagehlp.lib這個庫,并且Project-Options-Advance Linker中要選中Calculate Checksum。這樣編譯器才會計算校驗(yàn)和并寫入文件。例子程序在這里。
在VC6里又有不同,同樣要連上imagehlp.lib這個庫,然后在Project-Settings-Link中去掉Generate debug info和Link incrementlly選項(xiàng),再選擇Category組合框的Customize,去掉Use program database選項(xiàng),最后在Project Options中加入release,一切OK!
---------------------------------------------------------------------------
#pragma hdrstop
#include windows.h
#include imagehlp.h
---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char argv[])
{
DWORD HeadChksum=1,Chksum=0;
char Fn[512];
GetModuleFileName(GetModuleHandle(NULL),Fn,512);
if(MapFileAndCheckSum(Fn,&HeadChksum,&Chksum)!=CHECKSUM_SUCCESS)
{
MessageBox(NULL,Check error!,Error,MB_OK);
}
else
{
if(HeadChksum!=Chksum)
MessageBox(NULL,File changed.,Warning,MB_OK);
}
return 0;
}
---------------------------------------------------------------------------
但是如果用了VCL,編譯時居然說有沖突,主要是Imagehlp.h這個頭文件的問題。我想最簡單的解決方法是動態(tài)調(diào)用這個函數(shù),LoadLibraryGetProcAddressFreeLibrary等,相信大家都會的,我就不寫代碼了。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -