1. 程式人生 > >加密與解密示例程式TraceMe.exe逆向&演算法分析

加密與解密示例程式TraceMe.exe逆向&演算法分析

OD載入程式,可以看到有2個輸入框

由於要逆向分析,應該在程式獲取使用者輸入之後,做計算之前開始分析

定下思路,先向得到字串的函式下斷,然後返回、跟蹤程式程式碼分析即可。

程式是ANSI編碼,出現長成這樣的對話方塊有倆種可能的函式:

一個一個試試。

反彙編視窗中Ctrl+G跟蹤函式

找到後下硬斷(軟斷對DLL無用)



同理,另一個函式的查詢,下斷過程就不贅述了

執行程式,輸入使用者名稱,隨便填一個序列號

如果使用者名稱小於4個,則不會呼叫演算法計算,故應將使用者名稱加長

序列號隨意,沒有也罷


點選Check,發現程式卡在硬斷處

Alt+F9回到軟體領空

發現是GetDlg函式

而且緊接著下面還有一個

一路步過即可

執行到如圖所示位置就應該開始注意了


首先在資料視窗中Ctrl+G跟蹤Esp+0x4C

發現就是使用者名稱的儲存位置


那麼下一句Test大約就是判斷使用者是不是沒有輸入東西了

Cmp是看看使用者是不是輸入了5個以下的字元(不知道多會,EBX已經變成了你輸入的使用者名稱的長度)

略過即可

再下面的倆個lea分別對應儲存使用者名稱的記憶體地址和你輸的序列號,略過

CALL呼叫程式內地址,較為可疑,跟入

大略掃一下,判斷+各種計算,大約就是演算法地址了

好好分析一下


其中給ECX賦常數較為可疑(即MOV ECX,3)

以後注意

仔細觀察下方jle,比較ecx(即3)與字串長度的值(esp+0x18處的值稍加觀察即可發現是字串長度)

也就是判斷你是不是輸太短了,太短了就直接跳,不執行演算法,並且報錯

步過

 

這個迴圈一股腦的在計算什麼東西,目測就是序列號了

分析演算法可得,迴圈跳過使用者名稱的前3個字元,依次將字元的Ascii碼與一段程式內的記憶體對應相乘,並且將結果累加到Esi

分析下各個暫存器的作用

EAX:程式內的記憶體指標,與ECX一同遞增,每次與字元Ascii相乘,且運算完第8個數後迴圈回第一個數

ECX:使用者名稱記憶體指標,跳過使用者名稱前3個字元

BL:字元Ascii

DL:和字元Ascii相乘的Hex

ESI:結果存放

EDI就是字串長度,判斷是不是要繼續迴圈

到這裡演算法分析就基本結束了

迴圈結束後,將Hex換成等價的十進位制數,並與使用者輸入的進行對比,相同則成功

用VBS寫了這個程式的註冊機,程式碼如下:

str = InputBox("Enter:")
If Len(str) < 4 Then WScript.Quit
Dim Map(7)
Map(0) = &HC
Map(1) = &HA
Map(2) = &H13
Map(3) = &H9
Map(4) = &HC
Map(5) = &HB
Map(6) = &HA
Map(7) = &H8
For i = 4 To Len(str)
	[結果] = [結果] + Asc(Mid(str,i,1))*Map((i-4) Mod 8) 'Mod 8 即對應運算完第8個數後迴圈回第一個數的彙編程式碼
Next
MsgBox [結果]