豪傑選單處理函式分析和研究

看雪資料發表於2015-11-15

標 題:豪傑選單處理函式分析和研究 

發信人:藍星

時 間: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,。。。。。。。。修改完畢,開啟豪傑,點一下那個開啟影碟的按鈕,靠!?

       一切良好,我們們下節課再見!

相關文章