加解密入門基礎知識

不少人都想學習解密,這東西剛入門時會讓人沉迷進去,能夠飯不吃、覺不睡。出現這種現像,也許是解密知足了人們的獵奇內心吧。但掌握這方面技術,對自身的 提升確實有好處。能夠經過跟蹤軟件,提升本身的調試技能,而且能瞭解他人程序思路,使本身寫出更好的程序。研究解密技術有助於掌握一些系統底層知識,系統 底層知識絕對是構造起大型軟件的堅實基礎。許多程序發展,都經歷了這一鍛鍊過程的。 而大多數人可能認爲解密是一門高深的學問。形成這種緣由是之前這方面 的技術資料缺少,從而將「解密」這一技能「神」化了。初學者通常不知從何下手,因爲沒方向,花費了大量時間和精力,走了很多彎路。這裏就給對這方面感興趣 的讀者指明一個方向。
 
討論前,先了解一下計算機中的程序。高級語言編寫的程序,會編譯成機器語言在CPU中執行,如Visual C++等。因爲機器語言與彙編語言是一一對應 的,所以就可將機器語言轉化成彙編語言,這個過程稱之爲反彙編。而彙編語言可能讀性是比較好的,這樣就可分析程序流程,解析其功能了,這個過程就是解密 (俗稱破解)。也就是說,解密的基礎是創建在彙編語言級別上的,所以想涉足這一領域的朋友,彙編語言必定得學好。彙編語言是大學計算機的必修課,這方面的 書籍品種不少,雖然大多書本是以DOS彙編爲講解平臺,但對理解彙編指令功能是沒影響的。php

等彙編學好了,此時通常的破解文章己能看懂了,但爲了水平提升的更快些,建議再掌握Win32編程。Win32程序設計就是API方式的Windows編 程,學習Windows API將使您更深刻地瞭解Windows工做方式。此類書籍有Charles Petzold著的《Windows程序設計》 (以VC來說解)。另外一本是羅雲彬著的《Windows環境下32位彙編語言程序設計》,它以MASM彙編爲講解平臺。html

學習解密其實很累的,需花費大量的時間,並且常常會碰壁,三五天毫無進展是極爲日常的事情。這時你可能有點想退卻,其實你不要着急,只要你認真學習,成功 就在眼前。沒有人是生來就什麼都會的,若是你有問題,就大膽的去問你周圍的人。學解密的祕訣就是勤奮+執着!記住並能作到這兩點,你會變得很優秀的。
 
等你解密入門後,建議再看看Matt Pietrek、Jeffrey Ritcher等大師的專著,這些書是每一個程序員都應該閱讀的: 《Windows 95 System Programming Secrets》(中文譯名《Windows 95 系靳程式設計大?祕》), 《windows高級編程指南》,《Windows2000編程技術內幕》,《Win32系統編程―Windows 2000應用程序開發指南》等。這 樣,你就對系統底層有必定的瞭解了。到了這個水平後,就可朝軟件加密這塊發展了,例如編寫本身的加殼軟件等。程序員

軟 件的加密與解密是一個迷人的研究領域,它幾乎能夠與任意一種計算機技術緊密結合――密碼學、程序設計語言、操做系統、數據結構。而因爲這樣或者那樣的原 因,對於這一領域的關注程度一直還處於低溫狀態。而這兩本書相信會爲更多對知識懷有渴望的朋友多開闢一條走向這個領域的道路,而且進而推進這個領域的不斷 發展。 算法

第一課 逆向分析基礎知識
 
1.1 調用約定 
 
在分析彙編代碼時老是要遇到無數的Call,對於這些Call,儘可能要根據Call以前傳遞的參數和Call的返回值來判斷Call的功能。傳遞參數的工做必須由函數調用者和函數自己來協調,計算機提供了一種被稱爲棧的數據結構來支持參數傳遞。
 
當參數個數多於一個時,按照什麼順序把參數壓入堆棧。函數調用後,由誰來把堆棧恢復。在高級語言中,經過函數調用約定來講明這兩個問題。常見的調用約定有:
 
http://bbs.pediy.com/upload/bbs/faq/call.gif 
 
 
【例】按__stdcall約定調用函數test2(Par1, Par2) 
 
 
push par2 ; 參數2
push par1 ; 參數1
call test2;
{
push ebp ; 保護現場原先的EBP指針
mov ebp, esp ; 設置新的EBP指針,指向棧頂
mov eax, [ebp+0C] ; 調用參數2
mov ebx, [ebp+08] ; 調用參數1
sub esp, 8 ; 若函數要用局部變量,則要在堆棧中留出點空間

add esp, 8 ; 釋放局部變量佔用的堆棧
pop ebp ; 恢復現場的ebp指針
ret 8 ; 返回(至關於ret; add esp,8)
}
 
 
其堆棧調用示意圖:
 
http://bbs.pediy.com/upload/bbs/faq/callesp.gif 
 
 

1.2 局部變量 
 
在子程序內部說明的變量稱爲局部變量,局部變量的做用域是其所在的子程序。從彙編角度來看,局部變量就是一個臨時堆棧緩存,用完釋放。
例如這個實例: 附件:local.zip 
 
其反彙編代碼以下(紅體字爲局部變量):
 
00401000 >/$ 6A 04 push 4 ; /Arg2 = 00000004
00401002 |. 6A 03 push 3 ; |Arg1 = 00000003
00401004 |. E8 16000000 call 0040101F ; \Add.0040101F
00401009 |. 8BD8 mov ebx, eax
0040100B |. 6A 00 push 0 ; /ExitCode = 0
0040100D \. FF15 00204000 call [<&KERNEL32.ExitProcess>] ; \ExitProcess
 
 
0040101F /$ 55 push ebp ; 保護現場原先的EBP指針
00401020 |. 8BEC mov ebp, esp ; 設置新的EBP指針,指向棧頂
00401022 |. 83EC 04 sub esp, 4 ; 分配局部變量全部空間
00401025 |. 8B45 0C mov eax, [ebp+C] ; 調用參數2
00401028 |. 8B5D 08 mov ebx, [ebp+8] ; 調用參數1
0040102B |. 895D FC mov  [ebp-4] , ebx ; 參數1放局部變量裏
0040102E |. 0345 FC add eax, [ebp-4] ; 參數2與局部變量相加
00401031 |. 83C4 04 add esp, 4 ; 釋放局部變量全部空間
00401034 |. 5D pop ebp ; 恢復現場的ebp指針
00401035 \. C2 0800 retn 8
 
 
1.3 返回值 
 
在調試程序時,不要見Call就跟進,在Call以前所作的全部PUSH動做以及對寄存器的操做均可能是在給函數傳遞參數,而函數的返回值通常都放在EAX裏面,固然這個值多是一個指針,指向一個數據結構。從彙編角度來看,主要有以下形式:
 
1)經過寄存器返回函數值;
2)經過參數按引用方式返回函數值;
3)經過全局變量返回函數值;
4)經過處理器標誌返回函數值;
通常狀況下,由retrun操做符返回的值放在EAX寄存器之中,若是結果超過這個寄存器的位容量,那麼該結果的高32位會加載到EDX寄存器中。 若是 返回一個含有幾百個字節的結構或者一個近似大小的對象,編譯器會在不告訴程序的狀況下,給函數傳遞一個隱式參數,這個指針指向保存的返回結果。
 
 
1.4 啓動函數 
 
在編寫Win32應用程序時,都必須在源碼裏實現一個WinMain函數。但Windows程序執行並非從WinMain函數開始的,首先被執行的是啓 動函數相關代碼,這段代碼是編譯器生成的。啓動代碼完成初始化進程,再調用WinMain。標準編譯器一般包含啓動代碼在內的庫文件源碼,例如 Visual C++中,啓動代碼存放在CRT\SRC\crt0.c文件中。
全部的C/C++運行時啓動函數的做用基本都是相同的:檢索指向新進程的命令行指針,檢索指向新進程的環境變量指針,全局變量初始化,內存堆棧初始化等。當全部的初始化操做完畢後,啓動函數就調用應用程序的進入點函數。
調用WinMain以下所示:
GetStartupInfo (&StartupInfo);
Int nMainRetVal = WinMain(GetModuleHandle(NULL),NULL,pszCommandLineAnsi,(StartupInfo.dwFlags&STARTF_USESHOWWINDOW)?StartupInfo.wShowWindow:SW__SHOWDEFAULT);
當進入點返回時,啓動函數便調用C運行庫期的exit函數,將返回值(nMainRetVal)傳遞給它,進行一些必要處理,最後調用系統函數ExitProcess退出。 其餘一些編譯器,如Delphi、BorLand C++開發包中都有相應的啓動代碼。
在絕大數狀況下,咱們對啓動代碼並不須要關心。 對於逆向分析人員來講,首要的任務是找到Winmain函數。 
 
WinMain函數原型以下:
int WINAPI WinMain(
HINSTANCE hInstance, // 當前實例的句柄
HINSTANCE hPrevInstance, // 前一個實例的句柄 
LPSTR lpCmdLine, // 命令行的指針 
int nCmdShow // 窗口的顯示狀態
); 
其中參數hInstance通常經過GetModuleHandleA函數進行獲取的,這對識別WinMain函數有些幫助。另外,對WinMain的調 用一般放在啓動函數代碼結尾部分,後面一般跟着諸如exit或XcptFilter以內的兩、三個函數。例以下面這段代碼:
.text:004010DC push eax ; nShowCmd
.text:004010DD push [ebp+lpCmdLine] ; lpCmdLine
.text:004010E0 push esi ; hPrevInstance
.text:004010E1 push esi ; lpModuleName
.text:004010E2 call ds:GetModuleHandleA
.text:004010E8 push eax ; hInstance
.text:004010E9 call WinMain(x,x,x,x)
.text:004010EE mov [ebp+var_60], eax
.text:004010F1 push eax ; int
.text:004010F2 call _exit
 
許多開發人員能夠獲得啓動源代碼的狀況下對啓動代碼進行修改,這樣,程序的執行可能不是從WinMain開始,而是從任何其餘的函數開始。
 
1.5 API函數 
 
如今不少講Windows程序設計的書都是講基於MFC庫和OWL庫的Windows設計,對Windows實現的細節都鮮有討論,而調試程序都是和系統 底層打交道,因此有必要掌握一些Win32 API函數的知識,這樣咱們可快捷地找出程序調用錯在哪?是哪一個參數出了問題。
Windows程序模塊包括KERNEL、USER和GDI,其中KERNEL完成內存管理、程序的裝入與執行和任務調度等功能,它須要調用原 MS?DOS中的文件管理、磁盤輸入輸出和程序執行等功能;USER是一個程序庫,它用來對聲音、時鐘、鼠標器及鍵盤輸入等操做進行管理;GDI是一功能 十分豐富的子程序庫,它提供了圖形與文字輸出、圖象操做和窗口管理等各類與顯示和打印有關的功能。上述KERNEL、USER和GDI模塊中的庫函數可被 應用程序調用,也可被其餘程序模塊調用。把包含庫函數的模塊稱爲輸出者(export)。你應明白爲何跟蹤軟件時常常在KERNEL32!.text和 USER32.text等系統領空轉的問題吧。
 
這裏列出幾個常常碰到的Win 32 API函數,它們都是存在Windows系統核心文件KERNEL32.DLL中和視窗管理文件USER32.DLL中。
Windows函數是區分字符集的:A表示ANSI,W表示Wide,即Unicode (Wide character-set),前者就是一般使用的 單字節方式,但這種方式處理象中文這樣的雙字節字符不方便,容易出現半個漢字的狀況。然後者是雙字節方式,方便處理雙字節字符。Windows的全部與字 符有關的函數都提供兩種方式的版本。儘管你編程時使用GetWindowText,但實際上編譯程序會根據設置自動調用GetWindowTextA或 GetWindowTextW。函數的最後一個字母告訴咱們函數是使用單字節仍是雙字節字符串。
 
一、 Hmemcpy函數
void hmemcpy(hpvDest, hpvSource, cbCopy) 
void _huge* hpvDest; // 目的數據地址 
const void _huge* hpvSource; // 源數據地址 
long cbCopy; // 數據大小 (Bytes) 
這個函數在KERNEL32.DLL中,它很經常使用,俗稱萬能斷點,但通常的編程書籍上不多提到,緣由它是底層的東西,沒有特殊須要,通常不直接調用。但的確它是頗有用的!有意思的是它執行的操做很簡單,只是將內存中的一塊數據拷貝到另外一個地方。
注意:此函數只在Windows 9x系統上有效,在Win NT/2K系統上相關的函數是memcpy,但在Win NT/2K上不一樣於Windows 9x上,不多再調用memcpy來處理數據了,用此函數設斷基本上什麼也攔不住。
 
二、 GetWindowText函數
此函數在USER32.DLL用戶模塊中,它的做用是複製指定窗口中的字符到緩衝區。函數原型:
int GetWindowText(
HWND hWnd//欲獲取文字的那個窗口的句柄 
LPTSTR lpString //預約義的一個緩衝區,至少有cch+1個字符大小;隨同學口文字載入 
int nMaxCount//lpString緩衝區的長度
);
16位:GetWindowText
32位:GetWindowTextA,GetWindowTextW
 
三、 GetDlgItemText
此函數在USER32.DLL用戶模塊中,它的做用是返回對話框中某一個窗口的標題或文字。函數原型:
UINT GetDlgItemText(
HWND hDlg, // 對話框句柄
int nIDDlgItem, //控制標識符
LPTSTR lpString, / 預約義的一個字符緩衝區
int nMaxCount// 字符緩衝區的長度
);
16位:GetDlgItemText
32位:GetDlgItemTextA,GetDlgItemTextW
 
四、 MessageBox函數
此函數是在USER32.DLL用戶模塊中,它的做用建立、顯示和操做信息框。函數原型:
int MessageBox(
HWND hWnd, //窗口句柄
LPCTSTR lpText, // 信息框中文字的地址
LPCTSTR lpCaption, // 信息框標題地址
UINT uType // 信息框類型
);
16位:MessageBox
32位:MessageBoxA,MessageBoxW
 
學習API函數最好的資料就是《Windows程序設計》這本書,下面列出其餘一些參考資料:

其餘資料  
Win32頭文件 

 
 

 

 

第三課 動態分析技術
 
所謂動態分析是利用調試器,如OllyDBG一步一步地單步執行軟件。常見的調試器有SoftICE,OllyDBG(簡稱OD)等。SoftICE是一 款經典的調試工具,運行在Ring0級,能夠調試驅動。但平時調試的程序都是Ring3級,所以推薦你們用OllyDBG,這款工具上手容易,功能十分強 大,如今論壇上的文章基本都是用OllyDBG來說解的。 
 
3.1 OllyDBG調試器

 
OllyDBG工具下載  
點擊此處下載OD 

 

 
名詞解釋  
1.所謂領空,其實是指:在某一時刻,CPU 的 CS:IP(EIP) 所指向的某一段代碼的全部者所在的區域。
 

 
3.2 Olldbg常見問題
 
Q: OD中如何運行到光標所在處?
A: 將光標移到目標位置,按F4.
 
Q: 如何用OD修改可執行程序?
A:直接在反彙編代碼區更改,這時可使用匯編代碼更改,而後選中修改後的彙編代碼,右擊-->複製到可執行文件-->保存文件.
 
Q:OD中的代碼亂碼,如:
004365E0 >db 68 ; CHAR 'h'
004365E1 >db A4
004365E2 >db 7A ; CHAR 'z'
004365E3 >db E5
004365E4 >db B8
004365E5 >db E8
004365E6 >db BB
 
A:OD右鍵,"分析/從模板中刪除分析",如不行,按Ctrl+A從新分析
 
 
Q:OD爲何刪除了斷點,從新加載的時候,這些斷點都會從新出現
A:設置ollydbg.ini,將配製文件裏改爲以下:Backup UDD files=1 (by kanxue)
 
Q:如何還原到OD到分析前的狀態?
A:右鍵 分析/從模塊中刪除掃描
 
Q:什麼是UDD?
A:OllyDbg 把全部程序或模塊相關的信息保存至單獨的文件中,並在模塊從新加載時繼續使用。這些信息包括了標籤、註釋、斷點、監視、分析數據、條件等等
 
Q:OD的數據窗口顯示一個下劃線,是什麼意思?
A:重定位加下劃線[Underline fixups],幾乎全部的DLL和一部分程序都包含重定位,這樣就能夠在內存中的不一樣基地址加載模塊了。當該項開啓時,CPU反彙編窗口或CPU數據窗口中的重定位地址都將添加下劃線。(xing_xsz)
 
Q:若是已經知道某一CALL的具體做用,可否把後面全部相同的CALL都改爲函數名形式?
A:好比 CALL 110000 此中已經知道110000是一個核心計算
則以下操做,讓光標停在CALL 110000 這個語句上,按回車鍵
會跳到110000的地址上去顯示,以後讓光標停在110000上,按
shift 和; (分號) 其實就是完成一個:(冒號)的動做,輸入
名稱,這回全部的調用110000處,都會顯示CALL 你剛纔輸入的
名稱了.(nig回答)
 
Q:用OD調試一些加殼程序,如Themida等,可能你會發現下斷後(包括硬件斷點),程序跑到斷點時,OD會出現假死現像。
A:打開OD配置文件ollydbg.ini,你會發現:Restore windows= 123346 //這個Restore windows可能會是一個很大的值
如今只須要將Restore windows=0,從新用OD調試程序,假死問題就消失了。 (kanxue)
 
Q:ollydbg中如何調用pdb文件? 
A:
pdb文件是VC++調試編譯生成的文件。由編譯器直接生成。
pdb文件要配合源文件使用。不一樣的源文件pdb文件不一樣。
用OD裝入可執行文件後,點擊CPU窗口中的註釋段可出現源碼。
不過不是全部的源碼均可以顯示的。VC++6.0如下均可以顯示。
還有一種不顯示的緣由是缺乏路徑。點擊OD主菜單的[查看]->[源文件]
若是[源碼]段出現(缺乏)字樣的話,說明此路徑的源碼是看不了的。設置正確的路徑就能夠了。
(nantz回答)
 
Q:運行A.exe,其會調用B.exe,若是用OD再附加B.exe,OD會死掉
A:
1.OD菜單,設置OD爲即時調試器;
2.將B.exe的入口改爲CC,即INT 3指令,同時記下原指令
3.運行A.exe,其調用B.exe,會致使異常,OD會自動啓動加載B.exe,此時你將INT 3指令恢復原指令。
4.到這步,你己能夠任意調試B.exe了(kanxue)
 
Q:用ollydbg調試的時候,斷住kernel32.dll系統函數,而後」執行到用戶代碼「,就能夠回到被調程序的代碼。但有時候卻回不來,不知道這又是爲何?
A:
多半是殺毒軟件(如卡巴對LoadLibraryA)Hook API入口代碼進入ring 0了,OllyDbg不能單步跟蹤,這種狀況下只要看堆棧返回地址,在返回地址上下端點,F9執行就能夠了。(cyclotron回答)
 
Q:OD的「複製可執行文件」後面沒有 「全部修改」的菜單
A:OD識別代碼段範圍失敗後, 沒有複製all modifications的選項, 由於這個是複製代碼段內的修改的。(曾半仙回答)
 
Q:OD裏的patch窗口怎麼用?
A:patch窗口用來保存你在調試的程序中修改過的代碼的。好比你前面調試了一個程序,在OD中把某處的JE改爲了JMP,OD會在patch中記錄這 個修改,你下次再從新載入程序時,就能在OD的patch窗口中看到你原來改動的代碼。按空格鍵就能夠激活patch,就是在OD中還把原來位置的JE改 成JMP。這個只是在OD中做更改,並無實際保存到文件,主要是比較方便在OD中修改程序時測試。(CCDebuger回答)

 

3.3 Olldbg腳本教學
 
這部分有點難度,新手能夠跳過,等水平提升後回頭再學習。

 

 

第四課 靜態分析技術
 
所謂靜態分析即從反彙編出來的程序清單上分析,從提示信息入手進行分析。目前,大多數軟件在設計時,都採用了人機對話方式。所謂人機對話,即在軟件運行過 程中,須要由用戶選擇的地方,軟件即顯示相應的提示信息,並等待用戶按鍵選擇。而在執行完某一段程序以後,便顯示一串提示信息,以反映該段程序運行後的狀 態,是正常運行,仍是出現錯誤,或者提示用戶進行下一步工做的幫助信息。爲此,若是咱們對靜態反彙編出來的程序清單進行閱讀,可瞭解軟件的編程思路,以便 順利破解。 經常使用的靜態分析工具備W32DASM、C32Asm和IDA Pro等。
 
4.1 認識PE格式
 
在Win32平臺上(包括Windows 95/98/ME/NT/2000/XP/2003/CE),可執行文件是 PE(Portable Executable)格式。PE文件使用的是一個平面地址空間,全部代碼和數據都被合併在一塊兒,組成一個很大的結構。文件的內 容被分割爲不一樣的區塊(Section,又稱區段、節等),塊中包含代碼或數據。
http://bbs.pediy.com/upload/bbs/unpackfaq/pe.gif 
 
剛接觸這塊的朋友只須要簡單瞭解一下PE格式,更具體的PE格式請參考脫殼基礎知識入門(2006年版) 
 
PE相關名詞解釋以下:
1.入口點(Entry Point)
程序在執行時的第一行代碼的地址應該就是這個值。
 
2.文件偏移地址(File Offset)
PE文件在磁盤上儲存時,各數據的地址稱文件偏移地址(File Offset)。用十六進制工具(例如Hex Workshop、WinHex等)打開文件顯示的地址就是文件偏移地址。
 
3.虛擬地址(Virtual Address,VA)
因爲Windows程序是運行在386保護模式下,在保護模式下,程序訪問存儲器所使用的邏輯地址稱爲虛擬地址(Virual Address,VA)。與實地址模式下的分段地址相似,虛擬地址也可寫成"段:偏移量"的形式,這裏的段是指段選擇器。
 
4.基地址(ImageBase)
文件執行時將被映像到指定內存地址中,這個初始內存地址稱爲基址(ImageBase)。在Windows NT中,缺省的值是10000h;對於 DLLs,缺省值爲400000h。在Windows 9x中,10000h不能用來裝入32位的執行文件,由於該地址處於全部進程共享的線性地址區域, 所以Microsoft將Win32可執行文件的缺省基地址改變爲400000h。
 
5.相對虛擬地址
相對虛擬地址(Relative Virual Address,RVA)表示此段代碼在內存中相對於基地址的偏移。即:相對虛擬地址(RVA)=虛擬地址(VA)-基址(ImageBase)。
 
4.2 虛擬地址和偏移量轉換
 
  在OllyDBG,IDA和W32Dasm下顯示的地址值是虛擬地址(Virual Address,VA)。而十六進制工具裏,如:Hiew、Hex Workshop等顯示的地址就是文件地址,稱之爲偏移量(File offset) 。
 
  其轉換原理是由於PE文件在磁盤上的數據結構與在內存中的結構是一致的,以下圖:
http://bbs.pediy.com/upload/2005/4/image/rva-va.gif 
具體見:http://bbs.pediy.com/showthread.php?s=&threadid=18022 
 
  在實際操做時,使用 LordPE等工具很容易進行File offset與VA的轉換。LordPE打開目標文件,點擊FLC按鈕,打開以下圖的對話框,填入相應地址,點擊DO按鈕便可轉換:
http://bbs.pediy.com/upload/bbs/Newbie/offset.gif 
 
4.3 文件類型分析
 
 文件分析是靜態分析程序的第一步,經過相關工具顯示欲調試文件的信息,如它是用什麼語言寫的,是否加殼等。經常使用的文件分析工具備PEIDFileInfo等。有關殼的相關知識等入門後,再參考相關教學,如 脫殼基礎知識入門(2006年版) 。若是查到文件有殼,此時靜態分析是沒意義的,但能夠用OD動態調試,分析程序算法。
 
1.PEiD
 
PEiD的GUI界面操做很是方便直觀。它的原理是利用查特徵串搜索來完成識別工做的。各類開發語言都有固定的啓動代碼部分,利用這點就可識別出是何種語 言編編譯的。一樣,不一樣的殼也有其特徵碼,利用這點就可識別是被何種殼所加密。下面PEiD識別出這個軟件是用Asprotect 1.2x加的殼。
http://bbs.pediy.com/upload/bbs/unpackfaq/peid.gif 
 
2.FileInfo
 
FileInfo(簡稱Fi)另外一款不錯的文件檢測工具。
FI的具體用法 
 
 
 
4.4 W32Dasm簡介
 
W32Dasm簡介 
 
 
4.5 IDA pro操做
 
IDA簡易教程 
IDA裏的中文字串 
 
4.6 keymaker內存註冊機
 
Q:什麼是某個軟件的中段地址,指令長度,第一字節,這些數據怎麼獲得,這些數據在內存註冊機中怎麼應用?
A:
青色表明着註冊碼的保存模式
綠色的是中斷地址,中斷地址通常選擇註冊碼保存模式的下一句,或下幾句地址,但必須保證程 序中斷到這個地址時註冊碼保存的值沒有被任何東西修改或改變。以下面的例子,中斷地址能夠選在00401205和00401207,但不能選在 0040120C這個地址,由於00401207這個Call事後會修改eax的值。
紅色的是中斷的第一個字節
紅色加上藍色的字節就是指令長度,以下面的例子選的中斷地址是00401207,這個地址上有5個字節,因此指令長度是5

00401205      50               PUSH EAX           ;eax中保存着真註冊碼
00401206      52               PUSH EDX           ; edx中保存着假註冊碼
00401207      E8 68 FF FF FF   CALL 00401174      ; 比較真假註冊碼
0040120C      85 C0            TEST EAX,EAX       ; 測試註冊碼真假結果
0040120E      75 42            JNZ SHORT 00401252 ; 假則跳向錯誤,真則不跳編程

 

第五課 常見保護的攻擊 


5.1 序列號方式 

  軟件驗證序列號的過程,其實就是驗證用戶名和序列號之間的數學映射關係。這個映射關係是由軟件的設計者制定的,因此各個軟件生成序列號的算法是不一樣的。這是最多見的一種保護方式。
windows

 

5.2 警告(NAG)窗口 
   Nag的本義是煩人的意思。Nag窗口是軟件設計者用來不時提醒用戶購買正式版本的窗口。
api

NAG窗口  
  警告(NAG)窗口  

 

5.3 時間限制 
   這類保護的軟件通常都有時間段的限制,例如試用30天等。當過了共享軟件的試用期後,就不予運行。只有向軟件做者付費註冊以後才能獲得一個無時間限制的註冊版本。
緩存

時間限制  
  時間限制  

 


5.4 Key File保護  
   KeyFile(註冊文件)是一種利用文件註冊軟件的保護方式。
網絡

Key File保護   
  Key File保護  

 


5.5 功能限制的程序   
   這種程序通常是DEMO版或菜單中部分選項是灰色。有些DEMO版本的部分功能裏面根本就沒有。而有些程序功能全有,只要註冊後就正常了。
數據結構

功能限制的程序    
  功能限制的程序  

 


5.6 CD-check   
   最簡單也最多見的光盤保護就是程序在啓動時判斷光驅中的光盤上是否存在特定的文件,若是不存在則認爲用戶沒有正版光盤,拒絕運行。在程序運行的過程中通常再也不檢查光盤的存在與否。

CD-check   
  CD-check  

 

5.7 重啓驗證 


5.8 網絡驗證

摘自:http://bbs.pediy.com/showthread.php?p=224481#post224481

相關文章
相關標籤/搜索