160个Crackme004
文章目錄
- 查殼
- 導出符號
- 尋找突破口
- 單擊事件
- 結論
- 雙擊事件
- 結論
- 再次尋找突破口
- chkcode事件
- 校驗結果
- 寫出注冊機
查殼
程序是使用delphi編寫的 無殼
導出符號
既然是delphi編寫的 那么我們首先把他放到IDA里,把所有的關于Delphi的簽名全部加上
讓會自動幫我們識別所有的Delphi的函數,可以看到 添加簽名之后 未識別的函數就只有那么一丟丟,剩下的都是庫函數。然后再導出為MAP文件,導入到OD里,可以極大的減輕負擔。
尋找突破口
來觀察一下這個程序,兩個編輯框 一個圖片顯示框,據說是注冊之后會顯示一個朱茵的圖片。沒有按鈕,沒有提示。這尼瑪,完全沒有思路啊怎么整?難道要下內存訪問斷點?
這里要借助一款Delphi的反編譯工具Darkde4來幫助我們尋找突破口。
打開窗體部分,我們看到 原來之前一直誤以為的圖片顯示框是一個大按鈕,而這個大按鈕有兩個對應的相應事件,分別是單擊事件和雙擊事件。
接著再來來到過程部分。
這里是整個程序的所有的響應事件 以及對應的RVA
- 第一個FormCreate是窗體的創建事件 這個不必關心,一般創建事件都是顯示圖形界面相關的操作
- 第二個事件名是chkcode,全稱應該是checkcode,校驗代碼,至于校驗的是什么代碼?不知道
- 第三個KeyUp是響應的鍵盤的彈起
- 第四個DbClick是按鈕的雙擊事件
- 第五個Click是按鈕的單擊事件
那么思路和突破口也就有了,對應單擊和雙擊事件的RVA 直接去OD分析兩個響應事件的具體實現部分。
單擊事件
在單擊事件的RVA 0x00457B8處下斷點,隨便輸入一組用戶名,從上往下分析所有的執行過程。
校驗過程如下
算法循環完了之后 比較[esi+0x30C]的值是否相等,如果不相等直接退出。如果相等,又是一輪重復的循環校驗,接著提示注冊成功。就是說前面的循環算法就是作者下的一個套,真正有用的部分就是這個比較,也就是[esi+0x30C]的值必須是0x85。
結論
[esi+0x30C]的值必須是0x85
OK 單擊事件分析結束 接下來分析雙擊事件
雙擊事件
還是通過Delphi的反編譯工具Darkde4的過程窗口找到雙擊事件的RVA。下斷點,分析。注意,在這之前必須取消單擊事件的斷點,否則斷不下來。
還是同樣的套路,一輪循環的驗證之后,才來到真正有用的部分。
[esi+0x30C]和0x3E作比較,如果成立,就把[esi+0x30C]賦值為0x85,也就滿足了單擊事件的條件。
也就是說必定有一個地方,是把[esi+0x30C]賦值為0x3E。如果滿足了這個條件,那么雙擊事件校驗通過,單擊事件也通過。這簡直就是俄羅斯套娃啊。
結論
[esi+0x30C]的值必須為0x3E
再次尋找突破口
根據雙擊事件經驗 我們能猜測,肯定有一個地方是把0x3E賦值給了[esi+0x30C]。
那么我們直接在OD中,右鍵->查找所有常量,輸入3E,看看能不能找到mov [esi+0x30C],0x3E這樣一條指令。如果能,那么這個就是真正校驗的地方。
雖然跟想象的不一樣 但是大致還是差不多的 跟進去看看。然后,拉到函數最上面
之前導入的IDA的注釋顯示這個是chkcode的校驗事件。就是之前我們在Darkde4過程窗口里看到的checkcode的響應事件,這個應該就是真正的校驗函數了。OK ,下斷點,開始分析
chkcode事件
這個在注冊碼輸入的時候就斷下來的,應該響應的是編輯框變換的響應事件。校驗過程如下
首先獲取用戶名長度 然后將用戶名長度+5,接著進行字符串拼接 拼接方式為黑頭Sun Bird(用戶名長度+5)dseloffc-012-OK(用戶名),拼接好的字符串就是密碼。
校驗結果
接著輸入用戶名和序列號,根據之前的分析過程 我們需要先雙擊,再單擊才能夠校驗成功。
但是這里需要注意一點,在過程窗口中有一個KeyUp鍵盤彈起事件,在你輸入序列號的時候 他會檢測是否有鍵盤彈起,如果沒有 則不成功,這樣做的目的是為了防止復制粘貼。破解的方法也很簡單,在復制粘貼完序列號之后隨便按一個鍵(我按的是方向鍵 因為不會影響到輸入結果),接著雙擊 再單擊。可以看到,成功注冊完成。
寫出注冊機
編寫注冊機 代碼如下
#include "pch.h" #include <stdlib.h> #include <stdio.h> #include <windows.h>int main() {char key1[50] = "黑頭Sun Bird";char key2[50] = "dseloffc-012-OK";char username[20] = { 0 };printf("請輸入用戶名:");scanf_s("%s", username, 20);printf("序列號為:\n");printf("%s%d%s%s\n", key1, strlen(username)+5, key2, username);system("pause"); }校驗結果 隨便輸入一個用戶名,復制到程序,然后隨便按一個按鍵,雙擊 單擊。OK校驗成功!
最后附上我的Github鏈接:https://github.com/TonyChen56/160-Crackme
需要分析過程和udd等相關文件的可以去我的Github下載。
總結
以上是生活随笔為你收集整理的160个Crackme004的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 160个Crackme003之4C大法详
- 下一篇: 160个Crackme006