10招教你學(xué)會(huì)破解!
發(fā)表時(shí)間:2023-07-03 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]不清除下面談到了一些在學(xué)習(xí)解密過(guò)程中經(jīng)常遇到的問(wèn)題, 本人根據(jù)自己的經(jīng)驗(yàn)簡(jiǎn)單給大家談一談。 這些問(wèn)題對(duì)于初學(xué)者來(lái)說(shuō)常常是很需要搞明白的, 根據(jù)我自己的學(xué)習(xí)經(jīng)歷, 如果你直接照著很多破解教程去學(xué)習(xí)的...
不清除下面談到了一些在學(xué)習(xí)解密過(guò)程中經(jīng)常遇到的問(wèn)題, 本人根據(jù)自己的經(jīng)驗(yàn)簡(jiǎn)單給大家談一談。 這些問(wèn)題對(duì)于初學(xué)者來(lái)說(shuō)常常是很需要搞明白的, 根據(jù)我自己的學(xué)習(xí)經(jīng)歷, 如果你直接照著很多破解教程去學(xué)習(xí)的話, 多半都會(huì)把自己搞得滿頭的霧水, 因?yàn)橛泻芏嗟母拍钜醋约翰皇呛芮宄?要么根本就不知道是怎么一回事, 所以希望通過(guò)下面的討論給大家一定的幫助:
1. 斷點(diǎn):所謂斷點(diǎn)就是程序被中斷的地方, 這個(gè)詞對(duì)于解密者來(lái)說(shuō)是再熟悉不過(guò)了。 那么什么又是中斷呢?中斷就是由于有特殊事件(中斷事件)發(fā)生, 計(jì)算機(jī)暫停當(dāng)前的任務(wù)(即程序), 轉(zhuǎn)而去執(zhí)行另外的任務(wù)(中斷服務(wù)程序), 然后再返回原先的任務(wù)繼續(xù)執(zhí)行。 打個(gè)比方:你正在上班, 突然有同學(xué)打電話告訴你他從外地坐火車過(guò)來(lái), 要你去火車站接他。 然后你就向老板臨時(shí)請(qǐng)假, 趕往火車站去接同學(xué), 接著將他安頓好, 隨后你又返回公司繼續(xù)上班, 這就是一個(gè)中斷過(guò)程。 我們解密的過(guò)程就是等到程序去獲取我們輸入的注冊(cè)碼并準(zhǔn)備和正確的注冊(cè)碼相比較的時(shí)候?qū)⑺袛嘞聛?lái), 然后我們通過(guò)分析程序, 找到正確的注冊(cè)碼。 所以我們需要為被解密的程序設(shè)置斷點(diǎn), 在適當(dāng)?shù)臅r(shí)候切入程序內(nèi)部, 追蹤到程序的注冊(cè)碼, 從而達(dá)到crack的目的。
2. 領(lǐng)空:這是個(gè)非常重要的概念, 但是也初學(xué)者是常常不明白的地方。 我們?cè)诟鞣N各樣的破解文章里都能看到領(lǐng)空這個(gè)詞, 如果你搞不清楚到底程序的領(lǐng)空在哪里, 那么你就不可能進(jìn)入破解的大門。 或許你也曾破解過(guò)某些軟件, 但那只是瞎貓碰到死老鼠而已(以前我就是這樣的^_^,現(xiàn)在說(shuō)起來(lái)都不好意思喔!)。 所謂程序的領(lǐng)空, 說(shuō)白了就是程序自己的地方, 也就是我們要破解的程序自己程序碼所處的位置。 也許你馬上會(huì)問(wèn):我是在程序運(yùn)行的時(shí)候設(shè)置的斷點(diǎn), 為什么中斷后不是在程序自己的空間呢?因?yàn)槊總(gè)程序的編寫都沒(méi)有固定的模式, 所以我們要在想要切入程序的時(shí)候中斷程序, 就必須不依賴具體的程序設(shè)置斷點(diǎn), 也就是我們?cè)O(shè)置的斷點(diǎn)應(yīng)該是每個(gè)程序都會(huì)用到的東西。 在DOS時(shí)代, 基本上所有的程序都是工作在中斷程序之上的, 即幾乎所有的DOS程序都會(huì)去調(diào)用各種中斷來(lái)完成任務(wù)。 但是到了WINDOWS時(shí)代, 程序沒(méi)有權(quán)力直接調(diào)用中斷, WINDOWS系統(tǒng)提供了一個(gè)系統(tǒng)功能調(diào)用平臺(tái)(API), 就向DOS程序以中斷程序?yàn)榛A(chǔ)一樣, WINDOWS程序以API為基礎(chǔ)來(lái)實(shí)現(xiàn)和系統(tǒng)打交道, 從而各種功能, 所以WINDWOS下的軟件破解其斷點(diǎn)設(shè)置是以API函數(shù)為基礎(chǔ)的, 即當(dāng)程序調(diào)用某個(gè)API函數(shù)時(shí)中斷其正常運(yùn)行, 然后進(jìn)行解密。 例如在SOFTICE中設(shè)置下面的斷點(diǎn):bpx GetDlgItemText(獲取對(duì)話框文本), 當(dāng)我們要破解的程序要讀取輸入的數(shù)據(jù)而調(diào)用GetDlgItemText時(shí), 立即被SOFTICE攔截到, 從而被破解的程序停留在GetDlgItemText的程序區(qū), 而GetDlgItemText是處于WINDWOS自己管理的系統(tǒng)區(qū)域, 如果我們擅自改掉這部分的程序代碼, 那就大禍臨頭了^_^!所以我們要從系統(tǒng)區(qū)域返回到被破解程序自己的地方(即程序的領(lǐng)空), 才能對(duì)程序進(jìn)行破解, 至于怎樣看程序的領(lǐng)空請(qǐng)看前面的SOFTICE圖解。 試想一下:對(duì)于每個(gè)程序都會(huì)調(diào)用的程序段, 我們可能從那里找到什么有用的東西嗎?(怎么樣去加密是程序自己決定的, 而不是調(diào)用系統(tǒng)功能實(shí)現(xiàn)的!)
3. API:即Application Programming Interface的簡(jiǎn)寫, 中文叫應(yīng)用程序編程接口, 是一個(gè)系統(tǒng)定義函數(shù)的大集合, 它提供了訪問(wèn)操作系統(tǒng)特征的方法。 API包含了幾百個(gè)應(yīng)用程序調(diào)用的函數(shù), 這些函數(shù)執(zhí)行所有必須的與操作系統(tǒng)相關(guān)的操作, 如內(nèi)存分配、向屏幕輸出和創(chuàng)建窗口等, 用戶的程序通過(guò)調(diào)用API接口同WINDOWS打交道, 無(wú)論什么樣的應(yīng)用程序, 其底層最終都是通過(guò)調(diào)用各種API函數(shù)來(lái)實(shí)現(xiàn)各種功能的。 通常API有兩中基本形式:Win16和Win32。 Win16是原來(lái)的、API的16位版本, 用于Windows 3.1;Win32是現(xiàn)在的、API的32位版本, 用于Windows 95/98/NT/ME/2000。 Win32包括了Win16, 是Win16的超集, 大多數(shù)函數(shù)的名字、用法都是相同的。 16位的API函數(shù)和32位的API函數(shù)的區(qū)別在于最后的一個(gè)字母, 例如我們?cè)O(shè)置這樣的斷點(diǎn):bpx GetDlgItemText、bpx GetDlgItemTextA和bpx GetDlgItemTextW, 其中 GetDlgItemText是16位API函數(shù), GetDlgItemTextA和GetDlgItemTextW是32位API函數(shù), 而GetDlgItemTextA表示函數(shù)使用單字節(jié), GetDlgItemTextW表示函數(shù)使用雙字節(jié)。 現(xiàn)在我們破解中常用到的是Win32單字節(jié)API函數(shù), 就是和GetDlgItemTextA類似的函數(shù), 其它的兩種(Win16 API和Win32雙字節(jié)API函數(shù))則比較少見。 Win32 API函數(shù)包含在動(dòng)態(tài)鏈接庫(kù)(Dynamic Link Libraries, 簡(jiǎn)稱DLLs)中, 即包含在kernel32.dll、user32.dll、gdi32.dll和comctl32.dll中, 這就是為什么我們要在softice中用exp=C:\windows\system\kernel32.dll等命令行將這些動(dòng)態(tài)鏈接庫(kù)導(dǎo)入softice中的原因。 因?yàn)椴贿@樣做的話, 我們就無(wú)法攔截到系統(tǒng)Win32 API函數(shù)調(diào)用了。
4. 關(guān)于程序中注冊(cè)碼的存在方式:破解過(guò)程中我們都會(huì)去找程序中將輸入的注冊(cè)碼和正確的注冊(cè)碼相比較的地方, 然后通過(guò)對(duì)程序的跟蹤、分析找到正確的注冊(cè)碼。 但是正確的注冊(cè)碼通常在程序中以兩種形態(tài)存在:顯式的和隱式的, 對(duì)于顯式存在的注冊(cè)碼, 我們可以直接在程序所處的內(nèi)存中看到它, 例如你可以直接在SOFTICE的數(shù)據(jù)窗口中看到類似"297500523"這樣存在的注冊(cè)碼(這里是隨意寫的), 對(duì)于注冊(cè)碼顯式存在的軟件破解起來(lái)比較容易;但是有些軟件的程序中并不會(huì)直接將我們輸入的注冊(cè)碼和正確的注冊(cè)碼進(jìn)行比較, 比如有可能將注冊(cè)碼換算成整數(shù)、或是將注冊(cè)碼拆開, 然后將每一位注冊(cè)碼分開在不同的地方逐一進(jìn)行比較, 或者是將我們輸入的注冊(cè)碼進(jìn)行某種變換, 再用某個(gè)特殊的程序進(jìn)行驗(yàn)證等等。 總之, 應(yīng)用程序會(huì)采取各種不同的復(fù)雜運(yùn)算方式來(lái)回避直接的注冊(cè)碼比較, 對(duì)于這類程序, 我們通常要下功夫去仔細(xì)跟蹤、分析每個(gè)程序功能, 找到加密算法, 然后才能破解它, 當(dāng)然這需要一定的8086匯編編程功底和很大的耐心與精力。
5. 關(guān)于軟件的破解方式:本人將破解方式分為兩大類, 即完全破解和暴力破解。 所謂完全破解主要是針對(duì)那些需要輸入注冊(cè)碼或密碼等軟件來(lái)說(shuō)的, 如果我們能通過(guò)對(duì)程序的跟蹤找到正確的注冊(cè)碼, 通過(guò)軟件本身的注冊(cè)功能正常注冊(cè)了軟件, 這樣的破解稱之為完全破解;但如果有些軟件本身沒(méi)有提供注冊(cè)功能, 只是提供試用(DEMO), 或是注冊(cè)不能通過(guò)軟件本身進(jìn)行(例如需要獲取另外一個(gè)專用的注冊(cè)程序, 通過(guò)INTERNET的注冊(cè)等等), 或者是軟件本身的加密技術(shù)比較復(fù)雜, 軟件破解者的能力、精力、時(shí)間有限, 不能直接得到正確的注冊(cè)碼, 此時(shí)我們需要去修改軟件本身的程序碼, 即人為改淙砑腦誦蟹較潁庋鈉平獬浦┝ζ平狻?
6. 關(guān)于破解教程中程序代碼地址問(wèn)題:破解教程中都會(huì)放上一部分程序代碼以幫助講解程序的分析方法, 例如下面的一段程序代碼:
......
0167:00408033 PUSH 00
0167:00408035 PUSH EBX
0167:00408036 CALL [USER32!EndDialog]
0167:0040803C JMP 0040812C
......
在這里程序中的代碼地址如0167:00408033, 其代碼段的值(即0167)有可能根據(jù)不同的電腦會(huì)有區(qū)別, 不一定一模一樣, 但偏移值應(yīng)該是固定的(即00408033不變), 所以如果看到破解文章里的程序代碼的地址值和自己的電腦里不一樣, 不要以為搞錯(cuò)地方了, 只要你的程序代碼正確就不會(huì)有問(wèn)題。
7. 關(guān)于如何設(shè)置斷點(diǎn)的問(wèn)題:正確恰當(dāng)?shù)脑O(shè)置好斷點(diǎn)對(duì)于快速有效的解密非常重要, 好的斷點(diǎn)設(shè)置可以使我們迅速找到關(guān)鍵的程序段, 而不恰當(dāng)?shù)臄帱c(diǎn)則會(huì)對(duì)解密造成不必要的精力消耗, 甚至根本就不能攔截到程序的運(yùn)行。 但是具體什么時(shí)候用什么斷點(diǎn)比較合適很難說(shuō), 這需要自己用經(jīng)驗(yàn)去累積, 總的說(shuō)來(lái)bpx hmemcpy這個(gè)萬(wàn)能斷點(diǎn)對(duì)大多數(shù)注冊(cè)碼方式的軟件都有用, 初學(xué)者不妨多試試這個(gè)斷點(diǎn)(通常我也是用這個(gè)斷點(diǎn)設(shè)置, 懶嘛^_^, 哈哈。 。 。 )。 對(duì)于那些需要暴力破解的非注冊(cè)碼方式的軟件, 通常我們應(yīng)該攔截對(duì)話框(如bpx DialogBox)和消息框(如bpx MessageBox(A))等。 不論對(duì)于哪一類軟件, 當(dāng)我們?cè)O(shè)置的斷點(diǎn)均沒(méi)有效果時(shí), 可是試一下bpx lockmytask, 這個(gè)斷點(diǎn)的作用是攔截任何一個(gè)按鍵的動(dòng)作, 具體常用的一些斷點(diǎn)設(shè)置請(qǐng)參考"破解常用斷點(diǎn)設(shè)置"一文。 另外, 在注冊(cè)碼的破解中通常需要輸入用戶名和注冊(cè)碼, 一般說(shuō)來(lái)用戶名和密碼都可以隨意輸入, 但是根據(jù)我自己的經(jīng)驗(yàn), 很多軟件對(duì)于注冊(cè)碼都會(huì)逐位的進(jìn)行處理, 假如輸入"78787878"這串?dāng)?shù)字, 那么在跟蹤程序的時(shí)候我們就無(wú)法知道我們當(dāng)時(shí)所看到的"78"倒底是哪一個(gè)"78", 所以我比較喜歡用"12345678"這樣的注冊(cè)碼輸入方式, 這樣的話就就能知道程序是在對(duì)注冊(cè)碼的哪一位進(jìn)行運(yùn)算, 同樣的對(duì)于那些需要輸入較長(zhǎng)序列號(hào)的軟件, 輸入類似"12345-67890-ABCDEF"這樣的序列號(hào)較好。 不過(guò)有一點(diǎn)大家需要特別的注意:上面講的注冊(cè)碼輸入方式"12345678"是針對(duì)攔截WIN32 API函數(shù)來(lái)說(shuō)的, 假如有些時(shí)候直接攔截WIN32 API函數(shù)難以找到程序的突破口, 而要借助于"S"指令在內(nèi)存中尋找我們輸入的用戶名或注冊(cè)碼時(shí), 就最好不要采用"12345678"作為注冊(cè)碼, 因?yàn)閮?nèi)存中很可能有許多的"12345678"字符串, 這樣我們沒(méi)有辦法知道倒底我們要破解的程序使用的是哪一個(gè)"12345678", 所以我們應(yīng)該選擇一個(gè)不易和內(nèi)存數(shù)據(jù)相同的注冊(cè)碼, 比如:74747474(本人喜歡用, 意思嘛:去死去死。 。 。 哈哈哈^_^), 對(duì)應(yīng)的搜索指令為: S 30:0 L FFFFFFFF '74747474' 。 當(dāng)然, 以上只是我個(gè)人的習(xí)慣而已, 具體用什么樣的輸入形式可以根據(jù)本人的愛好、習(xí)慣來(lái)定, 不必拘泥于某一固定的模式。
8. 關(guān)于如何跟蹤程序的問(wèn)題:初學(xué)者在開始學(xué)習(xí)解密的時(shí)候往往不知道怎么樣去跟蹤程序, 怎么樣找到注冊(cè)碼比較的地方, 當(dāng)面對(duì)長(zhǎng)長(zhǎng)的一堆程序代碼時(shí)顯得不知所措。 通常軟件的程序內(nèi)部都會(huì)利用一個(gè)子程序(即 CALL ********)去驗(yàn)證我們輸入的注冊(cè)碼正確與否, 對(duì)于注冊(cè)碼顯式存在的程序, 一般都會(huì)將所輸入的注冊(cè)碼和正確的注冊(cè)碼放進(jìn)寄存器, 然后調(diào)用驗(yàn)證子程序進(jìn)行判斷, 將結(jié)果返回, 應(yīng)用程序根據(jù)子程序返回的結(jié)果決定是否注冊(cè)成功, 這樣的程序經(jīng)常具有如下的形式:
****:******** MOV EAX,[********] 。ɑ PUSH EAX等形式)
****:******** MOV EDX,[********] (或 PUSH EDX等形式)
****:******** CALL ********
****:******** TEST EAX,EAX 。ɑ TEST AL,AL, 或是沒(méi)有這一句等形式)
****:******** JNZ ******** 。ɑ JZ ********等形式)
其中EAX和EDX指向的內(nèi)存區(qū)域就是我們輸入的注冊(cè)碼和正確的注冊(cè)碼, 這里的寄存器EAX和EDX是隨意寫的, 也可以是ECX, EBX, EDI, ESI等等。 對(duì)于注冊(cè)碼隱式存在的程序, 雖然不能直接看到正確的注冊(cè)碼, 但是通常也是先將所輸入的注冊(cè)碼地址放進(jìn)某個(gè)寄存器, 然后調(diào)用子程序去驗(yàn)證, 破解時(shí)就需要進(jìn)入子程序去分析注冊(cè)算法。 總之, 看到子程序(call ********)后面跟著跳轉(zhuǎn)指令(JNZ ********或JZ ********)的地方我們就應(yīng)該提高警惕, 多用 D EAX(或EBX、ECX、EDX、EDI、ESI...等)去看看寄存器指向的內(nèi)存區(qū)域藏著什么東西。 有一點(diǎn)大家要提醒大家:看見程序中使用下面這個(gè)函數(shù)是要注意, 即GetDlgItenInt, 這個(gè)API函數(shù)的作用是將輸入的文本轉(zhuǎn)化為整數(shù), 所以這類程序中是不會(huì)有顯示存在的注冊(cè)碼的, 因?yàn)樽?cè)碼被轉(zhuǎn)換為整數(shù)了, 程序通常會(huì)用CMP ECX,EDX 這種類型的指令去驗(yàn)證注冊(cè)碼的正確性, 這里ECX和EDX中存的就是所輸入注冊(cè)碼和正確注冊(cè)碼的整數(shù)形式, 此時(shí)可以用 ? edx 和 ? ecx 看到其十進(jìn)制形式, 即我們輸入的形式。
9. 關(guān)于軟件的反安裝問(wèn)題:經(jīng)常我們使用某些軟件時(shí)都會(huì)遇到一個(gè)問(wèn)題, 就是共享軟件過(guò)期之后即使刪掉原程序重新安裝, 程序依然不能用, 還是一樣提醒你試用期已過(guò)請(qǐng)注冊(cè);或者是你已經(jīng)破解了某個(gè)軟件, 但是還想繼續(xù)研究它, 但是因?yàn)檐浖呀?jīng)注冊(cè)好, 沒(méi)有了注冊(cè)選項(xiàng), 這時(shí)你即使徹底刪掉程序再重新安裝軟件, 結(jié)果程序運(yùn)行后還是注冊(cè)過(guò)的。 遇到這樣的情況, 其實(shí)原因很簡(jiǎn)單, 因?yàn)槌绦驅(qū)⒆?cè)或過(guò)期信息存在了系統(tǒng)注冊(cè)表里, 所以簡(jiǎn)單的重新安裝軟件是無(wú)濟(jì)于事的。 解決的辦法就是自己刪掉注冊(cè)表中有關(guān)的信息, 但是因?yàn)樽?cè)表是WINDOWS系統(tǒng)工作的基礎(chǔ), 如果不小心就很可能會(huì)損壞它而引起系統(tǒng)異常, 所以如果你對(duì)注冊(cè)表不是很熟的話, 應(yīng)該在修改之前備份一下注冊(cè)表。 不論是修改還是備份注冊(cè)表都可以使用WINDOWS下的注冊(cè)表管理工具"REGEDIT"來(lái)進(jìn)行, 一種辦法是在"開始->運(yùn)行"下輸入"regedit"啟動(dòng)它, 也可以直接點(diǎn)擊"C:\WINDOWS\regedit.exe"來(lái)運(yùn)行。 大部分的應(yīng)用軟件都會(huì)將自己的信息存在如下的路徑中:HKEY_LOCAL_MACHINE\Software、HKEY_LOCAL_MACHINE\Software\Microsoft、HKEY_CURRENT_USER\Software、HKEY_CURRENT_USER\Software\Microsoft 或 HKEY_USERS\.DEFAULT\Software下, 具體是哪個(gè)地方依據(jù)不同的程序而有所不同, 只要按上面的順序肯定能找到有關(guān)應(yīng)用程序的鍵, 然后將和用戶名及注冊(cè)碼有關(guān)的鍵值刪掉就搞定了。
10. 關(guān)于破解練習(xí)的問(wèn)題:學(xué)習(xí)破解需要大量的練習(xí), 對(duì)于破解目標(biāo)的選擇, 初學(xué)者不宜以大型的、著名的軟件為目標(biāo), 因?yàn)檫@些軟件通常加密較為復(fù)雜, 破解不易, 應(yīng)該選擇一些比較不出名的、小型的和早些時(shí)候的共享軟件來(lái)練習(xí), 因?yàn)榧用芟鄬?duì)簡(jiǎn)單的軟件有利于初學(xué)者快速掌握破解思想和技能。 至于習(xí)題的來(lái)源則很廣泛, 可以從網(wǎng)上下載, 也可以去市面上購(gòu)買一些共享軟件光盤。
上面是電腦上網(wǎng)安全的一些基礎(chǔ)常識(shí),學(xué)習(xí)了安全知識(shí),幾乎可以讓你免費(fèi)電腦中毒的煩擾。