MySQL Manager 2.8.0.1脫殼破解手記破解分析

看雪資料發表於2004-11-03

【破文標題】 MySQL Manager 2.8.0.1脫殼破解手記破解分析
【破文作者】springkang[DFCG]
【作者主頁】www.chinadfcg.com
【作者郵箱】springkang2003@yahoo.com.cn
【所屬組織】DFCG
【軟體名稱】 MySQL Manager 2.8.0.1
【下載地址】http://www.ems-hitech.com/mymanager/
【破解工具】OllyDBG1.10,loadpe,impr,brain and hands
【保護方式】ASProtect 1.2 / 1.2c-> Alexey Solodovnikov
【軟體限制】30天試用
【破解難度】中等
【破解時間】始破於二○○四年七月二十九日,脫文作於二○○四年十一月二日
----------------------------------------------------
軟體介紹:
    強大的mysql管理工具,允許使用者透過圖形介面建立或編輯資料庫物件,並提供透過sql語句管理使用者和許可權,透過圖形介面建立sql語句,自動生成html格式的資料庫文件,匯入/匯出資料,檢視/編輯blob欄位等功能
----------------------------------------------------
破解聲名:學習和研究殼的脫法!幫助脫殼小菜鳥成功走上脫殼大菜鳥之路系列之一
----------------------------------------------------
【破解分析】
    今年7月在DFCG官方論壇0day區裡看到這款軟體,不知出於何目的就稀裡糊塗的把它下了。查殼是ASProtect 1.2 / 1.2c-> Alexey Solodovnikov,很老的版本了!當時也覺得很奇怪,aspr的殼1.23版的脫文到處都是,已經被人研究得很透徹了,1.3甚至2.0的殼都已經出來了,一個剛出的新軟體為何還要用老版殼來保護?現在fly 和loveboom都脫到2.0的了,想必我沒有必要再講脫這個老版本的殼了吧!可是當初大菜鳥我在脫它的時候,遇到了一點麻煩,什麼麻煩,先賣個關子,。。。呵呵(暈,誰扔的雞蛋,%¥^&*@@,要扔就扔點硬幣噻:-) )。兩個月前,e5v 兄弟曾經向我問過如何破解它,其實我哪裡會什麼演算法破解,只不過這個軟體過分依賴殼的保護,才讓大菜鳥我得了個便宜。時隔這麼久,要不是當初e5v的幾次問起,的確不好意思作此脫文!
好吧,費話說了一大通,切入正題吧!
老規矩,忽略除記憶體異常外的所有異常,載入,
00401000 >  68 01A0C600     PUSH MyManage.00C6A001  //停在這裡
00401005    C3              RETN
00401006    AA              STOS BYTE PTR ES:[EDI]
00401007    803446 FA       XOR BYTE PTR DS:[ESI+EAX*2],0FA
0040100B    C9              LEAVE

F9執行,按shift+F9在第十六次時來到第一次硬碟指紋出現的地方:
01280260    3100            XOR DWORD PTR DS:[EAX],EAX  //第十六次時來到這裡,我們看看堆疊,然後ALT+M, 下記憶體訪問斷點
01280262    EB 01           JMP SHORT 01280265
01280264    68 648F0500     PUSH 58F64
01280269    0000            ADD BYTE PTR DS:[EAX],AL
0128026B    00EB            ADD BL,CH

0012D748   01270000
0012D74C   01250000
0012D750   01280038
0012D754   00000000
0012D758   01351E0C  ASCII "0hUeFQCQUXY="  //第十六次時就會看到它,你的機器可能不是這些字元,差不多是類似的,呵呵
0012D75C   00000000
0012D760   00000000

記憶體映象,專案 23
 地址=00401000   //就在這裡下記憶體斷點了
 大小=0062F000 (6483968.)
 Owner=MyManage 00400000
 區段=
 包含=code
 型別=Imag 01001002
 訪問=R
 初始訪問=RWE

下斷後按shift+F9,中斷,先別取消記憶體斷點;
00A2E37C    55              PUSH EBP   //停在這裡,F9。
00A2E37D    8BEC            MOV EBP,ESP
00A2E37F    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
00A2E382    A3 C89AA300     MOV DWORD PTR DS:[A39AC8],EAX  //要注意A39AC8,後面的麻煩就是他引起的,此時eax=0127C784。現在暫時不理它
00A2E387    5D              POP EBP
00A2E388    C2 0400         RETN 4



F9若干次後,來到
00A2E290    55              PUSH EBP    //來到這裡
00A2E291    8BEC            MOV EBP,ESP
00A2E293    A1 549DA300     MOV EAX,DWORD PTR DS:[A39D54]
00A2E298    8B55 08         MOV EDX,DWORD PTR SS:[EBP+8]
00A2E29B    8910            MOV DWORD PTR DS:[EAX],EDX
00A2E29D    A1 C8AFA300     MOV EAX,DWORD PTR DS:[A3AFC8]
00A2E2A2    8B55 0C         MOV EDX,DWORD PTR SS:[EBP+C]
00A2E2A5    8910            MOV DWORD PTR DS:[EAX],EDX
00A2E2A7    5D              POP EBP
00A2E2A8    C2 0800         RETN 8   //以上幾行用F9小心跟,仔細觀察每行的數值和堆疊,這幾行程式碼主要是處理使用的次數和日期的。

00A2E280    55              PUSH EBP  //然後再來到這
00A2E281    8BEC            MOV EBP,ESP
00A2E283    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
00A2E286    A3 C49AA300     MOV DWORD PTR DS:[A39AC4],EAX  //這裡就要注意了,A39AC4裡存放的就是註冊名。我們在命令列裡輸入:dd 00a39ac4。看看記憶體的值,如下:
00A2E28B    5D              POP EBP
00A2E28C    C2 0400         RETN 4

此時記憶體的值:
00A39AB8  0000001E  
00A39ABC  0000001E  //以上兩行是次數和日期的值,把它們修改一下
00A39AC0  00000000
00A39AC4  00A2E18C  MyManage.00A2E18C   //這裡放的是註冊名,找個空白的地方,改成你的註冊名,我找的是00a3b738,把它的值改成springkang[DFCG]
00A39AC8  0127C784     //這裡先不管,回頭再收拾它。

經修改後的記憶體值如下:
00A39AB8  FFFFFFFF
00A39ABC  FFFFFFFF   //實踐中好像此不改也行,呵呵。但改了總比不改好!
00A39AC0  00000000
00A39AC4  00A3B738  ASCII "springkang[DFCG]"  //不過這裡小心,如果在到達最後一次異常時或入口點,可能會變成了其他的值,再把它改回來就是了。另一種方法就是在入口點處,準備dump前來修改,這樣也可靠些!
00A39AC8  0127C784

取消記憶體斷點,shift+F9來到最後一次異常處了:
0135F054    FE01            INC BYTE PTR DS:[ECX]  //來到這裡
0135F056  ^ EB E8           JMP SHORT 0135F040
0135F058    98              CWDE
0135F059    BB 00000000     MOV EBX,0
0135F05E    64:8F03         POP DWORD PTR FS:[EBX]
0135F061    5B              POP EBX

ALt+M再次下記憶體斷點,中斷後,就停在入口處了,
00A2F6CC    55              PUSH EBP   //沒有被偷的程式碼,太好了!
00A2F6CD    8BEC            MOV EBP,ESP
00A2F6CF    83C4 F4         ADD ESP,-0C
00A2F6D2    B8 B4E3A200     MOV EAX,MyManage.00A2E3B4
00A2F6D7    E8 A8A49DFF     CALL MyManage.00409B84
00A2F6DC    A1 84A2A300     MOV EAX,DWORD PTR DS:[A3A284]

loadpe dump後,再用impr追蹤層次一和外掛修復,全部有效。
執行出錯,^%¥¥%^&@!
好吧,載入出脫殼修復後的程式看看,是什麼原因:
發現當執行到下面程式碼時出錯:
00A2F730    FF15 C89AA300   CALL DWORD PTR DS:[A39AC8]  //跟進去看看

0127C784    0007            ADD BYTE PTR DS:[EDI],AL  //跟進後是這樣的
0127C786    0000            ADD BYTE PTR DS:[EAX],AL
0127C788    0000            ADD BYTE PTR DS:[EAX],AL
0127C78A    0000            ADD BYTE PTR DS:[EAX],AL
0127C78C    0007            ADD BYTE PTR DS:[EDI],AL
0127C78E    0000            ADD BYTE PTR DS:[EAX],AL
0127C790    0013            ADD BYTE PTR DS:[EBX],DL

我們還是載入原程式看看:

0127C784    833D A8352801 0>CMP DWORD PTR DS:[12835A8],0 //原來是引用了殼中程式碼,執行不錯才怪,要想辦法搞定!
0127C78B    74 06           JE SHORT 0127C793  //這行沒跳轉,估計是沒什麼用
0127C78D    FF15 A8352801   CALL DWORD PTR DS:[12835A8]  ; MyManage.00A2E2AC   //這行有用 ,但也呼叫了殼中程式碼,           
0127C793    C3              RETN    //這個也有用


先小結一下:
看來要修復呼叫的殼中程式碼才好辦,怎麼做?其實OD已經為我們做到了,看
0127C78D    FF15 A8352801   CALL DWORD PTR DS:[12835A8]     ; MyManage.00A2E2AC ,它引用殼中程式碼,但最終引用的是00A2E2AC的資料,呵呵,這下好辦了。
我們在找個空地輸入如下程式碼就行了:
call 00A2E2AC
retn

我是在00A2FFBD這行輸入的,輸入後如下,然後右鍵->複製到可執行檔案儲存:
00A2FFBD      E8 EAE2FFFF   CALL dumped_.00A2E2AC
00A2FFC2      C3            RETN

dd 00a2ffbd看看記憶體區吧:
00A2FFBD  FFE2EAE8
00A2FFC1  0000C3FF  //這兩行資料用得上

現在,程式碼是修復好了,問題是怎樣讓出錯行00A2F730    FF15 C89AA300   CALL DWORD PTR DS:[A39AC8] 呼叫00A2FFBD的程式碼呢?

我在第一次脫它的時候用的方法記不起來了,:-(。
還好我今晚又想到了一個方法:
還記得我在上面說的:“0A2E382    A3 C89AA300     MOV DWORD PTR DS:[A39AC8],EAX  //要注意A39AC8,後面的麻煩就是他引起的,此時eax=0127C784。現在暫時不理它”,以及“00A39AC8  0127C784     //這裡先不管,回頭再收拾它” 這兩句話嗎?

對了,我們就是要在dump前,把00A39AC8裡的數值改成00A2FFBD,然後再把00A2FFBD 裡的值改成 FFE2EAE8
00A2FFC1裡的值改成  0000C3FF

此時dump後,用impr修復後,就執行正常了!哈哈,一切OK!
----------------------------------------------------
【總結】
幾個月沒脫殼了,手都生了!
此文獻給 e5v 兄弟!同時感謝他為NSSG論壇提供了空間!
也以此文紀念我學習脫殼一週年吧!
----------------------------------------------------
【版權資訊】
版權公有,人權私有。如需轉載,註明作者!

相關文章