逆向游乐园第五关
目錄
- 預備知識
- 1.關于調試器和反編譯工具簡介
- 2.PE查殼工具
- 3.匯編指令
- 4.寄存器
- 5.Little-endian(小端序)
- 實驗目的
- 實驗環境
- 實驗步驟一
- 實驗步驟二
- 實驗步驟三
預備知識
1.關于調試器和反編譯工具簡介
OLLYDBG是一個新的動態追蹤工具,將IDA與SoftICE結合起來的思想,Ring 3級32位調試器,非常容易上手,己代替SoftICE成為當今最為流行的調試解密工具了。同時還支持插件擴展功能,是目前最強大的調試工具。
IDA PRO簡稱IDA(Interactive Disassembler),是一個世界頂級的交互式反匯編工具,有兩種可用版本。標準版(Standard)支持二十多種處理器。高級版(Advanced)支持50多種處理器。
UPX(the Ultimate Packer for eXecutables)是一款先進的可執行程序文件壓縮器,壓縮過的可執行文件體積縮小50%-70%,這樣減少了磁盤占用空間、網絡上傳下載的時間和其它分布以及存儲費用。通過UPX壓縮過的程序和程序庫完全沒有功能損失和壓縮之前一樣可正常地運行,對于支持的大多數格式沒有運行時間或內存的不利后果。UPX支持許多不同的可執行文件格式包含Windows 95/98/ME/NT/2000/XP/CE程序和動態鏈接庫、DOS程序、Linux可執行文件和核心。
WinHex是一個專門用來對付各種日常緊急情況的小工具。它可以用來檢查和修復各種文件、恢復刪除文件、硬盤損壞造成的數據丟失等。同時它還可以讓你看到其他程序隱藏起來的文件和數據。總體來說是一款非常不錯的16進制編輯器。得到ZDNetSoftwareLibrary五星級最高評價,擁有強大的系統效用。
2.PE查殼工具
PEiD(PE Identifier)是一款著名的查殼工具,其功能強大,幾乎可以偵測出所有的殼,其數量已超過470種PE文檔的加殼類型和簽名。
ExEinfo PE是一款免費的Win32可執行程序檢查器,它可以檢查程序的打包方式,exe保護等,可以幫助開發人員對程序進行編譯。
3.匯編指令
4.寄存器
EAX是“累加器”(accumulator),它是很多加法乘法指令的缺省寄存器。
EBX是“基地址”(base)寄存器,在內存尋址時存放基地址。
ECX是計數器(counter),是重復(REP)前綴指令和LOOP指令的內定計數器。
EDX則總是被用來放整數除法產生的余數。
ESI/EDI分別叫做“源/目標索引寄存器”(source/destination index),因為在很多字符串操作指令中,DS:ESI指向源串,而ES:EDI指向目標串。
EBP是“基址指針”(BASE POINTER),它最經常被用作高級語言函數調用的“框架指針”(frame pointer)。
5.Little-endian(小端序)
數據的高位字節存放在地址的高端,低位字節存放在地址低端。
實驗目的
通過該實驗了解調試工具和反編譯工具的使用方法,能夠通過分析樣本中的詳細信息,進行程序的爆破或者算法的還原突破程序的限制,本次實驗主要針對VB編寫的程序。
實驗環境
服務器:Windows XP SP3,IP地址:隨機分配
輔助工具:Ollydbg、PEiD 0.95、ExeinfoPE、IDA Pro v6.8、Delphi Decompiler、UPX UnPacker、WinHex
破解程序:bjanes.1、bjanes.2、blaster99
實驗步驟一
首先利用偵殼子、工具對樣本(三個CrackMe)進行偵測分析,判斷是否存在保護,然后對于存在暗樁的程序進行一部處理,最后對算法過程等分析回溯。
首先,我們對程序進行查殼分析。
VB程序,我們用OD打開,也能看出,這是標準的VB。
運行一下,看看報錯信息。
我們搜索字符串。
跟進錯誤信息,往上找到函數頭部下斷。
然后我們隨意填寫注冊碼,然后單步分析。
取字符串長度,判斷是不是等于9,不等于就跳到注冊碼錯誤地方。
然后取字符串長度,對比ebp-18的值。Ebp-18是從1開始自增的,而且不能大于注冊碼長度,注冊碼長度要求是9位,也就是最大為9。我們繼續往下看。
判斷迭代的每位是不是大于‘9’。
再判斷是不是大于30也就是‘0’。
綜上就是檢測注冊碼是不是純數字,如果不是就好像影響
和
導致下方
004038AD處跳轉到注冊碼錯誤。往下看:
此處是取ebp-18,也就是從一開始迭代的那個值,到9。讓它與2進行異或運算。
然后在取注冊碼迭代到的當前位,入棧,通過AnsivalueBstr獲取到它的Ansii碼。然后通過vba8Str壓入浮點運算器ST0,然后進行雙精度浮點運算。減去48,值彈出到ebp-C8。
再此說一下,VB的所有算數運算,均為浮點運算。也就是說每位減去48。
隨后我們來到了關鍵點,先將之前與2異或的密文轉換為char。然后用vb的vbaVarTstNe進行不等比較。
如果不等,就返回FFFFF,相等則零。
Ebp-80是我們用戶輸入的當前位(注意,是浮點類型的)。
Ebp-D0是密文的當前位的char類型。
我們此處需要讓其相等,也就是返回0值,作者是用的不等檢測的相等。
往下看可以看到:
很明顯,檢測di是否為0。
上文用TstNe檢測的結果返回給了eax,然后又給了edi。
所以此處檢測如果vbaVarTstNe返回的不為0,也就是當前位不與明文相等,則執行004033A04處的跳轉。
如果執行了,就直接跳轉到了注冊碼錯誤彈窗,而此處跳過了一個jmp,對就是00403A1D處的,他是構成一個while循環的關鍵,但是跳過了,就不再繼續迭代下一位了,so我們可知vbaVarTstNe是用來檢測相等的。而ebp-18在此自增+1。也就是從1一直加到9。
我們可得算法:
1~9與2進行每位異或加48,就是注冊碼了。
實驗步驟二
首先我們對此程序進行查殼分析:
VB程序,沒加殼,運行程序查看一下有哪些考點。
有一個彈窗,需要我們去掉。
有報錯。
那么我們直接用VB的反編譯工具進行查看,是否能夠還原代碼。
非常順利,程序能夠還原出來關鍵點,看樣子這個程序很好搞定了,此處是From_Load的事件,它彈了一個MsgBox。
我們OD打開,直接找Private Sub Form_Load() '402C17這個402c17處,往下翻能看到調用這個對話框的指令。
我們將上述行nop掉,即可去除彈窗。
然后轉過來,我們看主要程序考點,注冊。它的按鈕事件也被還原了。
然后,注冊碼似乎也被鮮明的顯示了出來。
注冊碼就是2G83G35Hs2。
我們試一試:
Ok,完美,這個程序就這么被輕易搞定,主要是他還是固定注冊碼的,相對較為簡單。
實驗步驟三
首先我們進行外殼分析:
OK,是VB6.0的東西。我們可以繼續使用VB Decompiler進行函數定位等。
很輕易的就容易發現這段程序的Check it按鈕事件。
但是于此同時粗讀代碼,能看到此處有SmartCheck彈窗,一開始沒理解什么意思……仔細看,是利用了time函數判斷了一段代碼的運行時常,如果超時則彈窗,那么這就明白了。這是反調試機制,因為使用調試器的時候,你大部分分析代碼的時候使用了單步。他此處檢測超時5s,當然程序自己運行不會產生暫停,自然不會超時,但是單步會造成了長時間的停頓。
這句我們用od定位過去。
中
跳過了smartcheck的彈窗,我們為了調試方便,可以強制跳轉,使用jmp修改。
這樣無論如何,都不對出現超時的Check了。此處多處一個nop,是因為jmp所占字節小于jle的長度,所以用nop補位,不影響。
好,我們在按鈕事件頭部下斷點,進行一步步單步分析。
跳過冗長的初始化階段。
此處有一個冗長單并沒有什么卵用的for循環在浪費時間,我們直接在jmp下面f4跳過此處。(注意下方之前提到改過的時間檢驗跳,沒改的注意強行跳過)
此處才是真正的算法的開端。
然后讀取用戶的輸入。
檢測長度是否小于5。
此處是統計與第一位相等的數量,與用戶輸入的長度-1,之間關系。
我們向下可以看到:
處的比較有何關聯,當然此處是最后決定是否成功的關鍵。
所以以此點向上,可以回溯到真正的另一處算法循環。
從00404A7F開始差不多是真正的算法了。再一次獲取輸入的字符串長度然后給B0,然后獲取其Hex的值給9C,然后給A8,當然這里不是關鍵,我們往下看。
然后A8又給了C0,最后去其字符串形式給E0,繼續取用戶輸入的第一位的Hex然后給90。
此時到了算法關鍵的第一步,也就是比對的第一個值。取第一位的hex然后壓入乘號,然后壓入注冊碼長度,做乘法運算。值放在ecx中。
然后此處是把字符串的每位取Hex相加。
這個循環是比較字符串每位Hex值相加的結果與第一位Hex乘以字符串長度的值。
然后比較以上兩種算法是否同時成立。
由此可以推出算法就是與第一位相同個數不能超過字符串長度-1且每位Hex相加和字符串長度和等于第一位Hex乘以字符串長度。
那么符合的自然是333242424:
總結
- 上一篇: ob测试过程问题记录
- 下一篇: Maven的下载及安装