溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

通過使用ollydbg匯編語言的代碼逆推序列號的算法

發布時間:2020-07-25 12:05:44 來源:網絡 閱讀:845 作者:tangjiashiertui 欄目:開發技術

依舊使用的是traceme,相關內容請參考https://blog.51cto.com/181647568/2421560

通過反復的研究traceme的匯編代碼,我通過觀察賦值的值來推測某些命令的作用。

通過使用ollydbg匯編語言的代碼逆推序列號的算法

我在指令的右邊標注了那些代碼都是干什么的,直到最后一行的call命令,這個call命令是接下來跳轉的部分了,下圖中的je也是我們最一開始爆破nop掉的那個那個命令,所以無論正確的序列號是怎么出來的,已經就在call TraceMe.00401340中了。

通過使用ollydbg匯編語言的代碼逆推序列號的算法

點擊call的行按住回車可以跳轉到這個方法中,為了方便我在這里加了斷點,以后我可以通過F9鍵來快速的跳到這一步。

通過使用ollydbg匯編語言的代碼逆推序列號的算法

根據查看賦值我很快的發現了上圖結尾幾行為一個循環部分。

通過使用ollydbg匯編語言的代碼逆推序列號的算法

循環結束后,程序又做了一個取序列號的操作,并且在下方進行了一次對比(lstrcmpA方法)。因為根據前面的一篇博客(https://blog.51cto.com/181647568/2421560)我已經能夠取到正確的驗證碼了,所以在這個地方我分別輸入了正確的和錯誤的驗證碼,查看情況。結果表明這個程序在運行完成后會有一個寄存器(EAX)保留著一個值,序列號碼錯誤為0正確為1。

而這個test就是控制je命令的。

那么這樣我可以確認,序列號就是在那個循環中算出來的。

通過使用ollydbg匯編語言的代碼逆推序列號的算法

我可以看到一個0x7的我一開始以為是循環七次,然后我看著循環反復的重復著,mov部分,我可以清楚地看到藍色部分的賦值,

通過使用ollydbg匯編語言的代碼逆推序列號的算法

上圖是第一次循環的結果,我可以認出這個字符是我輸入的用戶名的第四位,為了驗證是否和我想的一致,我修改了好幾次用戶名,每次都是第四位。而且被轉換成數字了,我猜測是ascii碼,在表格上一對應,確實是ASCII碼,不過是16進制的。

而mov粉紅色的一部分是十六進制的C,我沒搞清楚是什么意思。

然后接下來的操作包含了imul,add,inc三個操作符,我特意百度了一下imul是乘法相當于edx=edx*ebx,數值是前面的用戶名第四位的ASCII碼和C的積。同理add就是esi=esi+edx,這個esi只在這句話里出現,而edx正好是前面乘法的結果,所以每次循環的積都會被累加到esi中。

inc ecx則是指ecx=ecx+1這個很像是計數器,所以ecx,eax都是計數器,它們都對應著一個cmp。

最后的那個cmp用ecx和edi,根據我的調試,edi永遠是用戶名的長度,而且這個判斷是控制循環的,這個循環從4開始循環到用戶名長度的那個數。

在每次循環中我反復的觀察兩個MOV命令,藍色部分比較明顯,永遠是用戶名的第N位的ASCII碼,從4開始。粉紅色部分就比較奇怪了,第一個是C,第二次是A第三次是13,都是16位的數字,毫無規律可循。于是我只能去理解[eax+0x405030]是什么意思了,首先eax一定指的是寄存器eax,eax的值會由一句inc eax每次都加1,而在循環第一句會判斷這個eax是否會大于7,如果大于7會執行xor eax,eax,這個操作會把eax清零。(而在一開始我把這個7給理解錯了,我以為這個控制循環次數的,循環從4開始,到用戶名長度結束,如果用戶名長度很長的話,也只會運行七次。但是后來我輸入了一個較長的用戶名,運行七次后并沒有退出程序。)

0x405030明顯是一個內存地址,我右鍵“數據窗口中跟隨”然后查到這個內存地址

通過使用ollydbg匯編語言的代碼逆推序列號的算法

對應的ASCII碼是亂碼,我一開始沒有理解,不過在幾次循環后我發了規律,oc oa 13 09這些數字和粉紅色參數的值是對應的,我立即就猜出了第四次循環的藍色值和粉紅色的值。第四次循環的結果確定了,當時還沒能理解eax和這個內存地址的關系。我就用了一個比較長的用戶名不停的測試,粉紅色部分一直到最后的08之后并沒有到D0而是回到了0C。于是我就能理解了,這是八個數字開始循環的。于是整個循環的命令差不多就能模擬出了。

從用戶名的第四個字符開始取ASCII碼乘以C,第五個字符的ASCII碼乘以A,一次類推,第十二個字符又開始乘以C。直到最后一個字符。這些乘積都加起來,轉換成十進制就是序列號。


算碼器用易語言寫是這樣的,其他的語言寫起來應該更加簡單。不過我就不舉例了。

.版本 2

.支持庫 spec


.子程序 子程序1

.局部變量 用戶名, 文本型

.局部變量 序列號, 整數型

.局部變量 用戶名長度, 整數型

.局部變量 計數器, 整數型

.局部變量 第二個數, 整數型, , "0"

.局部變量 sum, 整數型


用戶名 = “traceme”

用戶名長度 = 取文本長度 (用戶名)

第二個數 = { 12, 10, 19, 9, 12, 11, 10, 8 }


計數器 = 1

.判斷循環首 (計數器 + 3 ≤ 用戶名長度)

? ? sum = sum + 取代碼 (取文本中間 (用戶名, 計數器 + 3, 1), ) × 第二個數 [計數器 % 8]

? ? 計數器 = 計數器 + 1

? ? ' 暫停 ()

.判斷循環尾 ()

調試輸出 (sum)


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女