前言:最近剛跟朋友拿到Hit2010的Wargame 裡面有CrackMe系列的原始檔
看了幾個發現非常的有趣,手癢就來分析一下,這是針對Window CrackMe系列的第一題
想玩的人請到這裡抓:http://cn.ziddu.com/download/604447/HIT2010-CreakMe_1.rar.html
題目要求:拿到Key
提示:在特定時間值,分數突破9000000分,就會出現Key
打開程式發現,居然是大多數人童年都有玩過的貓釣魚遊戲~估摸~~~~
看到這張圖片是不是勾起些童年的回憶了呢!?
接下來就來對他進行分析,我第一個想到的是用CE,改變他的分數,直接刷上9百萬分
這裡給出2個用CE找出來的關鍵位置,因為沒有偏移,是通用的
0040F272 時間位置
005315C0 分數位置
但改了後發現,Key並沒有如願的出現,因為提示還有一個特定的時間值...!?
接下來想到了用OD,先直接搜尋字符串,完全沒什麼關鍵的提示
但好像也沒甚麼關鍵的斷點可以下,就在苦思中靈光一閃!
"搜索常數",馬上興奮的把9百萬,轉換成16進制--->895440
OD搜索常數 895440 , 賓果!! 直接找到關鍵點了
這裡我OD裡面註釋的很詳細了,放張圖
看到這行
0040CA65 cmp dword ptr ds:[5315C0],895440
如果前面有用CE做功課,就知道這是分數與9百萬做比較
再看到這行
0040CA80 cmp dword ptr ds:[40F272],66
就是時間與 "66" 做比較,換算成10進位也就是和 "102" 做比較 ,這時候回到CE,把時間值改成102鎖定
就可以開心的看到Key彈出來啦
流程寫成偽代碼大概就是
While(True) { if (分數 > 9000000) { if (解碼) continue; if (時間 == 102) { Xor解碼(Key) MessageBoxA(Key); } } }
筆記:前前後後分析用了快1小時...主要是突破點一直沒想到,開了OD在訊息循環那裏繞來繞去
有時候靈光一閃的那種感覺真的很棒呢XD,也難怪一開始用字符串完全搜索不到
因為真正的Key存放在40CB00,沒達成條件就不解碼,又學到了一手
後面還有好多題Creakme,會找暑假搞定再慢慢寫詳解出來 也希望大家一起來玩看看囉
By Kost0911 2011.7.4 暑假第三篇