黑客教你十招學會軟件破解大揭密

下面談到了一些在學習解密過程中經常遇到的問題,本人根據自己的經驗簡單給大家談一談。這些問題對于初學者來說常常是很需要搞明白的,根據我自己的學習經歷,如果你直接照著很多破解教程去學習的話,多半都會把自己搞得滿頭的霧水,因為有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通過下面的討論給大家一定的幫助: 1. 斷點:所謂斷點就是程序被中斷的地方,這個詞對于解密者來說是再熟悉不過了。那么什么又是中斷呢?中斷就是由于有特殊事件(中斷事件)發(fā)生,計算機暫停當前的任務(即程序),轉而去執(zhí)行另外的任務(中斷服務程序),然后再返回原先的任務繼續(xù)執(zhí)行。打個比方:你正在上班,突然有同學打電話告訴你他從外地坐火車過來,要你去火車站接他。然后你就向老板臨時請假,趕往火車站去接同學,接著將他安頓好,隨后你又返回公司繼續(xù)上班,這就是一個中斷過程。我們解密的過程就是等到程序去獲取我們輸入的注冊碼并準備和正確的注冊碼相比較的時候將它中斷下來,然后我們通過分析程序,找到正確的注冊碼。所以我們需要為被解密的程序設置斷點,在適當?shù)臅r候切入程序內部,追蹤到程序的注冊碼,從而達到crack的目的。 2. 領空:這是個非常重要的概念,但是也初學者是常常不明白的地方。我們在各種各樣的破解文章里都能看到領空這個詞,如果你搞不清楚到底程序的領空在哪里,那么你就不可能進入破解的大門?;蛟S你也曾破解過某些軟件,但那只是瞎貓碰到死老鼠而已(以前我就是這樣的^_^,現(xiàn)在說起來都不好意思喔?。K^程序的領空,說白了就是程序自己的地方,也就是我們要破解的程序自己程序碼所處的位置。也許你馬上會問:我是在程序運行的時候設置的斷點,為什么中斷后不是在程序自己的空間呢?因為每個程序的編寫都沒有固定的模式,所以我們要在想要切入程序的時候中斷程序,就必須不依賴具體的程序設置斷點,也就是我們設置的斷點應該是每個程序都會用到的東西。在DOS時代,基本上所有的程序都是工作在中斷程序之上的,即幾乎所有的DOS程序都會去調用各種中斷來完成任務。但是到了WINDOWS時代,程序沒有權力直接調用中斷,WINDOWS系統(tǒng)提供了一個系統(tǒng)功能調用平臺(API),就向DOS程序以中斷程序為基礎一樣,WINDOWS程序以API為基礎來實現(xiàn)和系統(tǒng)打交道,從而各種功能,所以WINDWOS下的軟件破解其斷點設置是以API函數(shù)為基礎的,即當程序調用某個API函數(shù)時中斷其正常運行,然后進行解密。例如在SOFTICE中設置下面的斷點:bpx GetDlgItemText(獲取對話框文本),當我們要破解的程序要讀取輸入的數(shù)據而調用GetDlgItemText時,立即被SOFTICE攔截到,從而被破解的程序停留在GetDlgItemText的程序區(qū),而GetDlgItemText是處于WINDWOS自己管理的系統(tǒng)區(qū)域,如果我們擅自改掉這部分的程序代碼,那就大禍臨頭了^_^!所以我們要從系統(tǒng)區(qū)域返回到被破解程序自己的地方(即程序的領空),才能對程序進行破解,至于怎樣看程序的領空請看前面的SOFTICE圖解。試想一下:對于每個程序都會調用的程序段,我們可能從那里找到什么有用的東西嗎?(怎么樣去加密是程序自己決定的,而不是調用系統(tǒng)功能實現(xiàn)的?。?3. API:即Application Programming Interface的簡寫,中文叫應用程序編程接口,是一個系統(tǒng)定義函數(shù)的大集合,它提供了訪問操作系統(tǒng)特征的方法。 API包含了幾百個應用程序調用的函數(shù),這些函數(shù)執(zhí)行所有必須的與操作系統(tǒng)相關的操作,如內存分配、向屏幕輸出和創(chuàng)建窗口等,用戶的程序通過調用API接口同WINDOWS打交道,無論什么樣的應用程序,其底層最終都是通過調用各種API函數(shù)來實現(xiàn)各種功能的。通常API有兩中基本形式:Win16和Win32。 Win16是原來的、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ū)別在于最后的一個字母,例如我們設置這樣的斷點: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ù)包含在動態(tài)鏈接庫(Dynamic Link Libraries,簡稱DLLs)中,即包含在kernel32.dll、user32.dll、gdi32.dll和comctl32.dll中,這就是為什么我們要在softice中用exp=C:\windows\system\kernel32.dll等命令行將這些動態(tài)鏈接庫導入softice中的原因。因為不這樣做的話,我們就無法攔截到系統(tǒng)Win32 API函數(shù)調用了。 4. 關于程序中注冊碼的存在方式:破解過程中我們都會去找程序中將輸入的注冊碼和正確的注冊碼相比較的地方,然后通過對程序的跟蹤、分析找到正確的注冊碼。但是正確的注冊碼通常在程序中以兩種形態(tài)存在:顯式的和隱式的,對于顯式存在的注冊碼,我們可以直接在程序所處的內存中看到它,例如你可以直接在SOFTICE的數(shù)據窗口中看到類似"297500523"這樣存在的注冊碼(這里是隨意寫的),對于注冊碼顯式存在的軟件破解起來比較容易;但是有些軟件的程序中并不會直接將我們輸入的注冊碼和正確的注冊碼進行比較,比如有可能將注冊碼換算成整數(shù)、或是將注冊碼拆開,然后將每一位注冊碼分開在不同的地方逐一進行比較,或者是將我們輸入的注冊碼進行某種變換,再用某個特殊的程序進行驗證等等??傊?,應用程序會采取各種不同的復雜運算方式來回避直接的注冊碼比較,對于這類程序,我們通常要下功夫去仔細跟蹤、分析每個程序功能,找到加密算法,然后才能破解它,當然這需要一定的8086匯編編程功底和很大的耐心與精力。 5. 關于軟件的破解方式:本人將破解方式分為兩大類,即完全破解和暴 力 破解。所謂完全破解主要是針對那些需要輸入注冊碼或密碼等軟件來說的,如果我們能通過對程序的跟蹤找到正確的注冊碼,通過軟件本身的注冊功能正常注冊了軟件,這樣的破解稱之為完全破解;但如果有些軟件本身沒有提供注冊功能,只是提供試用(DEMO),或是注冊不能通過軟件本身進行(例如需要獲取另外一個專用的注冊程序,通過INTERNET的注冊等等),或者是軟件本身的加密技術比較復雜,軟件破解者的能力、精力、時間有限,不能直接得到正確的注冊碼,此時我們需要去修改軟件本身的程序碼,即人為改變軟件的運行方向,這樣的破解稱之為暴 力 破 解。 6. 關于破解教程中程序代碼地址問題:破解教程中都會放上一部分程序代碼以幫助講解程序的分析方法,例如下面的一段程序代碼:
......
0167:00408033 PUSH 00
0167:00408035 PUSH EBX
0167:00408036 CALL [USER32!EndDialog]
0167:0040803C JMP 0040812C
......
在這里程序中的代碼地址如0167:00408033,其代碼段的值(即0167)有可能根據不同的電腦會有區(qū)別,不一定一模一樣,但偏移值應該是固定的(即00408033不變),所以如果看到破解文章里的程序代碼的地址值和自己的電腦里不一樣,不要以為搞錯地方了,只要你的程序代碼正確就不會有問題。 7. 關于如何設置斷點的問題:正確恰當?shù)脑O置好斷點對于快速有效的解密非常重要,好的斷點設置可以使我們迅速找到關鍵的程序段,而不恰當?shù)臄帱c則會對解密造成不必要的精力消耗,甚至根本就不能攔截到程序的運行。但是具體什么時候用什么斷點比較合適很難說,這需要自己用經驗去累積,總的說來bpx hmemcpy這個萬能斷點對大多數(shù)注冊碼方式的軟件都有用,初學者不妨多試試這個斷點(通常我也是用這個斷點設置,懶嘛^_^,哈哈。。。)。對于那些需要暴 力 破 解的非注冊碼方式的軟件,通常我們應該攔截對話框(如bpx DialogBox)和消息框(如bpx MessageBox(A))等。不論對于哪一類軟件,當我們設置的斷點均沒有效果時,可是試一下bpx lockmytask,這個斷點的作用是攔截任何一個按鍵的動作,具體常用的一些斷點設置請參考"破解常用斷點設置"一文。另外,在注冊碼的破解中通常需要輸入用戶名和注冊碼,一般說來用戶名和密碼都可以隨意輸入,但是根據我自己的經驗,很多軟件對于注冊碼都會逐位的進行處理,假如輸入"78787878"這串數(shù)字,那么在跟蹤程序的時候我們就無法知道我們當時所看到的"78"倒底是哪一個"78",所以我比較喜歡用"12345678"這樣的注冊碼輸入方式,這樣的話就就能知道程序是在對注冊碼的哪一位進行運算,同樣的對于那些需要輸入較長序列號的軟件,輸入類似"12345-67890-ABCDEF"這樣的序列號較好。 不過有一點大家需要特別的注意:上面講的注冊碼輸入方式"12345678"是針對攔截WIN32 API函數(shù)來說的,假如有些時候直接攔截WIN32 API函數(shù)難以找到程序的突破口,而要借助于"S"指令在內存中尋找我們輸入的用戶名或注冊碼時,就最好不要采用"12345678"作為注冊碼,因為內存中很可能有許多的"12345678"字符串,這樣我們沒有辦法知道倒底我們要破解的程序使用的是哪一個"12345678",所以我們應該選擇一個不易和內存數(shù)據相同的注冊碼,比如:74747474,對應的搜索指令為: S 30:0 L FFFFFFFF '74747474' 。當然,以上只是我個人的習慣而已,具體用什么樣的輸入形式可以根據本人的愛好、習慣來定,不必拘泥于某一固定的模式。 8. 關于如何跟蹤程序的問題:初學者在開始學習解密的時候往往不知道怎么樣去跟蹤程序,怎么樣找到注冊碼比較的地方,當面對長長的一堆程序代碼時顯得不知所措。通常軟件的程序內部都會利用一個子程序(即 CALL ********)去驗證我們輸入的注冊碼正確與否,對于注冊碼顯式存在的程序,一般都會將所輸入的注冊碼和正確的注冊碼放進寄存器,然后調用驗證子程序進行判斷,將結果返回,應用程序根據子程序返回的結果決定是否注冊成功,這樣的程序經常具有如下的形式:
****:******** MOV EAX,[********] ?。ɑ?PUSH EAX等形式)
****:******** MOV EDX,[********] ?。ɑ?PUSH EDX等形式)
****:******** CALL ********
****:******** TEST EAX,EAX ?。ɑ?TEST AL,AL,或是沒有這一句等形式)
****:******** JNZ ******** ?。ɑ?JZ ********等形式)
其中EAX和EDX指向的內存區(qū)域就是我們輸入的注冊碼和正確的注冊碼,這里的寄存器EAX和EDX是隨意寫的,也可以是ECX,EBX,EDI,ESI等等。對于注冊碼隱式存在的程序,雖然不能直接看到正確的注冊碼,但是通常也是先將所輸入的注冊碼地址放進某個寄存器,然后調用子程序去驗證,破解時就需要進入子程序去分析注冊算法??傊?,看到子程序(call ********)后面跟著跳轉指令(JNZ ********或JZ ********)的地方我們就應該提高警惕,多用 D EAX(或EBX、ECX、EDX、EDI、ESI...等)去看看寄存器指向的內存區(qū)域藏著什么東西。有一點大家要提醒大家:看見程序中使用下面這個函數(shù)是要注意,即GetDlgItenInt,這個API函數(shù)的作用是將輸入的文本轉化為整數(shù),所以這類程序中是不會有顯示存在的注冊碼的,因為注冊碼被轉換為整數(shù)了,程序通常會用CMP ECX,EDX 這種類型的指令去驗證注冊碼的正確性,這里ECX和EDX中存的就是所輸入注冊碼和正確注冊碼的整數(shù)形式,此時可以用 ? edx 和 ? ecx 看到其十進制形式,即我們輸入的形式。 9. 關于軟件的反安裝問題:經常我們使用某些軟件時都會遇到一個問題,就是共享軟件過期之后即使刪掉原程序重新安裝,程序依然不能用,還是一樣提醒你試用期已過請注冊;或者是你已經破解了某個軟件,但是還想繼續(xù)研究它,但是因為軟件已經注冊好,沒有了注冊選項,這時你即使徹底刪掉程序再重新安裝軟件,結果程序運行后還是注冊過的。遇到這樣的情況,其實原因很簡單,因為程序將注冊或過期信息存在了系統(tǒng)注冊表里,所以簡單的重新安裝軟件是無濟于事的。解決的辦法就是自己刪掉注冊表中有關的信息,但是因為注冊表是WINDOWS系統(tǒng)工作的基礎,如果不小心就很可能會損壞它而引起系統(tǒng)異常,所以如果你對注冊表不是很熟的話,應該在修改之前備份一下 注冊表。不論是修改還是備份注冊表都可以使用WINDOWS下的注冊表管理工具"REGEDIT"來進行,一種辦法是在"開始->運行"下輸入"regedit"啟動它,也可以直接點擊"C:\WINDOWS\regedit.exe"來運行。大部分的應用軟件都會將自己的信息存在如下的路徑中:HKEY_LOCAL_MACHINE\Software、HKEY_LOCAL_MACHINE\Software\Microsoft、HKEY_CURRENT_USER\Software、HKEY_CURRENT_USER\Software\Microsoft 或 HKEY_USERS\.DEFAULT\Software下,具體是哪個地方依據不同的程序而有所不同,只要按上面的順序肯定能找到有關應用程序的鍵,然后將和用戶名及注冊碼有關的鍵值刪掉就搞定了。 10. 關于破解練習的問題:學習破解需要大量的練習,對于破解目標的選擇,初學者不宜以大型的、著名的軟件為目標,因為這些軟件通常加密較為復雜,破解不易,應該選擇一些比較不出名的、小型的和早些時候的共享軟件來練習,因為加密相對簡單的軟件有利于初學者快速掌握破解思想和技能。至于習題的來源則很廣泛,可以從網上下載,也可以去市面上購買一些共享軟件光盤
相關文章
- “CMOS密碼”就是通常所說的“開機密碼”,主要是為了防止別人使用自已的計算機,設置的一個屏障2023-08-01
QQScreenShot之逆向并提取QQ截圖--OCR和其他功能
上一篇文章逆向并提取QQ截圖沒有提取OCR功能, 再次逆向我發(fā)現(xiàn)是可以本地調用QQ的OCR的,但翻譯按鈕確實沒啥用, 于是Patch了翻譯按鈕事件, 改為了將截圖用百度以圖搜圖搜索.2023-02-04- QQ截圖是我用過的最好用的截圖工具, 由于基本不在電腦上登QQ了, 于是就想將其提取出獨立版目前除了屏幕錄制功能其他都逆出來了, 在此分享一下2023-02-04
非系統(tǒng)分區(qū)使用BitLocker加密導致軟件無法安裝的解決方法
很多電腦用戶在考慮自己電腦磁盤分區(qū)安全時會采用 Windows 自帶的 BitLocker 加密工具對電腦磁盤分區(qū)進行加密。但有些人加密后就會忘記自己設置的密碼從而導致在安裝其它軟2020-11-25防止離職員工帶走客戶、防止內部員工泄密、避免華為員工泄密事件的發(fā)生
這篇文章為大家詳細介紹了如何才能防止離職員工帶走客戶、防止內部員工泄密、避免華為員工泄密事件的發(fā)生,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-27徹底防止計算機泄密、重要涉密人員離職泄密、涉密人員離崗離職前防范舉
近些年企業(yè)商業(yè)機密泄漏的事件屢有發(fā)生,這篇文章主要教大家如何徹底防止計算機泄密、重要涉密人員離職泄密、告訴大家涉密人員離崗離職前的防范舉措,具有一定的參考價值,2017-06-27- 最近有電腦用戶反應量子計算機可以破解下載的所有的加密算法嗎?其實也不是不可以,下面虛擬就為大家講解買臺量子計算機,如何分分鐘破解加密算法2016-09-26
怎么破解Webshell密碼 Burpsuite破解Webshell密碼圖文教程
webshell是以asp、php、jsp或者cgi等網頁文件形式存在的一種命令執(zhí)行環(huán)境,一種網頁后門。黑客通常會通過它控制別人網絡服務器,那么怎么破解webshell密碼呢?一起來看看吧2016-09-19- 本文討論了針對Linux系統(tǒng)全盤加密的冷啟動攻擊,大家都認為這種攻擊是可行的,但執(zhí)行這么一次攻擊有多難?攻擊的可行性有多少呢?需要的朋友可以參考下2015-12-28
防止泄露公司機密、企業(yè)數(shù)據防泄密軟件排名、電腦文件加密軟件排行
面對日漸嚴重的內部泄密事件,我們如何守護企業(yè)的核心信息,如何防止內部泄密也就成了擺在各個企業(yè)領導面前的一大問題。其實,針對內網安全,防止內部信息泄漏早已有了比較2015-12-17