標籤:ollydbg 破解 彙編
下面的案例主要介紹反組譯碼的使用價值,即在軟體加解密方面的應用,可以很好地體會到基本的彙編指令在實踐中的應用,也可以認識到Ollydbg在軟體調試過程中的威力。
選用的樣本程式CRACKME.exe程式來自看雪論壇的“從零開始用ollydbg cracking”系列。本文只做學習交流用途,不作其他任何用途。
下面開工:
1. 採用ollydbg開啟CRACKME.exe,命令:f3;
2. 註冊的正確與否,程式會快顯視窗,視窗上會帶有字串,那我們這裡就以正確與否的字串作為線索;命令:右鍵->search for-> all referred strings;
3. 找到如下的string:Great work,mate! now try the next CrackMe!",並且雙擊進入,跳轉到調用該字串的地方;
4. 從可見,下面兩個快顯視窗就是最後看到註冊資訊對錯的提醒視窗,那麼以這兩個為線索,查看是從哪裡跳轉到這兩個函數調用起始處的;
5. 滑鼠停在push 30處,可以看到下面的觀察視窗顯示:local call from 0040124C;
也即意味著push 30處是由0040124C處跳轉過來的;那麼查看該處的指令;
6. 此處關鍵的指令就在401241處,通過該處指令的比較,來確定後面序號的正確與否,再來選擇後面的跳轉。
7. 通過在CMP EAX, 0指令處打斷點,我們F9運行程式,程式彈出註冊視窗,我們輸入:
然後按ok後,整個程式就停在我們下斷點的地方。如所示,
8. 根據右邊的注釋,上述的流程就很清晰,401228處的指令將使用者名稱abc字串地址壓入,然後進行處理後,將結果儲存在EAX中,後面的將序號123也做同樣的處理;可以猜測對於序號操作的結果應該輸出在EBX中,這樣後面的CMP EAX, EBX這條語句才說得通;
9. 我們F7單步跟入40122D的函數調用,看到如下的處理過程:
簡單跟蹤下的話,可以發現上述的代碼等同於下面的C語言代碼:
int nameCrack(char* str){char t;int sum = 0;while(*str){int t = (int)(*str);if(t > 0x5A)sum += (int)(t-0x20);str++;}sum = sum ^ 0x5678;return sum;}
對於我們的輸入abc,上述函數的輸出為:0x56BE;
10. 同樣地,我們對於401238處的指令也進行跟蹤調試:
上述的代碼等同於下面的C代碼:
int numCrack(char* str){int sum = 0;while(*str){int c = (int)*str - 0x30;sum = 10*sum + c;str++;}return (sum ^ 0x1234);}
11.根據調試,EAX和EBX的值分別為:56BE和124F,兩者不同,因此解密失敗;為了讓兩者相同,我們保持abc不變,改變序號來實現。
12. 56BE與0x1234亦或操作後的值的十進位表示為:17546。因此我們只要輸入的字串操作的值sum等於17546即可。又因為數位ASSIC碼是從”0x31”開始的,
而代碼中有減去0x30的操作,因此我們輸入的數字只要是17546即可。
反組譯碼的應用1-軟體破解