1. 程式人生 > >軟體漢化:OllyDBG 入門之五-- 破解注意事項(轉)

軟體漢化:OllyDBG 入門之五-- 破解注意事項(轉)

1.斷點:

所謂斷點就是程式被中斷的地方,中斷就是由於有特殊事件(中斷事件)發生,計算機暫停當前的任務(即程式),轉而去執行另外的任務(中斷服務程式),然後再返回原先的任務繼續執行。打個比方:你正在上班,突然有同學打電話告訴你他從外地坐火車過來,要你去火車站接他。然後你就向老闆臨時請假,趕往火車站去接同學,接著將他安頓好,隨後你又返回公司繼續上班,這就是一箇中斷過程。解密的過程就是等到程式去獲取我們輸入的註冊碼並準備和正確的註冊碼相比較的時候將它中斷下來,然後我們通過分析程式,找到正確的註冊碼。所以我們需要為被解密的程式設定斷點,在適當的時候切入程式內部,追蹤到程式的註冊碼,從而達到crack

的目的。

2.領空:

所謂程式的領空,就是我們要破解的程式自己程式碼所處的位置。也許你馬上會問:我是在程式執行的時候設定的斷點,為什麼中斷後不是在程式自己的空間呢?因為每個程式的編寫都沒有固定的模式,所以我們要在想要切入程式的時候中斷程式,就必須不依賴具體的程式設定斷點,也就是我們設定的斷點應該是每個程式都會用到的東西。在DOS時代,基本上所有的程式都是工作在中斷程式之上的,即幾乎所有的DOS程式都會去呼叫各種中斷來完成任務。但是到了WINDOWS時代,程式沒有權力直接呼叫中斷,WINDOWS系統提供了一個系統功能呼叫平臺(API),就和DOS程式以中斷程式為基礎一樣,WINDOWS程式以API為基礎來實現和系統打交道,

從而實現各種功能,所以WINDWOS下的軟體破解其斷點設定是以API函式為基礎的即當程式呼叫某個API函式時中斷其正常執行,然後進行解密。例如在SOFTICE中設定下面的斷點:bpx GetDlgItemText(獲取對話方塊文字),當我們要破解的程式要讀取輸入的資料而呼叫GetDlgItemText時,立即被SOFTICE攔截到,從而被破解的程式停留在GetDlgItemText的程式區,而GetDlgItemText是處於WINDWOS自己管理的系統區域,如果我們擅自改掉這部分的程式程式碼,那就大禍臨頭了^_^!所以我們要從系統區域返回到被破解程式自己的地方(即程式的領空),才能對程式進行破解
。對於每個程式都會呼叫的程式段,我們可能從那裡找到什麼有用的東西嗎?(怎麼樣去加密是程式自己決定的,而不是呼叫系統功能實現的!)

3.API:

即Application Programming Interface的簡寫,中文叫應用程式程式設計介面,是一個系統定義函式的大集合,它提供了訪問作業系統特徵的方法。API包含了幾百個應用程式呼叫的函式,這些函式執行所有必須與作業系統相關的操作,如記憶體分配、向螢幕輸出和建立視窗等,使用者的程式通過呼叫API介面同WINDOWS打交道,無論什麼樣的應用程式,其底層最終都是通過呼叫各種API函式來實現各種功能的。通常API有兩種基本形式:Win16和Win32。Win16是原來的API的16位版本,用於Windows3.1;Win32是現在的API的32位版本,用於Windows 95/98/NT/ME/2000。Win32包括了Win16,是Win16的超集,大多數函式的名字用法都是相同的。16位的API函式和32位的API函式的區別在於最後的一個字母,例如我們設定這樣的斷點:bpx GetDlgItemText、bpx GetDlgItemTextA和bpx GetDlgItemTextW,其中 GetDlgItemText是16位API函式,GetDlgItemTextA和GetDlgItemTextW是32位API函式,而GetDlgItemTextA表示函式使用單位元組,GetDlgItemTextW表示函式使用雙位元組。現在我們破解中常用到的是Win32單位元組API函式,就是和GetDlgItemTextA類似的函式,其它的兩種(Win16 API和Win32雙位元組API函式)則比較少見。Win32 API函式包含在動態連結庫(Dynamic Link Libraries,簡稱DLLs)中,即包含在kernel32.dll、user32.dll、gdi32.dll和comctl32.dll中,這就是為什麼我們要在softice中用exp=C:\windows\system\kernel32.dll等命令列將這些動態連結庫匯入softice中的原因。因為不這樣做的話,我們就無法攔截到系統Win32 API函式呼叫了。

4.關於程式中註冊碼的存在方式:

破解過程中我們都會去找程式中比較假碼和真碼的地方,然後通過對程式的跟蹤、分析找到正確的註冊碼。但是正確的註冊碼通常在程式中以兩種形態存在:顯式的和隱式的,對於顯式存在的註冊碼,我們可以直接在程式所處的記憶體中看到它,例如你可以直接在SOFTICE的資料視窗中看到類似“297500523”這樣存在的註冊碼(這裡是隨意寫的),對於註冊碼顯式存在的軟體破解起來比較容易;但是有些軟體的程式中並不會直接將我們輸入的註冊碼和正確的註冊碼進行比較,比如有可能將註冊碼換算成整數、或是將註冊碼拆開,然後將每一位註冊碼分開在不同的地方逐一進行比較,或者是將我們輸入的註冊碼進行某種變換,再用某個特殊的程式進行驗證等等。總之,應用程式會採取各種不同的複雜運算方式來回避直接的註冊碼比較,對於這類程式,我們通常要下功夫去仔細跟蹤、分析每個程式功能,找到加密演算法,然後才能破解它,當然這需要一定的8086彙編程式設計功底和很大的耐心與精力。

5.關於軟體的破解方式:

本人將破解方式分為兩大類,即完全破解和暴力破解。所謂完全破解主要是針對那些需要輸入註冊碼或密碼等軟體來說的,如果我們能通過對程式的跟蹤找到正確的註冊碼,利用軟體本身的註冊功能正常註冊了軟體,這樣的破解稱之為完全破解;但如果有些軟體本身沒有提供註冊功能,只是提供試用(DEMO),或是註冊不能通過軟體本身進行(例如需要獲取另外一個專用的註冊程式,通過INTERNET的註冊等等),或是軟體本身的加密技術比較複雜,軟體破解者的能力、精力、時間有限,不能直接得到正確的註冊碼,此時我們需要去修改軟體本身的程式碼,即人為改變軟體的執行方向,這樣的破解稱之為暴力破解。

6.關於如何設定斷點的問題:

正確恰當的設定好斷點對於快速有效的解密非常重要,好的斷點設定可以使我們迅速找到關鍵的程式段,但是具體什麼時候用什麼斷點比較合適很難說,這需要自己用經驗去累積,總的說來bpx hmemcpy這個萬能斷點對大多數註冊碼方式的軟體都有,初學者不妨多試試這個斷點。對於那些需要暴力破解的非註冊碼方式的軟體,通常我們應該攔截對話方塊(如 bpx DialogBox)和訊息框(如 bpx MessageBox(A)等。不論對於哪一類軟體,當我們設定的斷點均沒有效果時,試一下bpx lockmytask,這個斷點的作用是攔截任何一個按鍵的動作,具體常用的一些斷點設定請參考“破解常用斷點設定”一文。另外,在註冊碼的破解中通常需要輸入使用者名稱和註冊碼,一般說來使用者名稱和密碼都可以隨意輸入,但是根據我自己的經驗,很多軟體對於註冊碼都會逐位的進行處理,假如輸入“78787878”這串數字,那麼在跟蹤程式的時候我們就無法知道我們當時所看到的“78”倒底是哪一個“78”,所以我比較喜歡用“12345678”這樣的註冊碼輸入方式,這樣的話就能知道程式是在對註冊碼的哪一位進行運算,同樣的對於那些需要輸入較長序列號的軟體,輸入類似“12345-67890-ABCDEF”這樣的序列號較好。不過有一點大家需要特別的注意:上面講的註冊碼輸入方式“12345678”是針對攔截WIN32 API函式來說的,假如有些時候直接攔截WIN32 API函式難以找到程式的突破口,而要藉助於“S”指令在記憶體中尋找我們輸入的使用者名稱或註冊碼時,就最好不要採用“12345678”作為註冊碼,因為記憶體中很可能有許多的“12345678”字串,這樣我們沒有辦法知道到底我們要破解的程式使用的是哪一個“12345678”,所以我們應該選擇一個不易和記憶體資料相同的註冊碼,比如:74747474(本人喜歡用,意思嘛:去死去死。。。哈哈哈^_^),對應的搜尋指令為:S 30:0 L FFFFFFFF '74747474' 。當然,以上只是我個人的習慣而已,具體用什麼樣的輸入形式可以根據本人的習慣來定,不必拘泥於某一固定的模式。

7.關於如何跟蹤程式的問題:

初學者在開始學習解密的時候往往不知道怎麼樣去跟蹤程式,怎麼樣找到註冊碼比較的地方,當面對長長的一堆程式程式碼時顯得不知所措。通常軟體的程式內部都會利用一個子程式(即 CALL ********)去驗證我們輸入的註冊碼正確與否,對於註冊碼顯式存在的程式,一般都會將所輸入的註冊碼和正確的註冊碼放進暫存器,然後呼叫驗證子程式進行判斷,將結果返回,應用程式根據子程式返回的結果決定是否註冊成功,這樣的程式經常具有如下的形式:
****:******** MOV EAX,[********]  (或 PUSH EAX等形式)
****:******** MOV EDX,[********]  (或 PUSH EDX等形式)
****:******** CALL ********
****:******** TEST EAX,EAX     (或 TEST AL,AL,或是沒有這一句等形式)
****:******** JNZ ********     (或 JZ ********等形式)

其中EAX和EDX指向的記憶體區域就是我們輸入的註冊碼和正確的註冊碼,這裡的暫存器EAX和EDX是隨意寫的,也可以是ECX,EBX,EDI,ESI等等。對於註冊碼隱式存在的程式,雖然不能直接看到正確的註冊碼,但是通常也是先將所輸入的註冊碼地址放進某個暫存器,然後呼叫子程式去驗證,破解時就需要進入子程式去分析註冊演算法。總之,看到子程式(call ********)後面跟著跳轉指令(JNZ ********或JZ ********)的地方我們就應該提高警惕,多用 D EAX(或EBX、ECX、EDX、EDI、ESI...等)去看看暫存器指向的記憶體區域藏著什麼東西。有一點大家要提醒大家:看見程式中使用下面這個函式是要注意,即GetDlgItenInt這個API函式的作用是將輸入的文字轉化為整數,所以這類程式中是不會有顯示存在的註冊碼的,因為註冊碼被轉換為整數了,程式通常會用 CMP ECX,EDX 這種型別的指令去驗證註冊碼的正確性這裡ECX和EDX中存的就是所輸入註冊碼和正確註冊碼的整數形式,此時可以用 ? edx 和 ? ecx 看到其十進位制形式,即我們輸入的形式。

8.關於軟體的反安裝問題:

我們使用某些軟體時經常會遇到一個問題,就是共享軟體過期之後即使刪掉原程式重新安裝,程式依然不能用,還是一樣提醒你試用期已過請註冊;或者是你已經破解了某個軟體,但是還想繼續研究它,但是因為軟體已經註冊好,沒有了註冊選項,這時你即使徹底刪掉程式再重新安裝軟體,結果程式執行後還是註冊過的。遇到這樣的情況,其實原因很簡單,因為程式將註冊或過期資訊存在了系統登錄檔裡,所以簡單的重新安裝軟體是無濟於事的。解決的辦法就是自己刪掉登錄檔中有關的資訊,但是因為登錄檔是WINDOWS系統工作的基礎,如果不小心就很可能會損壞它而引起系統異常,所以如果你對登錄檔不是很熟的話,應該在修改之前備份一下注冊表。大部分的應用軟體都會將自己的資訊存在如下的路徑中:HKEY_LOCAL_MACHINE\Software

HKEY_LOCAL_MACHINE\Software\Microsoft

HKEY_CURRENT_USER\Software

HKEY_CURRENT_USER\Software\Microsoft

HKEY_USERS\.DEFAULT\Software下,具體是哪個地方依據不同的程式而有所不同,只要按上面的順序肯定能找到有關應用程式的鍵,然後將和使用者名稱及註冊碼有關的鍵值刪掉就搞定了。

9.關於破解練習的問題:

學習破解需要大量的練習,對於破解目標的選擇,初學者不宜以大型的、著名的軟體為目標,因為這些軟體通常加密較為複雜,破解不易,應該選擇一些比較不出名的、小型的和早些時候的共享軟體來練習,因為加密相對簡單的軟體有利於初學者快速掌握破解思想和技能。至於習題的來源則很廣泛,可以從網上下載,也可以去市面上購買一些共享軟體光碟。

相關推薦

軟體OllyDBG 入門-- 破解注意事項

1.斷點: 所謂斷點就是程式被中斷的地方,中斷就是由於有特殊事件(中斷事件)發生,計算機暫停當前的任務(即程式),轉而去執行另外的任務(中斷服務程式),然後再返回原先的任務繼續執行。打個比方:你正在上班,突然有同學打電話告訴你他從外地坐火車過來,要你去火車站接他。然後你就向老

OllyDBG 入門-- 破解注意事項

1.斷點: 所謂斷點就是程式被中斷的地方,中斷就是由於有特殊事件(中斷事件)發生,計算機暫停當前的任務(即程式),轉而去執行另外的任務(中斷服務程式),然後再返回原先的任務繼續執行。打個比方:你正在上班,突然有同學打電話告訴你他從外地坐火車過來,要你去火車站接他。然後你就向老

使用Redis的注意事項命名

轉載:https://www.cnblogs.com/ajianbeyourself/p/4472788.html 閱讀目錄 1.使用key值字首來作名稱空間 2.建立一個類似 ”registry” 的key用於標記key使用情況 3.注意垃圾回收

網絡駭客入門網絡編程網絡應知應會

網絡網絡駭客入門之網絡編程(一):網絡應知應會一、計算機網絡在設計之初就決定了它結構簡單,傳輸可靠的特點,除此之外,它還能連接不同種類的計算機在網絡上,各個節點同等重要且必須有冗余路由二、網絡在理論上被分為七層,從下到上,物理層,數據鏈路層,網絡層,傳輸層,會話層,表示層,應用層在實際的應用上分為四層,即:鏈

react入門使用webpack搭配環境

ges 名稱 更新 2.0 ref gin 分配 res body react入門之搭配環境(一) 如果你想直接上手開發,而跳過這些搭配環境的繁瑣過程,推薦你使用官方的create-react-app命令 npm install -g create-react-app

Android入門文件系統操作文件操作相關指令

-h tools strong abc his art 為什麽 重命名 path (一)獲取總根 [java] view plain copy File[] fileList=File.listRoots(); //返回fileList.length為1 /

C#可擴展編程MEF學習筆記導出類的方法和屬性

學習 說了 如何 mod ati dem ont num imp 前面說完了導入和導出的幾種方法,如果大家細心的話會註意到前面我們導出的都是類,那麽方法和屬性能不能導出呢???答案是肯定的,下面就來說下MEF是如何導出方法和屬性的。   還是前面的代碼,第二篇中已經提供了下

Linux系統入門命令學習及解析

Linux常用目錄 以下是系統的一級目錄,這些目錄在Linux系統中都有著不同的用處。 /  Linux系統根目錄(重要,常用) /home  包含使用者的檔案:引數設定、個性檔案、文件、資料、EMAIL、快取資料等,每增加一個使用者,系統就會在home目錄下

monkeyrunner入門滑動點選螢幕

細節都寫在裡面了哦,仔細看。。 device.touch裡面的數字是手機螢幕的座標,手機螢幕的座標這樣得知: 開啟設定–系統—開發者選項–指標座標 #device.drag(X,Y,D,S) #X 開始座標 #Y 結束座標 #D 拖動持續時間(以秒為單位),預設1.0秒 #S 插值點時要

monkeyrunner入門安裝解除安裝app

一、配置monkeyrunner環境(這裡就不多說,進網址看看就好了,很簡單的) https://www.cnblogs.com/lynn-li/p/5885001.html 記得確認手機連線了電腦(adb devices 這句命令) 二、開啟cmd,直接終端,執行python檔案(有兩

ROS入門基礎功能詳解

前言:本部分主要介紹ros一些基礎功能的使用,包括建立和編譯工作空間,建立和編譯功能包,建立和編譯節點,建立和編譯訊息,建立和編譯服務以及建立launch檔案。 一、建立和編譯工作空間 1.檢視正在使用的工作空間: echo $ROS_PACKAGE_PATH -------------

vue的原始碼學習——7.資料驅動update

1. 介紹         版本:2.5.17。         我們使用vue-vli建立基於Runtime+Compiler的vue腳手架。  &nb

vue的原始碼學習——6.資料驅動createElement

1. 介紹       版本:2.5.17。         我們使用vue-vli建立基於Runtime+Compiler的vue腳手架。   &nbs

vue的原始碼學習——4.資料驅動render

介紹         版本:2.5.17。        我們使用vue-vli建立基於Runtime+Compiler的v

】程式設計師的上升空間在哪裡 -------《程式設計師成長路線圖入門到優秀》成熟篇節選

程式設計師的上升空間在哪裡 我見證過許多的程式設計師的成長,他們很多人在進入成熟期之後,技術上相對較高,一般專案開發起來比較自信,沒有什麼太大的困難,有的職位上也有所提升,成了專案經理、設計師,有的甚至是到了管理者的位置。又經過很長時間,這些程式設計師卻在也沒有什麼變化和發展

IOS開發入門六——storyboard的使用

    需要iOS開發視訊資料可以加我微信: 1914532832  驗證資訊請註明:IOS開發       上節我們瞭解了使用storyboard如何在單個頁面上放置檢視,並且設定這些檢視的屬性、位置約束等使之達到我們設計的效果。需要了解的人請點選"IOS開發入門之五——

機器學習入門單變數線性迴歸——梯度下降法

  在統計學中,線性迴歸(英語:linear regression)是利用稱為線性迴歸方程的最小二乘函式對一個或多個自變數和因變數之間關係進行建模的一種迴歸分析。這種函式是一個或多個稱為迴歸係數的模型引數的線性組合。只有一個自變數的情況稱為簡單迴歸,大於一個自變數情況的叫做多元迴歸(multi

Allegro實用技巧模塊復用

塊選擇 提示 好的 create mod 文件 實用技巧 lin app 需求分析:使用Allegro軟件進行PCB Layout設計時,當電路圖中有很多路相同的模塊,使用模塊復用的的操作方法,可以顯著提高工作效率,同時也可以使PCB布局在整體上顯得美觀。下面來講述這個方法

決策樹模型組合隨機森林與GBDT

get 9.png 生成 代碼 margin ast decision 損失函數 固定 版權聲明: 本文由LeftNotEasy發布於http://leftnoteasy.cnblogs.com, 本文可以被全部的轉載或者部分使用,但請註明出處,如果有問題,請

JVM基礎深入學習JVM堆與JVM棧

面向 對象的引用 進入 信息 分離 字節 address 出現 運行 JVM棧解決程序的運行問題,即程序如何執行,或者說如何處理數據;JVM堆解決的是數據存儲的問題,即數據怎麽放、放在哪兒,另外JVM堆中存的是對象。JVM棧中存的是基本數據類型和JVM堆中對象的引用。 JV