加密與解密示例程式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 [結果]