1、檢測主程式大小,防止破解補丁之類:
Function TForm1.GesSelfSf: integer;
var
F: file of byte;
begin
Filemode:=0;
Assignfile(F,'./FileName.exe');
Reset(f);
Result:=Filesize(F);
Closefile(F);
end;
2、檢測建立日期和時間,讓破解補丁實效:
Function TForm1.FinDate:String;
var
t:TDate;
begin
ShortDateFormat:='yyyy-mm-dd';
t:=FileDateToDateTime(FileAge('FileName.exe'));
Result:=DateToStr(t);
end;
3、註冊碼加密函數嵌入數學函數,增加破解難度:
(略)
4、必要時自己刪除自己(主程式):
procedure TForm1.Funll;
var
hModule:THandle;
buff:array[0..255]of Char;
hKernel32:THandle;
pExitProcess,pDeleteFileA,pUnmapViewOfFile:Pointer;
begin
hModule:=GetModuleHandle(nil);
GetModuleFileName(hModule, buff, sizeof(buff));
CloseHandle(THandle(4));
hKernel32:=GetModuleHandle('KERNEL32');
pExitProcess:=GetProcAddress(hKernel32, 'ExitProcess');
pDeleteFileA:=GetProcAddress(hKernel32, 'DeleteFileA');
pUnmapViewOfFile:=GetProcAddress(hKernel32, 'UnmapViewOfFile');
asm
LEA EAX, buff
PUSH 0
PUSH 0
PUSH EAX
PUSH pExitProcess
PUSH hModule
PUSH pDeleteFileA
PUSH pUnmapViewOfFile
RET
end;
begin
Funll;
end;
end;
具體怎麼使用,那要看你自己的意願了和需要了。反正我是這樣做的,我的軟體ADSL撥號計時器只在很早版本上出過註冊機,後來的v3.70出過破解補丁——其實只是破掉了啟動時提示註冊的對話方塊,實質上根本沒破解。用了上述的著法以後,到現在的v5.28版本,再沒有過什麼破解補丁或註冊機。
如果現在的v5.28版本誰能破解,將立即公布程式源碼。
E-Mail: uncleme@126.com http://www.uncleme.com
附:註冊機破解法的原理以及應對方法
認識註冊機破解法
顧名思義,寫註冊機來破解軟體註冊的方法,就是模仿你的註冊碼產生演算法或者逆向注 冊碼驗證演算法而寫出來的和你一模一樣的註冊機。如果被寫出註冊機,你的軟體只好免費了。或者你必須更換演算法,但以前注過冊的合法使用者都得被迫更換註冊碼了。
Cracker要寫註冊機必須詳細研究你軟體的驗證模組,這必須先將你的軟體脫殼,再反組譯碼或者用調試器跟蹤。市面上許多加殼和保護軟體都吹噓不可能被脫殼,但到目前為止沒有一個軟體兌現了自己的諾言。由於CPU最終執行的都是有效指令,所以等你的程式自解壓完成後再從記憶體中Dump出來就可以實現脫殼。因此不要在殼上面花很多功夫,因為沒有這個必要。
第一招:製造假相
反組譯碼和調試器跟蹤都是不可能防止的,因為所有的Win32程式都必須通過API來調用Windows系統中的關鍵DLL的(如Kernel32.dll、GDI32.dll等),然而API是可以Hook的。我們只能從自己的代碼著手來保護我們的勞動果實了。
為了自己調試和以後維護的方便,我們一般採用有意義的名字給我們的函數命名,可這給了Cracker可乘之機。例如這樣的函數是什麼意思大家應該一目瞭然吧?IsRegistered(),IsLicensed(),LicenseVerify(),CheckReg()……這樣Cracker就可以輕鬆地從數千個函數中找到他的目標——你的註冊碼校正函數!而且破解Delphi編寫的軟體還有一件TMG小組的破解利器——DeDe。它可以輕鬆地看到你軟體裡的Form、Unit和函數名,還可以反組譯碼一部分代碼,更可以和Win32DASM合作反組譯碼更多的代碼,對Delphi編出的程式威脅極大。
為了不給Cracker創造溫馨舒適的破解環境,要故意混亂(Obfuscate)我們的代碼,將軟體中所有的函數名全部替換成隨機產生的函數名。例如Func_3dfsa_fs32zlfv這個函數是什麼意思?恐怕只有天知道了。網上有現成的代碼混亂器,按你使用的程式設計語言的種類可以找到一些。但要注意,只有當你要發布軟體時才使用它,而且一定注意備份原始碼。否則,當你看不懂你自己的代碼時就著急了:)
第二招:用公匙,並改名
另外,一定要使用公開密匙演算法保護你的軟體。RSA、DSA和El Gamal之類的演算法都可以從網上找到。但注意:將你演算法單元中所有涉及到演算法名稱的字串全部改名。避免被Cracker發現你用的演算法而模仿寫出註冊機來!你還可以張冠李戴,明明用的DSA,將名字全部替換成RSA。
其它演算法,如對稱演算法和Hash演算法也要注意改名,否則這樣:
EncryptedCode = Blowfish(MD5(UserName),MD5(Key));
//你的密碼編譯演算法,使用了Blowfish(對稱演算法)和MD5(Hash演算法)
雖然那些Cracker不瞭解Blowfish和MD5演算法的原理,也不會逆向推測它們,但他們瞭解你的校正演算法的流程和演算法名,便可馬上從網上找到類似的Blowfish和MD5演算法包,從而類比你的軟體仿造出註冊機。
如果你用不常見的,演算法如Skipjack(NASA美國航天局標準演算法)、LOKI、3-WAY、Safer之類不出名但保密程度很高的演算法,並且全部改名,這樣就會傷透他們腦筋了。
當然,最好把Hash演算法也全部改名,會給他們製造更多的困難。但注意,MD5和SHA之類的Hash初始值會被Cracker從記憶體中找到,這樣他就知道你用的Hash了。所以建議同時使用MD5的變形演算法Ripe-MD(RMD)128或160或其它的Hash,如Tiger、Haval等演算法。
第三招:阻止別人調試
還有一點,調試器對我們的威脅很大,我們不會讓Cracker們舒舒服服地使用SoftICE、TRW或OllyDbg來調試我們的程式。除了常用的MeItICE方法外,這裡我給一個筆者寫的方法:
{檢查自己的進程的父進程是否為Explorer.exe,否則是被調試器載入了}
{不過注意,控制台程式的父進程在WinNT下是Cmd.exe!}
{注意載入TlHelp32.pas單元}
procedure CheckParentProc;
var //檢查自己的進程的父進程
Pn: TProcesseNtry32;
sHandle:THandle;
H,ExplProc,ParentProc:Hwnd;
Found:Boolean;
Buffer:array[0..1023]of Char;
Path:string;
begin
H:= 0;
ExplProc:= 0;
ParentProc:= 0;
//得到Windows的目錄
SetString(Path,Buffer)
GetWindowsDirectory(Buffer,Sizeof(Buffer)- 1));
Path:= UpperCase(Path)+ '/EX PLORER.EXE';//得到Explorer的路徑
//得到所有進程的列錶快照
sHandle:= CreateToolHelp32Snap Shot(TH32CS_SNAPALL,0);
Found:= Process32First(sHandle,Pn);//尋找進程
while Found do //遍曆所有進程
begin
if Pn.szExeFile = ParamStr(0)then //自己的進程
begin
ParentProc:= Pn.th32ParentProcessID://得到父進程的進程ID
//父進程的控制代碼
H:= OpenProcess(PRO CESS_ALL_ACCESS,True,Pn.th32Parent ProcessID);
end
else if UpperCase(Pn.szExeFile)= Path then
ExplProc:= Pn.th32ProcessID;//Ex plorer的PID
Found:= Process32Next(sHandle,Pn);//尋找下一個
end;
//父進程不是Explorer,是調試器……
if ParentProc ExplProc then
begin
TerminateProcess(H,0);//殺之!除之而後快也! :)
//你還可以加上其它什麼死機代碼來消遣消遣這位可愛的Cracker:)
end
end
你可以在Delphi或者VC中試試,這樣可以把Delphi和VC殺掉了,因為你現在用的是Delphi和VC的內建調試器來運行你的程式。調試的時候你還是把它的注釋刪掉吧,發布時別忘記啟用喲!
第四招:保護字串
最後一個問題,這也是一個非常重要的問題:保護你的字串!字串在註冊模組中非常重要!當一個富有經驗的Cracker破解你的軟體時,首先做的就是竊取你的字串。比如他會輸入錯誤的註冊碼,得到你關於錯誤註冊碼的提示,通常是“無效的註冊碼,請重新輸入!”或者“Invalid key(please input again)”等等,然後用OllyDbg進行斷點調試或者用WinDASM、IDA Pro等靜態分析工具在被他脫殼後的程式中尋找那個字串,找到後進行分析。因此,請一定加密你的字串! 使用時再臨時解密出來,而且要盡量少使用訊息提示框,避免被Cracker找到漏洞。加密字串不需要太複雜的演算法,隨便找一個快速的對稱演算法就可以了。
最後提醒大家一句,不要在加密上花太多的功夫!你應該把更多的時間和精力都用來完善你的軟體,這樣會更合算。借用一位前輩的話來忠告大家吧:花點時間考慮你自己的軟體,看看它是否值得保護?如果沒人用你的軟體,保護也就沒有意義了,不要過高估計你的軟體“對世界的重要性”!