?? 菜鳥破解從頭學(全教程).txt
字號:
菜鳥破解從頭學之全教程:第一章--前言 到 第九章
本章只作一些說明,現在也說了這么多了,沒別的了,賣個廣告,推薦幾本書吧。
首先,力薦看雪老大《加密與解密--軟件保護技術及完全解決方案》,絕對物超所值,要的搶先了...(汗~~俺都沒看過,看來要落伍了)。當然,還有看雪精華一、二、三、四以及將要出來的五,足夠帶你上路等等。
另外,我覺的你真的很有必要學一門編程語言以及掌握一些Win32程序的知識...
* 看雪論壇:
http://www.pediy.com/
課后FAQ
Q:哪些人可以學習破解?
A:任何會啟動電腦并運行軟件同時又想學習破解的人。我說的全是實話,如果你既不會啟動電腦又不會運行軟件,那么我教你一個更高深的吧--破解電腦,呵呵,很簡單,到大街上隨便掄個板磚什么的,回去慢慢破解吧 (記得關電源)
Q:有沒有什么辦法可以使我快速入門并成為高手?
A:有。但你得是個MM(P不PL無所謂),然后找個離你家最近的破解達人,什么也不用做,眨個眼放個電之類的會吧(現在連初中的小女生都會這個),然后就成了,呵呵,想破什么的話,讓高手幫忙吧,到時說成是自己破的就成了 MM問為什么?因為那些高手大都奇丑無比,呵呵,有了頭腦就沒了長相,男的也是這樣,而且越是高手,長的就是越丑。據說一次市里到CCG考察奶牛們的出乳情況,看到大哥Sun某的時候,說了句“這奶牛個兒這么小啊,中午大家吃涮鍋” (眾大哥:大家準備好家伙,我們一會兒要去械斗)。呵呵,玩笑開到這里,其實我說這么多,只是想告訴你,學習破解跟其它技術一樣,請你不要試圖投機取巧,要想學,就腳踏實地,多看教程多動手實踐積累經驗,不要經常POSE那種弱智問題“我不懂XX,請問我能學破解嗎?”,答案是不能,你問的同時,不也正在學嗎?想知道重要嗎?那我告訴你好了,凡是看雪教程上要求掌握的,你全要掌握,這還不算,要想成為高手就必須精通,如果你不想一直只停留在入門階段的話。不要想偷機取巧,誰一開始也不是什么都會的,但你只要花一些時間和一小部分精力,那么沒有什么你學不會的,知識是要積累的,你知道自己不會卻不去學,而在那兒問重不重要,人家會覺的你這個人并不想認真學破解,而是報有僥幸心理在浪費時間,請不要做浪費時間的人。不要剛開始學就想馬上成為高手,沒有高手,你沒必要立下超越的目標,只把學知識放在首位就夠了,欲速則不達,請不要做急于求成的人。
Q:學破解對我來說有什么好處?
A:這個問題應該你自己來回答,呵呵,你為什么要學?“我想免費使用共享軟件”倒...那多少也算是個目的,但我希望你不要只報這種目的(目前國內共享軟件業還有待發展)。我只是想說給那些只是因為一時沖動才學習破解的人,請將你們當初的沖動繼續維持下去,你需要明白,學習破解的目的不只在于破解軟件這個詞,也許后來你會變為軟件分析,隨著學習時間的增加,對你的編程水平,相信會有相當大的提高。學習別人好的思想,并化為已用 就我個人來說,學習破解可以把我的匯編的基礎給打好,呵呵,俺對操作系統這玩意兒感興趣,到時候還想寫出來個玩玩兒呢,所以匯編這關必須要過....
Q:我很笨,那些大蝦的教程我大都看不明白,我能學會嗎?
A:永遠不要說你笨,你只是學的比人家晚而已,太高深的看不懂,那你就撿能看懂的看,別人能入門,你也能,不得要領只是暫時,大蝦與你,也許差的就是一兩年時間的問題。
<本章完>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
稍微有點兒計算機知識的朋友一定知道,計算機是只識別0和1的,最初那會兒,要寫程序,就要用0和1來寫,呵呵,Cool吧!所以曾經有過的對程序員的崇拜,可能就源自那個時候吧 后來,人們發現用0和1來寫程序,太不爽了,不但寫起來不上手,而且回過頭來看的話,應該很難再看明白了,總之出于這些原因,就有了匯編語言。
匯編語言用一些助記符來代替0和1的多種組合,也就是各個指令,這樣的話,從一定程度上來說,方便了許多(一頭老牛:方便太多了)(一只菜鳥:一點兒也不方便,完全看不懂)。但是,匯編也同樣不方便,同樣寫起來不爽,而且后期維護同樣不方便,再加上人們慢慢地需要寫一些更大的程序,在這樣的情況下,高級語言就被人發明了出來,就是我們今天用的Basic、pascal、C、C++等等等等,這些語言的出現,一下了使程序的開發難度大大減低了(一頭老牛:減低太多了,我膝蓋就能寫程序了)(一只菜鳥:還不是一樣難),以前用匯編要很長時間才能開發出來的程序,現在只需要很短的時間且很輕松的就可以搞定了,特別是最近幾年,可視化編程的大肆普及,使程序員的神秘感一下子摔了下來,Coder這樣的詞現在都滿天飛了。最慘的就是匯編,一夜之間變成了低級語言、下流的語言、吃完大蒜不刷牙的民工、開車加完油不給錢的地痞、在公共汽車上吐口水的冰島人等等等等
(匯編:嗚嗚嗚…我不活了)。
但是匯編還是有它先天的優勢的,因為其與CPU內部的指令一一對應,所以在一些特殊的場合,必須由匯編來實現,比如訪問硬件的端口、寫病毒….
而且生成的可執行文件效率巨高,且生成的可執行文件賊小,寫小程序是很爽的,呵呵,而且用匯編寫注冊機,是件很輕松的事,你不用再為怎樣還原為你所熟悉的語言而為難。說了這么多,還是切入主題吧(昏倒觀眾若干):
既然計算機只識別0和1,那么,所有存儲在計算機上的文件,也都是以二進制的形式存放的,當然也包括可執行文件了。
所以,你只要找一個十六進制編輯器比如Ultra Edit什么的,就可直接打開并查看可執行文件了,呵呵,如果你能看懂的話 你會發現,此時看到的,全是些十六進制數值(每4位二進制數可轉換為一位十六進制數),這就是可執行文件的具體內容,當然,其中就包括可執行文件的代碼了。(一頭老牛:好親切啊)(一只菜鳥:笨牛,你給我閉嘴,我眼都花了)。
呵呵,此時,你是不是覺得看這些東西,有些那個?
這些東西看起來就像有字天書,沒人能*這玩意兒來進行分析,于是乎。就有了相應的軟件,可以將這些十六進制數值轉換為相應的匯編代碼,這樣的話,我們就可以對別人的軟件進行分析了。這就是所謂的逆向分析了。
呵呵,聰明的你現在一定在想,如果找到軟件計算注冊碼的部分,并對其進行分析,弄懂它的計算方法,那么你不就不用通過¥的方式來進行軟件注冊了嗎?當然,你也可以將此計算過程還原為任意一個你所熟悉的編程語言,那么,編譯后的這個程序,就叫做注冊機,它的功能就是計算某一特定軟件的注冊碼。(呵呵,是不是經常在軟件中看到此類說明?"禁止制作和提供該軟件的注冊機及破解程序;禁止對本軟件進行反向工程,如反匯編、反編譯等")
作者這樣做,心情我們是可以理解的,畢竟人家花了那么多心思在自己的軟件上,所以,我不希望你僅僅是因為交不起注冊費的原因來學習破解。
總的說來,上邊兒的介紹有點兒太理想化了,上面提到的分析方法,就是所謂的靜態分析,此類分析常用的工具有W32DASM、IDA和HIEW等。靜態分析,顧名思義,就是只通過查看軟件的反匯編代碼來對軟件進行分析。一般如果只是想暴破軟件,只進行靜態分析就夠了。但要想真正的弄清注冊算法,一般還是要進行動態分析的,即能過調試器來一邊執行程序一邊進行分析。具體內容,我會在《破解原理》和《調試器入門》中詳細說明,呵呵,畢竟現在都以經有點兒跑題了。
我廢話說了這么多,其實就是想告訴你匯編的重要性,我不要求你精通,但最少你也得能看懂吧,要不,還談什么分析?雖然有哥們兒一點兒匯編都不懂就上路了,甚至還破掉了幾個軟件,但是,這樣是不是慘了點兒?難不成你想暴破軟件暴破一輩子?
其實你完全不用懼怕匯編的,看上去怪嚇人的,其實跟你平時背那些控件的屬性方法差不多,MFC那么多你都搞的定,匯編命令才有多少?而且,匯編不光只是在Crack軟件時有用,在好多地方也都有用,且用處巨大,所以我覺得,把匯編拿下,是件義不容辭的事:
你只要相信它并不難就好了。
(以下為第二次修改時加入)
先給你講一下CPU的組成吧:
CPU的任務就是執行存放在存儲器里的指令序列。為此,除要完成算術邏輯操作外,還需要擔負CPU和存儲器以及I/O之間的數據傳送任務。早期的CPU芯片只包括運算器和控制器兩大部分。到了近幾年,為了使存儲器速度能更好地與運算器的速度相匹配,又在芯片中引入了高速緩沖存儲器(知道為什么P4比P4賽揚貴那么多嗎?)。(當!一個硬物飛了過來,話外音:你講這些做什么,我們又不要設計CPU)
你急什么嘛,由于匯編比較“低級” ;;所以它是直接操作硬件的,你以為這是用VB呢,想什么時候用變量隨手就可以拿來用,你不掌握好CPU內部的一些工作分配情況,到時怎么來看匯編代碼啊。(當!又一聲,重要還不快點兒說)
除了高速緩沖存儲器之外的組成,大體上可以分為3個部分:
1.算術邏輯部件ALU(arithmetic logic unit)用來進行算術和邏輯運算。這部分與我們的關系不太大,我們沒必要管它。
2.控制邏輯。同樣與我們的關系不大。
3.這個才是最最重要的。工作寄存器,它在計算機中起著重要的作用,每一個寄存器相當于運算器中的一個存儲單元,但它的存取速度卻賊快賊快,比存儲器要快很多了。它用來存放計算過程中所需要的或所得到的各種信息,包括操作數地址、操作數及運算的中間結果等。下面我們專門的介紹這些寄存器。
在介紹之前,有必要說點兒基礎性的知識。知道什么是32位吧,就是說寄存器是32位的,暈~~等于沒說。在CPU中,一個二進制位被看作是一位,八位就是一個字節,在內存中,就是以字節為單位來在存儲信息的,每一個字節單元給以一唯一的存儲器地址,稱為物理地址,到時候訪問相應的內存,就是通過這個地址。八個二進制位都能表達些什么呢?可以表達所有的ASCII碼,也就是說一個內存單元可以存儲一個英文字符或數字什么的,而中文要用Unicode碼來表示,也就是說兩個內存單元,才能裝一個漢字。十六位就是兩個字節這不難理解吧,當然啦,那有了十六位,就肯定有三十二位六十四位什么的,三十二位叫做雙字,六十四位就叫做四字。今天我們所使的CPU,相信全是32位的了,除非你用的是286或更早的話。自然而然,CPU中的寄存器,也就是32位的了,也就是說一個寄存器,可以裝下32個0或1(這其中不包括段寄存器)。
大體上來說,你需要掌握的寄存器,有十六個,我一個一個給介紹給你:
首先,介紹小翠兒(當!,我自己打我自己一下得了,最近看周星馳看多了),重說,首先,介紹通用寄存器。
一共八個,分別是EAX、EBX、ECX、EDX、ESP、EBP、EDI、ESI。
其中,EAX—EDX這四個寄存器又可稱為數據寄存器,你除了直接訪問外,還可分別對其高十六位和低十六位(還計的我說它們是32位的嗎?)進行訪問。它們的低十六位就是把它們前邊兒的E去掉,即EAX的低十六位就是AX。而且它們的低十六位又可以分別進行八位訪問,也就是說,AX還可以再進行分解,即AX還可分為AH(高八位)AL(低八位)。其它三個寄存器請自行推斷。這樣的話,你就可以應付各種情況,如果你想操作的是一個八位數據,那么可以用 MOV AL (八位數據)或MOV AH (八位數據),如果你要操作的是一個十六位數據,可以用MOV AX (十六位數據)三十二位的話,就用MOV EAX (三十二位數據)也許我這樣說,你還是會不明白,沒關系,慢慢來,我給你大概畫張圖吧,雖然不怎么漂亮:
───────────────────────
│ │ │ │
│ │ │ │
│ 高十六位 EAX AH AX AL │
│ │ │ │
│ │ │ │
───────────────────────
(我倒啊...這個圖為啥老是不能正常顯示?我都重畫三遍了)
明白了嗎?不明白沒有關系,你就按你自己的理解能力,能理解多少,就理解多少。
這四個寄存器,主要就是用來暫時存放計算過程中所用的操作數、結果或其它信息。
而ESP、EBP、EDI、ESI這四個呢,就只能用字來訪問,它們的主要用途就是在存儲器尋址時,提供偏移地址。因此,它們可以稱為指針或變址寄存器。話說回來,從386以后,所有的寄存器都可以用來存儲內存地址。(這里給你講一個小知識,你在破解的時候是不是看到過[EBX]這樣的形式呢?這就是說此時EBX中裝的是一個內存地址,而真正要訪問的,就是那那個內存單元中所存儲的值)。
在這幾個寄存器中,ESP稱為堆棧指針寄存。堆棧是一個很重要的概念,它是以“后進先出”方式工作的一個存儲區,它必須存在于堆棧段中,因而其段地址存放于SS寄存器中。它只有一個出入口,所以只有一個堆棧指針寄存器。ESP的內容在任何時候都指向當前的棧頂。我這樣說你可能會覺的還是不明白,那我舉個例子吧,知道民工蓋房吧,假設有兩個民工,一個民工(以下簡稱民工A)要向地上鋪磚,另一個民工(以下簡稱民工B)給民工A遞磚,民工A趴在地上,手邊是民工B從遠處搬來的板磚,他拿起來就用,民工B從遠處搬來后,就還放在那一堆磚上,這樣,民工A拿著用后,民工B隨既就又補了上去,這就是后進先出。你在腦子里想象一下這個這程。有沒有想明白,民工A永遠是從最上邊開始拿磚。堆棧就是這樣,它的基址開始于一個高地址,然后每當有數據入棧,它就向低地址的方向進行存儲。相應的入棧指令是PUSH。每當有數據入棧,ESP就跟著改變,總之,它永遠指向最后一個壓入棧的數據。之后,如果要用壓入堆棧的數據,就用出棧指令將其取出。相應的指令是POP,POP指令執行后,ESP會加上相應的數據位數。
特別是現在到了Win32系統下面,堆棧的作用更是不可忽視,API所用的數據,均是*堆棧來傳送的,即先將要傳送的數據壓入堆棧,然后CALL至API函數,API函數會在函數體內用出棧指令將相應的數據出棧。然后進行操作。以后你就會知道這點的重要性了。許多明碼比較的軟件,一般都是在關鍵CALL前,將真假兩個注冊碼壓入棧。然后在CALL內出棧后進行比較。所以,只要找到個關鍵CALL,就能在壓棧指令處,下d命令來查看真正的注冊碼。具體內容會在后面詳細介紹,本章暫不予討論。
另外還有EBP,它稱為基址指針寄存器,它們都可以與堆棧段寄存器SS聯用來確定堆棧中的某一存儲單元的地址,ESP用來指示段頂的偏移地址,而EBP可作為堆棧區中的一個基地址以便訪問堆棧中的信息。ESI(源變址寄存器)和EDI(目的變址寄存器)一般與數據段寄存器DS聯用,用來確定數據段中某一存儲單元的地址。這兩個變址寄存器有自動增量和自動減量的功能,可以很方便地用于變址。在串處理指令中,ESI和EDI作為隱含的源變址和目的變址寄存器時,ESI和DS聯用,EDI和附加段ES聯用,分別達到在數據段和附加段中尋址的目的。目前暫時不明白不要緊。
接下來,再介紹如花(當當當,我再打自己三下算了)接下來,介紹一下專用寄存器,呵呵,有沒有被這個名字嚇倒?看起來怪專業的。
所謂的專用寄存器,有兩個,一個是EIP,一個是FLAGS。
我們先來說這個EIP,可以說,EIP算是所有寄存器中最重要的一個了。它的意思就是指令指針寄存器,它用來存放代碼段中的偏移地址。在程序運行的過程中,它始終指向下一條指令的首地址。它與段寄存器CS聯用確定下一條指令的物理地址。當這一地址送到存儲器后,控制器可以取得下一條要執行的指令,而控制器一旦取得這條指令就馬上修改EIP的內容,使它始終指向下一條指令的首地址。可見,計算機就是用EIP寄存器來控制指令序列的執行流程的。
那些跳轉指令,就是通過修改EIP的值來達到相應的目的的。
再接著我們說一下這個FLAGS,標志寄存器,又稱PSW(program status word),即程序狀態寄存器。這一個是存放條件標志碼、控制標志和系統標志的寄存器。
其實我們根本不需要太多的去了解它,你目前只需知道它的工作原理就成了,我舉個例子吧:
Cmp EAX,EBX ;用EAX與EBX相減
JNZ 00470395 ;不相等的話,就跳到這里;
這兩條指令很簡單,就是用EAX寄存器裝的數減去EBX寄存器中裝的數。來比較這兩個數是不是相等,當Cmp指令執行過后,就會在FLAGS的ZF(zero flag)零標志位上置相應值,如果結果為0,也就是他們兩個相等的話,ZF置1,否則置0。其它還有OF(溢出標志)SF(符號標志)CF(進位標志)AF(輔助進位標志)PF(奇偶標志)等。
這些你目前沒必要了解那么清楚,會用相應的轉移指令就行了。
最后要介紹的就是段寄存器了(剛才是誰說的櫻紅?反正不是我)
這部分寄存器一共六個,分別是CS代碼段,DS數據段,ES附加段,SS堆棧段,FS以及GS這兩個還是附加段。
其實現在到了Win32環境下,段寄存器以經不如DOS時代那樣重要了。
所以,我們知道就行了。
啰嗦了這么多,相信你對CPU以經有了個大概的了解了吧。什么?還是什么也不明白?呵呵,那也不要灰心,請相信這是我的錯,是我沒有講清楚而已,你可以去參考一些書籍。我始終覺的,你案頭有一本講匯編的書是非常非常有必要的,我這邊兒是清華版的《80x86匯編語言程序設計》沈美明主編,46元。
我們接下來就再講一講一些常用的匯編指令吧。(由于考慮到目前以經有了相應的帖子,所以,我只是從匯編指令中,挑出一些最常用,需要掌握的,更多內容,還請參見書本。)
CMP A,B 比較A與B其中A與B可以是寄存器或內存地址,也可同時是兩個寄存器,但不能同都是內存地址。這個指令太長見了,許多明碼比較的軟件,就用這個指令。
MOV A,B 把B的值送給A其中,A與B可是寄存器或內存地址,也可同時是兩個寄存器,但不能同都是內存地址。
Xor a,a異或操作,主要是用來將a清空
LEA裝入地址,例如LEA DX,string 將字符的地址裝入DX寄存器
PUSH 壓棧
POP 出棧
ADD 加法指令 格式:ADD DST,SRC 執行的操作:(DST)<-(SRC)+(DST)
SUB 減法指令 格式:SUB DST,SRC 執行的操作:(DST)<-(DST)-(SRC)
MUL 無符號乘法指令 格式: MUL SRC 執行的操作:字節操作(AX)<-(AL)*(SRC);字操作(DX,AX)<-(AX)*(SRC);雙字操作:(EDX,EAX)<-(EAX)*(SRC)
DIV 無符號除法指令 格式:DIV SRC 執行的操作:字節操作:16們被除數在AX中,8位除數為源操作數,結果的8位商在AL中,8位余數在AH中。表示為:
(AL)<-(AX)/(SRC)的商,(AH)<-(AX)/(SRC)的余數。字操作:32位被除數在DX,AX中。其中DX為高位字,16位除數為源操作數,結果的16位商在AX中,16位余數在DX中。表示為:(AX)<-(DX,AX)/(SRC)的商,(DX)<-(DX,AX)/(SRC)的余數。
雙字操作:64位的被除數在EDX,EAX中。其中EDX為高位雙字;32位除數為源操作數,結果的32位商在EAX中,32位余數在EDX中。表示為:
(EAX)<-(EDX,EAX)/(SRC)的商,(EDX)<-(EDX,EAX)/(SRC)的余數。
NOP 無作用,可以用來抹去相應的語句,這樣的話,嘿嘿嘿…
CALL調用子程序,你可以把它當作高級語言中的過程來理解。
控制轉移指令:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -