?? 菜鳥破解從頭學(全教程).txt
字號:
而Windows GUI函數,只不過是微軟提供給程序開發人員的API(Application Programming Interface 應用編程接口)中的一小部分而以。Windows API是一大組功能強大的函數,它們本身駐扎在 Windows 中供人們隨時調用。這些函數的大部分被包含在幾個動態鏈接庫(DLL)中,譬如:kernel32.dll、 user32.dll 和 gdi32.dll。 Kernel32.dll中的函數主要處理內存管理和進程調度;user32.dll中的函數主要控制用戶界面;gdi32.dll中的函數則負責圖形方面的操作等等。
你可能多多少少聽說過API函數,如果你不太清楚到底是怎么一回事的話,我盡量給你解釋的清楚一點。
不知道你有沒有想過,Windows中的那一個又一個窗口是怎么畫出來的呢?呵呵,你可能用VB、Delphi編過程序,你有沒有想過你寫的程序中的那些窗口是怎么形成的?是控件變成的。倒...呵呵,相信你當初學VB或Delphi的時候,所看的書上一定對可視化編程環境大肆贊揚了一番吧,是不是也提到過比VC++怎么怎么方便?怎么怎么不用再為生成程序的界面而花費大量無用時間了等等。
(臺下上來一東北民工:小子,你找抽啊,還講不講了)
馬上開說,其實我只是想告訴你,所有你用的Windows下的程序,都是通過調用一個又一個的Windows API來執行相應任務的,沒有API,你的程序什么也做不了。用VB、Delphi以及MFC的朋友也許會說我根本沒有調用什么API啊!其實這些API都是由你所用的開發環境自動進行相應的轉換的。比如說你用Delphi新建一程序,什么也不用動就直接按F9來運行它,是不是出現一個空白的窗體?這就是個標準的Windows程序,它有Windows程序所具有的一切特征,如最大化按鈕、最小化按鈕、關閉按鈕…你可以通過鼠標來移動它。
但是如果你想用VC++或MASM32來寫這樣一個程序,那么你有兩種方法,在VC++中,你可以用MFC或直接調用API,而在MASM32中,你就只有直接調用API這一種方法。所謂直接調用API,就是指所有的操作都通過最原始的API來完成。通過直接調用API來生成這樣一個程序,你必須要先注冊窗口類(除非您使用 Windows 預定義的窗口類,如 MessageBox 或 dialog box);然后產生窗口;然后在桌面顯示窗口(除非您不想立即顯示它); 然后刷新窗口客戶區;
麻煩吧,如果你想真正的讓這個程序能正常地運行下來,還要再加入以下步驟:
1.你要得到您應用程序的句柄。2.窗體顯示后就進入無限的獲取窗口消息的循環。3. 如果有消息到達,由負責該窗口的窗口回調函數處理。4. 如果用戶關閉窗口,進行退出處理。
上面這此步驟,都需要調用相應的API來完成。比如說得到程序的句柄用GetModuleHandle注冊窗口類用RegisterClass或RegisterClassEx;注冊后,還要用CreateWindowEx函數來生成相應窗口,而后用ShowWindow來顯示它,之后還會用UpdateWindow 來更新客戶區等等等等。這些還都不算呢,如果你真通過直接調用API去寫一個稍大一點兒的程序的話,你會發現那是一個多么不令人愉快的事情。
上面說的這些,只不過是API中的一小小小小小小小小小小….部分,這才幾個,真正的API有成百上千個,包括對系統各個方面進行的操作。沒有API,你的程序什么也干不了。比如說你的程序中有一個Edit控件,VB中應該叫做Text控件吧,你想將用戶輸入到里面的信息放到一個變量中去,那么Delphi中可以用Str:=Edit1.text來實現。VB中應該是Str=Text1.Text;但是如果你用API,想要得到Edit輸入框里的文本內容,就要調用GetDlgItemInt(Edit中輸入的值當做數值來用)GetDlgItemText、GetDlgItemTextA(Edit中輸入的值當做字符串來用)。而上面我說的VB、Delphi得到編輯框中輸入的內容的方法,最終在編譯成可執行文件的時候,也會由編譯器自動對其進行相應的轉換。你只要明白一件事就好了,那就是你所用的程序,無時無刻都在調用著系統中的各種各樣的API函數。
其實Windows中的API,就相當于當年DOS系統中的系統功能調用,及中斷21。只不過在數量上和功能上,都是DOS系統功能調用所不及的。
如果你還是看不明白,那我不怪你,可能是我講的不清楚,所以,還是給你推薦老牛寫的書吧。力推《Windows程序設計》,看過之后你會內力大增的,那時候你所知道的知識就不止是API而以了。
其實話說回來,我這篇文章不是教你編程的,所以關于Windows程序的原理,沒有必要說那么多,我之所以跟你講API,是想讓你知道Windows程序的運行機制。免的到時候用調試器下斷點的時候問什么是API。(眾人(十分憤怒地)沖上臺來:“拉下去PK!把我們當什么了!”)
(我再次來到臺上,鏡頭切向臉的一側,來個特寫。只見上面有若干處大小不同的傷口)可能還有些重點的地方我沒有提到,歡迎指正。如果你有什么不明白的地方,歡迎跟貼提問。只要別太那個,比如說“你能把所有的API給我列出來讓我回去背背好嗎?”
附上幾個常用的API函數吧。相信你此時因該以經對API有個大概的了解了。
MessageBox 顯示一信息對話框
MessageBoxEx 顯示一信息對話框
MessageBoxIndirect 顯示一定制信息對話框
(以上這三個,可以用來中斷那些錯誤提示,比如說你注冊碼輸入錯誤了,程序就可能通過這幾個函數中的一個,來提示你錯誤)
GetDlgItemInt 得指定輸入框整數值
GetDlgItemText 得指定輸入框輸入字符串
GetDlgItemTextA 得指定輸入框輸入字符串
(軟件可以用這三個來得到用戶輸入的注冊碼)
GetLocalTime 得當前本地時間
GetSystemTime 得當前系統時間
(軟件可以用這兩個來判斷軟件是否過期)
RegQueryvalueA 獲取一個項的設置值
RegQueryvalueExA 獲取一個項的設置值
RegSetvalueA 設置指定項或子項的值
RegSetvalueExA 設置指定項的值
(如果軟件用注冊表存儲注冊信息的話,那么這幾個也許會有用)
上面講的,只是幾個平時比較常見的,更多請參見看雪以前的教程或Windows開發人員手冊。
最后,我們還要隆重介紹一個重量級函數,你可能不知道API是什么,但你只要用過調試器,就一定知道它的名字。你可以不知道美國現任的總統是誰,但是你一定要知道這個函數。我雖然知道現任美國總統是鮑威爾 但我同時也知道這個函數是誰。
它就是----吳孟達!(導演:NG)重新說。它就是hmemcpy。
這個函數是干什么的?
它是一個非常簡單的函數。只完成一項非常非常基本的任務,就是把數據從一個地方復制到另一個地方。應用程序本身并不調用它,理由很簡單,它很低級(匯編:誰敢說跟我一樣?)。但是大部分API函數卻非常頻繁地調用它。所以,它也叫萬能函數。平時你可能都不知道有這么個東西,但是斷起程序來卻非常管用。但目前到了2K跟Xp下,卻沒有這個函數了,與之相應的是一個叫memcpy的函數,雖然功能與其相同,但是基本上已經是個廢人了 總知,你用memcpy根本就斷不下什么來。所以,這么一個好使的函數只能在98下使用了。這就像美國的總統一樣,再好使也只能使八年,不好使的就別說了。說不定明年就把他踢飛
別的我也不多說什么了,這章你就知道API是什么就成了。
如果你覺的有什么不妥的地方或有什么問題,并且想文明一點地表代出來的話,就請在回復。如果想野蠻一點的話,就拿雞蛋往你顯示器上丟吧
<本章完>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四章--調試器及相關工具入門
在寫這章之前,我看了一下看雪以往的教程。本來想參考一下,可忽然發現,寫這樣的一章,是一件非常愚蠢的事情,因為我覺的關于這些工具的使用教程。看雪教程中已經寫的夠詳細的了,我并不認為你會看不懂。所以我不想做浪費時間的人,本章就此擱淺。
推薦看《Crack Tutorial 2001》,推薦看《看雪論壇精華一、二、三、四》,推薦看《加密與解密--軟件保護技術及完全解決方案》,推薦看一切與之有關的教程。
本章補遺:
要想上路,你最少應該熟練掌握以下工具:
SoftICE:目前公認最好的跟蹤調試工具。(由于我使用的分辯率的關系,從沒有用過它)
Trw2000: 國人驕傲,其中有我最喜歡的pmodule命令。(河南老鄉,殷墟舊人)
W32Dasm8.93或其它任意版本:反匯編的極品工具。
Hiew 或者Ultra Edit或者其它:十六進制工具。爆破時使用,DOS下使用Hiew,Windows下使用Ultra Edit、WinHex、Hex Workshop等,我個人喜歡用Ultra Edit。
偵測文件類型工具:比如TYP、gtw或FileInfo等。這是一個能偵測你的軟件是被哪一種「殼」給加密了。
PROCDUMP與其它N多的脫殼軟件。
EXESCOPE:擁有執行文件(EXE, DLL等)的解析與顯示功能;提取資源到外部文件 ;資源的重新寫入;記錄文件的記錄及其再編輯(成批編輯)等功能。是漢化軟件的常用工具,當然破解軟件時也很有用。
其它許多......(等你入了門后再學也不遲)
(作者注:以上工具的使用方法,大都可在看雪以有的教程中找到,故不愿復之)
<本章完>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五章--破解原理
從本章開始,我們來一步一步學習Crack軟件(80%讀者昏死過去,且不省人世...另有20%在尋找附近可以用來打人的東西)
不可不說一下學習破解的三個階段:
初級,修改程序,用ultraedit等工具修改exe文件,稱暴力破解,簡稱爆破
中級,追出軟件的注冊碼
高級,寫出注冊機
先說這爆破。所謂爆破,就是指通過修改可執行文件的源文件,來達到相應的目的。你不明白?呵呵,舉個例子好了,比如說某共享軟件,它比較用戶輸入的注冊碼,如果用戶輸入的,跟它通過用戶名(或其它)算出來的注冊碼相等的話(也就是說用戶輸入的注冊碼正確了),那么它就會跳到注冊成功的地方去,否則就跳到出錯的地方去。
明白過來了吧,我們只要找到這個跳轉指令,把它修改為我們需要的“造型”,這樣,我們是不是就可以為所欲為了?(某軟件雙手放在胸口,你要干嘛?)
常見的修改方法有兩種,我給你舉例說明:
no.1
在某軟件中,這樣來進行注冊:
00451239 CALL 00405E02 (關鍵CALL,用來判斷用戶輸入的注冊碼是否正確)
0045123D JZ 004572E6 (!!!<--此為關鍵跳轉,如果用戶輸入的注冊碼正確,就跳向成功處,即004572E6處)
0045XXXX YYYYYYYYYY
XXXXXXXX YYYYYYYYYY
XXXXXXXX YYYYYYYYYY
XXXXXXXX 執行到此處,就提示用戶注冊失敗
...提示用戶注冊碼不正確等相關信息
...
004572E6 ... <--(注冊成功處!!!)
...提示用戶注冊成功等相關信息
呵呵,看明白了嗎?沒有的話,我來給你講一下。在軟件執行到00451239處的時候,CALL置0045E02處來進行注冊碼判斷。接著回來后就來一個跳轉語句,即如果用戶輸入的注冊碼正確就跳到004572E6處,跳到此處,就算是注冊成功了。如果用戶輸入的注冊碼不正確的話,那么就不會在0045123D處進行跳轉,而一直執行下去。在下面等它的,是注冊失敗部分。
想明白了嗎?嘿嘿...沒錯,我們只要把那個關鍵跳轉JZ給改為JNZ(如果用戶輸入的注冊碼錯誤,就注冊成功,輸入正確則注冊失敗)。當然你也可以將JNZ修改為Jmp,這樣的話,你輸入的注冊碼無論正確與否。都可以注冊成功。
no.2
我們再來講一下另外的一種情況:
00451239 CALL 00405E02 (關鍵CALL,用來判斷用戶輸入的注冊碼是否正確)
0045123D JNZ 004572E6 (!!!<--此為關鍵跳轉,如果用戶輸入的注冊碼不正確,就跳向失敗處,即004572E6處)
0045XXXX YYYYYYYYYY
XXXXXXXX YYYYYYYYYY
XXXXXXXX YYYYYYYYYY
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -