外掛破解一直以來都是熱門話題,畢竟外掛是一種很特殊的東西,爲了防止被破解掉,外掛一般都會加上猛殼,讓人無法下手。不過有時候外掛並不是那麼神祕,靈活的思考對破解是很有幫助的。今天小生就獻醜了,說說我的破解過程。(注:爲了方便我都是在V3.2b上取代碼和截圖)
二、破解過程
7月18日 第一天
聽說99奇蹟19日0時開始收費,心裏確實不爽,於是決心研究一下這個外掛,首先想到的當然是常規的方法。用PE打開99mu.exe,可以看到加殼類型爲ASProtect 1.2x - 1.3x [Registered] -> Alexey Solodovnikov,習慣性的用插件查看OPE,結果並沒能得到我想要的入口點地址,如圖1。
我個人經驗,用ASProtect 1.2x加的殼都能找到OEP的,估計這個殼比較新,或者被手工修改過的。看來要手工找OPE脫殼了。不過這殼確實挺麻煩的,脫出來了,可IAT中有十多個API函數沒辦法修復,跟了一天都沒結果。
實在沒辦法了,第一天以脫殼失敗告終。
7月19日 第二天
今天沒外掛用了,不死心,決定再突破一下。
用OD載入99mu.exe,用插件隱藏調試標誌(如圖2),
在調試設置中忽略全部異常。載入後會停在以下代碼處:
00401000 9> 68 01006C00 push 99mu.006C0001 //載入後停在這裏
00401005 E8 01000000 call 99mu.0040100B
0040100A C3 retn
0040100B C3 retn
0040100C D16B 84 shr dword ptr ds:[ebx-7C],1
0040100F A8 CE test al,0CE
00401011 98 cwde
00401012 9D popfd
直接F9,讓程序運行起來(如圖3),運行過程中有兩次警告都不用理它。可以看到我們還在99mu這個模塊中,這對我們來說是個好事,試了試常規斷點:
bpx GetDlgItemText
bpx GetDlgItemInt
bpx GetWindowText
bpx GetWindowWord
bpx GetWindowInt
沒一個能斷下來,鬱悶,試試萬能斷點吧(OD下萬能斷點方法請參看2004年4月的X檔案),N麻煩,不過對於我這樣的菜鳥很實用。下短點“BPX *”,在所有命令上下斷,很直接,程序馬上就給OD斷下來了,現在就要取消一些斷點了,因爲外掛的熱鍵有F9所以不能用F9運行程序,要用鼠標點工具欄上的運行按鍵纔可以,現在點一次運行按一次F2,取消一些程序加載時的斷點,直到我們能隨便移動外掛窗口而不被OD斷下來爲止。
好的,現在我們在外掛的“99密碼框”中隨便輸入幾個字符,比如說78787878787878這樣的,有助於跟蹤的字符。然後點登陸,程序又被斷下來。然後的過程很煩,一個CALL就斷一次,我就得判斷一次這個CALL是否對破解有用,跟得頭都大了,當然,還好的是我來到了下邊的位置:
004195FA 68 54EC4300 push 99mu.0043EC54 ; ASCII "%d.%d.%d.%d" //IP地址的格式
004195FF 52 push edx
00419600 E8 E1720100 call 99mu.004308E6 ; jmp to mfc42.#2818
00419605 83C4 18 add esp,18
00419608 8B45 08 mov eax,dword ptr ss:[ebp+8]
0041960B 50 push eax
0041960C E8 297B0100 call 99mu.0043113A ; jmp to WS2_32.inet_addr
00419611 8B8E 48030000 mov ecx,dword ptr ds:[esi+348] //在這裏可以看到IP
00419617 8941 34 mov dword ptr ds:[ecx+34],eax
看004195FA那裏的%d.%d.%d.%d像什麼?對的,像IP的格式,放慢速度,在0041960C這個CALL就是增加IP地址的函數,在00419611這裏我們可以看到寄存器裏外掛驗證服務器的IP。看到這裏就有信心了,跟下去,下邊就是把我們的遊戲帳號進行N次運算的過程,本來打算研究研究的,想通過修改驗證服務器IP,然後根據算法寫出個服務端,進行單機驗證的,不過最後放棄了,畢竟我是菜鳥,有沒耐心。決定碰碰運氣,找驗證的地方改跳轉吧。繼續向下看,沒走多遠,就遇到了一個跳轉,代碼如下:
00419723 E8 881E0100 call 99mu.0042B5B0
00419728 85C0 test eax,eax
0041972A 75 29 jnz short 99mu.00419755 //這個跳轉值得研究
0041972C 8B8E 48030000 mov ecx,dword ptr ds:[esi+348]
00419732 E8 591E0100 call 99mu.0042B590
00419737 51 push ecx
00419738 8BCC mov ecx,esp
0041973A 8965 E0 mov dword ptr ss:[ebp-20],esp
0041973D 68 2CEC4300 push 99mu.0043EC2C ; ASCII "can not pass authen" //這裏很有意思
00419742 E8 B7710100 call 99mu.004308FE ; jmp to mfc42.#537
00419747 8BCE mov ecx,esi
00419749 E8 52FBFFFF call 99mu.004192A0
本來對這個跳轉沒怎麼注意的,不過看到“ASCII "can not pass authen"”字樣我就樂了(圖4),有什麼說的,這個就是驗證的地方了。把0041972A處的jnz short 99mu.00419755 改爲je short 00419755 ,試試看,不出所料驗證通過了。
有了這些寶貴的資料,現在我們要做的就是怎麼修改這個跳轉的問題,因爲沒脫殼,不能用改代碼的方法 ,不要說次次都開OD來改吧,這樣太恐怖了。其實動態修改的方法我早想好了,做個內存補丁就OK了,請出keymake1.73,從菜單中的“其他→製作內存補丁”開始製作內存補丁,把“等到進程閒置時修改內存”給鉤上,然後添加要修改的內存數據,修改地址就是0041972A這個跳轉,由75 29可以知道數據長度爲2,原始指令就是75 29了,修改指令爲74 29,如圖5,然後生成補丁就OK了。今天的成果不錯哦。
7月20日 第三天
今天下午1點,99奇蹟更新3.2b版,呵呵,沒什麼說的,抄傢伙,破掉它。直接用OD載入,讓程序運行起來,搜索字符參考,找到“can not pass authen”,雙擊它,然後向上看,明擺着一個跳轉指令在哪,動手,直接製作內存補丁。OK,整個過程不用三分鐘,怎麼樣,爽吧?