標 題:豪傑選單處理函式分析和研究
發信人:藍星
時 間:2004年4月05日 12:24
詳細資訊:
豪傑選單處理函式分析和研究
作者:nbw[NE365]
QQ : 343538175
http://nboy.cnwlt.com 很希望和Pe Diy愛好者交流或合作
今天主要介紹如何尋找選單訊息處理的地方,和上兩篇一樣,我們依然拿豪傑解霸2003英雄版開刀。首先考慮最方便的方法吧,用w32dasm反編譯,找到“檔案”/“開啟單個檔案”選單,其ID為: 9c41H。好了搜尋9c41H,看看那裡有沒有類似sub eax, 9c41 ; jnz ……的程式碼,如果有的話就中斷到那裡看看。結果沒有(當然沒有,要不我今天也不用在此長篇大論)。
那就從 “開啟單個檔案”選單的功能入手,這個選單呼叫了通用開啟對話方塊讓使用者選擇影片檔案,於是乎,調出TRW2000:
1、bpx getopenfilenamea 選中:"開啟單個檔案" 選單,被TRE中斷,下命令F12,彈出開啟檔案對話方塊,點取消,再次回到TRW,停留在一個ret處,擊F10進一步,在上面的地址0167:0041ddd6處下中斷命令,也就是這個call呼叫了剛才的getopenfilenamea函式。退出TRW;
2、取消中斷bpx getopenfilenamea,只保留0167:0041ddd6的中斷,並開啟此中斷,在豪傑中選中“開啟多個檔案”選單,未被TRW攔截,說明我們剛才下中斷的Call和“開啟多個選單”選項無關;
3、再次選中“開啟單個檔案”選單,很明顯,被TRW攔截,再次下F12命令,和第一步一樣,取消彈出的開啟檔案對話方塊,TRW又停留在一個ret命令上,F10前進一步,向上面看是:0167:0041e116處,說明我們剛剛從這個call跳出來,清空以前的中斷,在這裡(0167:0041e116)下中斷;
4、重複執行第二步的操作,也就是看我們的中斷是否可以攔截到“開啟多個選單”選項,如果攔不到,再往外面的call跳,直到找到一個call,既可以攔截到“開啟單個檔案”也可以攔截到“開啟多個檔案”,這個Call就是0167:0041f0d1
現在看來:
:0041F0CF 50 push eax ;eax-->選單控制程式碼
:0041F0D0 57 push edi
:0041F0D1 E82A080000 call 0041F900
就是處理選單選項的入口點。
現在我們再次選中“開啟單個檔案”追進這個Call,我們直到,這個選單選項的ID是9c41H,注意觀察,不出幾步就到了下面的選單ID處理部分,如下:
:0041F93A 8D86BF63FFFF lea eax, dword ptr [esi+FFFF63BF] ;esi--->選單ID,由此確定eax
:0041F940 3D88010000 cmp eax, 00000188
:0041F945 0F8715150000 ja 00420E60 ;判斷選單時候都不跳
:0041F94B 33C9 xor ecx, ecx
:0041F94D 8A88E4124200 mov cl, byte ptr [eax+004212E4] ;根據上面查出的eax來確定cl
:0041F953 FF248D00114200 jmp dword ptr [4*ecx+00421100] ;根據ecx(其實是cl)確定要跳轉的方向
最後的dword ptr [4*ecx+00421100]就是訊息對應的函式。
由此可見,豪傑在對選單的處理採用了陣列方式,透過2次對陣列的查詢來完成最終的轉向,相比對各個選單ID直接比較,本方法更為高效,值得學習。
上面我介紹的4步方法,其實是暴力破解中比較常用的方法,說白了就是,一個地方找不到切入點,我們就跳出去,到“外層”空間進行查詢。一部分人對暴破不屑一顧,事實上每種方法都有它值得學習的地方!
事情到此並未結束,我們看到:0041F0D1 call 0041F900是選單的訊息處理函式,現在仍然用TRW對這個call下中斷,試驗一下點選主介面上的按鈕,比如說進度跳上面的那個討厭的“播放影碟”按鈕,看看發現了什麼?
噢,被TRW中斷了。事實證明,我們剛才找到的Call是豪傑解霸的主訊息處理函式。豪傑主視窗的大部分按鈕和選單的訊息由他來接收。這樣一來,我們對豪傑的DIY便大大方便了。
既然發現了這個函式,我們就要對他改造一番,也顯得我們“到此一遊”。具體留下什麼記號呢?就把進度條和“檔案”選單中間的那個按鈕的功能改成“開啟單個檔案”吧。
下命令bpx 0041F953(看看上面這個地址的作用),在F10 ,發現跳往0167:41F96E,也就是說從0167:41F96E開始就進入到了“開啟打個檔案”的功能。那麼我們要修改的按鈕呢?點選那個按鈕,再次中斷,看看往哪裡跳?暈倒,竟然就是下一條命令0167: 41F95A。那麼,我們就NOP大法,把從0167: 41F95A開始到0167:41F96E全部NOP掉。這樣隨便nop這麼多指令,會不會由副作用呢?靠!我才不管那麼多,要是不行的話再SMC嘛。調出Hiew,。。。。。。。。修改完畢,開啟豪傑,點一下那個開啟影碟的按鈕,靠!?
一切良好,我們們下節課再見!