日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

逆向游乐园第五关

發(fā)布時間:2023/12/31 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 逆向游乐园第五关 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 預備知識
    • 1.關于調(diào)試器和反編譯工具簡介
    • 2.PE查殼工具
    • 3.匯編指令
    • 4.寄存器
    • 5.Little-endian(小端序)
  • 實驗目的
  • 實驗環(huán)境
  • 實驗步驟一
  • 實驗步驟二
  • 實驗步驟三

預備知識

1.關于調(diào)試器和反編譯工具簡介

OLLYDBG是一個新的動態(tài)追蹤工具,將IDA與SoftICE結合起來的思想,Ring 3級32位調(diào)試器,非常容易上手,己代替SoftICE成為當今最為流行的調(diào)試解密工具了。同時還支持插件擴展功能,是目前最強大的調(diào)試工具。
IDA PRO簡稱IDA(Interactive Disassembler),是一個世界頂級的交互式反匯編工具,有兩種可用版本。標準版(Standard)支持二十多種處理器。高級版(Advanced)支持50多種處理器。
UPX(the Ultimate Packer for eXecutables)是一款先進的可執(zhí)行程序文件壓縮器,壓縮過的可執(zhí)行文件體積縮小50%-70%,這樣減少了磁盤占用空間、網(wǎng)絡上傳下載的時間和其它分布以及存儲費用。通過UPX壓縮過的程序和程序庫完全沒有功能損失和壓縮之前一樣可正常地運行,對于支持的大多數(shù)格式?jīng)]有運行時間或內(nèi)存的不利后果。UPX支持許多不同的可執(zhí)行文件格式包含Windows 95/98/ME/NT/2000/XP/CE程序和動態(tài)鏈接庫、DOS程序、Linux可執(zhí)行文件和核心。
WinHex是一個專門用來對付各種日常緊急情況的小工具。它可以用來檢查和修復各種文件、恢復刪除文件、硬盤損壞造成的數(shù)據(jù)丟失等。同時它還可以讓你看到其他程序隱藏起來的文件和數(shù)據(jù)。總體來說是一款非常不錯的16進制編輯器。得到ZDNetSoftwareLibrary五星級最高評價,擁有強大的系統(tǒng)效用。

2.PE查殼工具

PEiD(PE Identifier)是一款著名的查殼工具,其功能強大,幾乎可以偵測出所有的殼,其數(shù)量已超過470種PE文檔的加殼類型和簽名。
ExEinfo PE是一款免費的Win32可執(zhí)行程序檢查器,它可以檢查程序的打包方式,exe保護等,可以幫助開發(fā)人員對程序進行編譯。

3.匯編指令

4.寄存器

EAX是“累加器”(accumulator),它是很多加法乘法指令的缺省寄存器。
EBX是“基地址”(base)寄存器,在內(nèi)存尋址時存放基地址。
ECX是計數(shù)器(counter),是重復(REP)前綴指令和LOOP指令的內(nèi)定計數(shù)器。
EDX則總是被用來放整數(shù)除法產(chǎn)生的余數(shù)。
ESI/EDI分別叫做“源/目標索引寄存器”(source/destination index),因為在很多字符串操作指令中,DS:ESI指向源串,而ES:EDI指向目標串。
EBP是“基址指針”(BASE POINTER),它最經(jīng)常被用作高級語言函數(shù)調(diào)用的“框架指針”(frame pointer)。

5.Little-endian(小端序)

數(shù)據(jù)的高位字節(jié)存放在地址的高端,低位字節(jié)存放在地址低端。

實驗目的

通過該實驗了解調(diào)試工具和反編譯工具的使用方法,能夠通過分析樣本中的詳細信息,進行程序的爆破或者算法的還原突破程序的限制,本次實驗主要針對VB編寫的程序。

實驗環(huán)境


服務器: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。

運行一下,看看報錯信息。

我們搜索字符串。

跟進錯誤信息,往上找到函數(shù)頭部下斷。

然后我們隨意填寫注冊碼,然后單步分析。

取字符串長度,判斷是不是等于9,不等于就跳到注冊碼錯誤地方。

然后取字符串長度,對比ebp-18的值。Ebp-18是從1開始自增的,而且不能大于注冊碼長度,注冊碼長度要求是9位,也就是最大為9。我們繼續(xù)往下看。

判斷迭代的每位是不是大于‘9’。

再判斷是不是大于30也就是‘0’。
綜上就是檢測注冊碼是不是純數(shù)字,如果不是就好像影響



導致下方

004038AD處跳轉(zhuǎn)到注冊碼錯誤。往下看:

此處是取ebp-18,也就是從一開始迭代的那個值,到9。讓它與2進行異或運算。

然后在取注冊碼迭代到的當前位,入棧,通過AnsivalueBstr獲取到它的Ansii碼。然后通過vba8Str壓入浮點運算器ST0,然后進行雙精度浮點運算。減去48,值彈出到ebp-C8。
再此說一下,VB的所有算數(shù)運算,均為浮點運算。也就是說每位減去48。

隨后我們來到了關鍵點,先將之前與2異或的密文轉(zhuǎn)換為char。然后用vb的vbaVarTstNe進行不等比較。

如果不等,就返回FFFFF,相等則零。
Ebp-80是我們用戶輸入的當前位(注意,是浮點類型的)。
Ebp-D0是密文的當前位的char類型。
我們此處需要讓其相等,也就是返回0值,作者是用的不等檢測的相等。

往下看可以看到:

00403A01 | 66 85 FF | test di,di | 00403A04 | 75 1C | jne bjanes.1.403A22 |

很明顯,檢測di是否為0。
上文用TstNe檢測的結果返回給了eax,然后又給了edi。

004039B6 | FF 15 A0 10 40 00 | call dword ptr ds:[<&__vbaVarTstNe>] | 兩位進行比較 004039BC | 8B F8 | mov edi,eax | 此處關鍵點 FFFFFF

所以此處檢測如果vbaVarTstNe返回的不為0,也就是當前位不與明文相等,則執(zhí)行004033A04處的跳轉(zhuǎn)。

如果執(zhí)行了,就直接跳轉(zhuǎn)到了注冊碼錯誤彈窗,而此處跳過了一個jmp,對就是00403A1D處的,他是構成一個while循環(huán)的關鍵,但是跳過了,就不再繼續(xù)迭代下一位了,so我們可知vbaVarTstNe是用來檢測相等的。而ebp-18在此自增+1。也就是從1一直加到9。
我們可得算法:
1~9與2進行每位異或加48,就是注冊碼了。

實驗步驟二

首先我們對此程序進行查殼分析:

VB程序,沒加殼,運行程序查看一下有哪些考點。

有一個彈窗,需要我們?nèi)サ簟?br />
有報錯。
那么我們直接用VB的反編譯工具進行查看,是否能夠還原代碼。

非常順利,程序能夠還原出來關鍵點,看樣子這個程序很好搞定了,此處是From_Load的事件,它彈了一個MsgBox。
我們OD打開,直接找Private Sub Form_Load() '402C17這個402c17處,往下翻能看到調(diào)用這個對話框的指令。

00402CFE | E8 1D E4 FF FF | call <blaster99.rtcMsgBox> | 關鍵Call Nop掉即可

我們將上述行nop掉,即可去除彈窗。
然后轉(zhuǎn)過來,我們看主要程序考點,注冊。它的按鈕事件也被還原了。

然后,注冊碼似乎也被鮮明的顯示了出來。

loc_004028E3: If (var_58 = "2G83G35Hs2") + 1 = 0 Then GoTo loc_004029DC loc_00402991: var_44 = MsgBox("Danke, das Passwort ist richtig !", CLng(CLng(49)), "Glückwunsch !", 10, 10)

注冊碼就是2G83G35Hs2。
我們試一試:

Ok,完美,這個程序就這么被輕易搞定,主要是他還是固定注冊碼的,相對較為簡單。

實驗步驟三

首先我們進行外殼分析:

OK,是VB6.0的東西。我們可以繼續(xù)使用VB Decompiler進行函數(shù)定位等。

很輕易的就容易發(fā)現(xiàn)這段程序的Check it按鈕事件。
但是于此同時粗讀代碼,能看到此處有SmartCheck彈窗,一開始沒理解什么意思……仔細看,是利用了time函數(shù)判斷了一段代碼的運行時常,如果超時則彈窗,那么這就明白了。這是反調(diào)試機制,因為使用調(diào)試器的時候,你大部分分析代碼的時候使用了單步。他此處檢測超時5s,當然程序自己運行不會產(chǎn)生暫停,自然不會超時,但是單步會造成了長時間的停頓。

loc_00404479: If CLng(Timer) <= 5 Then GoTo loc_0040452C

這句我們用od定位過去。

00404479 | 0F 8E AD 00 00 00 | jle bjcm30a.40452C |

跳過了smartcheck的彈窗,我們?yōu)榱苏{(diào)試方便,可以強制跳轉(zhuǎn),使用jmp修改。

這樣無論如何,都不對出現(xiàn)超時的Check了。此處多處一個nop,是因為jmp所占字節(jié)小于jle的長度,所以用nop補位,不影響。


好,我們在按鈕事件頭部下斷點,進行一步步單步分析。

跳過冗長的初始化階段。

此處有一個冗長單并沒有什么卵用的for循環(huán)在浪費時間,我們直接在jmp下面f4跳過此處。(注意下方之前提到改過的時間檢驗跳,沒改的注意強行跳過)

此處才是真正的算法的開端。

然后讀取用戶的輸入。

檢測長度是否小于5。



此處是統(tǒng)計與第一位相等的數(shù)量,與用戶輸入的長度-1,之間關系。
我們向下可以看到:

00404E27 | FF 15 6C 10 40 00 | call dword ptr ds:[<&__vbaVarTstEq>] |

處的比較有何關聯(lián),當然此處是最后決定是否成功的關鍵。
所以以此點向上,可以回溯到真正的另一處算法循環(huán)。

從00404A7F開始差不多是真正的算法了。再一次獲取輸入的字符串長度然后給B0,然后獲取其Hex的值給9C,然后給A8,當然這里不是關鍵,我們往下看。

然后A8又給了C0,最后去其字符串形式給E0,繼續(xù)取用戶輸入的第一位的Hex然后給90。

此時到了算法關鍵的第一步,也就是比對的第一個值。取第一位的hex然后壓入乘號,然后壓入注冊碼長度,做乘法運算。值放在ecx中。

然后此處是把字符串的每位取Hex相加。
這個循環(huán)是比較字符串每位Hex值相加的結果與第一位Hex乘以字符串長度的值。

然后比較以上兩種算法是否同時成立。
由此可以推出算法就是與第一位相同個數(shù)不能超過字符串長度-1且每位Hex相加和字符串長度和等于第一位Hex乘以字符串長度。
那么符合的自然是333242424:

總結

以上是生活随笔為你收集整理的逆向游乐园第五关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。