160个Crackme011
文章目錄
- 查殼
- 分析思路尋找突破口
- OD分析程序
- 分析核心算法
- 強行推序列號
 
查殼
目標程序是使用VB寫的,和前面三個crackme是同一個作者
分析思路尋找突破口
這個就是這次的目標程序,只提供了一排輸入按鍵和右邊的提示,沒有確定按鈕,那么猜測這個程序校驗序列號的方式應該有兩種,一種是通過Serial編輯框的變化事件來判斷,一種是通過定時器來判斷。
然后再用VB Decompiler來看一下有哪些事件。
從事件的部分可以得出這個程序有四個定時器和12個按鈕的點擊事件,按鈕的點擊事件應該就是輸入相應的字符沒什么其他作用,重點就在定時器上面。
既然有定時器,那么不妨再確認一下
打開PC Hnuter,選中目標進程
右鍵查看->查看進程定時器
有五個定時器,比之前的多了一個。
那么突破口就出來了,
首先查找這個字符串,然后根據字符串找到函數頭的位置,對比定時器的RVA,再進行分析
OD分析程序
接著載入OD,F9運行,搜索字符串
雖然沒找到預期的 UNREGISTRIERT,但是找到了對應的REGISTRIERT,這個應該是注冊成功的提示信息,看這樣子這個源代碼好像是復制粘貼了好幾份,用來混淆的,隨便點一個進去,拉到函數頭的位置,
下斷點之后馬上就斷下來了,然后對比一下VB Decomper的定時器事件
果然就是第一個定時器的回調函數,
分析核心算法
輸入123456789,開始分析整個函數的核心算法
首先是獲取序列號的長度,然后將序列號的長度作為循環的次數,開始算法的循環
然后從序列號左邊取一個字符,然后轉成浮點數,保存到[ebp-0xCC]。
然后取出序列號第一位的ASCII值,轉成浮點數,保存到ST0
然后將ST0+1之后,保存到[ebp-0x7C]的位置,50=49(1的ASCII值)+1
然后將結果的十六進制轉成字符串——50(十進制)=32(十六進制)
接著開始下一輪循環,循環結束之后,將最后的結果保存到[ebp-0x34],然后用vbaVarTstEq把最終計算的字符串和硬編碼的作比較。這個算法倒是異常的簡單,很容易就能根據字符串逆推出序列號
再回到剛才的字符串的問題,這里為什么會有這么多相同的序列號
因為只有一個是真的,只有通過了那唯一一個真的字符串的驗證才能驗證成功,根據剛才的分析可以得出結論,序列號必須的0-9 A-F之間的十六進制數字,我們可以根據這個結論來找出正確的唯一解。
滿足要求的就只有一個,
0 81 7E 74 7D 7A 7D 7C 7F 82 83 6D 74 74 7A 7F 7E 7B 7C 7D 82 6D 81 7E 7B 7C這個唯一解的算法和之前我分析的一模一樣,接著根據硬編碼的字符串逆推出正確的序列號
強行推序列號
到了這里我們有意思的事情就來了,我們已經知道了正確的唯一解字符串,我還還知道一個按鍵對應一個字符串,所以可以我們可以根據把程序自帶的12個按鈕逆推出對應的Key,即使你不知道前面的算法,也可以強行逆推,只要知道一個事實
- 按鍵的ASCII和字符串的數值成正比,ASCII值越大,結果越大
所以我們只要把上述的正確字符串從小到大排序,然后再將程序的十二個按鍵的ASCII值從小到大排序,就能讓字符串和按鍵的值一一對應。然后再根據唯一正確的字符串,輸入相應的按鍵,就能破解程序
| 6D | * | 
| 74 | # | 
| 7A | 0 | 
| 7B | 1 | 
| 7C | 2 | 
| 7D | 3 | 
| 7E | 4 | 
| 7F | 5 | 
| 80 | 6 | 
| 81 | 7 | 
| 82 | 8 | 
| 83 | 9 | 
所以字符串0817E747D7A7D7C7F82836D74747A7F7E7B7C7D826D817E7B7C對應的序列號就是74*3032589#**0541238#7412
需要相關文件的可以到我的Github下載:https://github.com/TonyChen56/160-Crackme
總結
以上是生活随笔為你收集整理的160个Crackme011的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 006 kkrunchy_Ryd之类FS
- 下一篇: 007 未知加密壳
