翻譯(1) (6千字)

看雪資料發表於2000-07-22

膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊?
    膊    ____                    __      __          膊
    膊  /  _/_ _  __ _  ___  ____/ /____ _/ /          膊
    膊  _/ //  ' \/  ' \/ _ \/ __/ __/ _ `/ /            膊
    膊 /___/_/_/_/_/_/_/\___/_/  \__/\_,_/_/            膊
    膊  ____                          __          __    膊
    膊  / __ \___ ___ _______ ___  ___/ /__ ____  / /____膊
    膊 / /_/ / -_|_-</ __/ -_) _ \/ _  / _ `/ _ \/ __(_-<膊
    膊/_____/\__/___/\__/\__/_//_/\_,_/\_,_/_//_/\__/___/膊
    膊                                                  膊
    膊      Web: http://www.ImmortalDescendants.com      膊
    膊                    Author: UmE                    膊
    膊                  Date: 03/13/00                  膊
    膊  Topic: Re-enabling functions - Cool Edit 2000  膊
    膊            Level: Beginner/Intermediate          膊
    膊                                                  膊
    膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊?

介紹:現在有許多軟體是以演示版(有一些功能被禁止)提供給使用者的.多數
情況下,被禁止的功能按鈕是灰色的.一般來說,我們能夠利用EnableMenuItem
這個API函式啟用它們,但是它們被啟用後不能正常工作.在這篇文章中,我將
介紹如何使演示版的軟體正常工作.

所用工具:SoftIce 3.24 或更高版本

試驗軟體:Cool Edit 2000, cool2000.exe, 3420160位元組

讓我們開始吧!!!

步驟1:
當你執行程式時,出現一對話方塊,提示你想啟用那個功能.那意思就是說,你不能
使用軟體的所用功能,但同時也意味著這個程式包含所有被禁止功能的程式,
它是在啟動時,根據你的選擇進行切換的.我們的工作就是使所有的功能都能使用.
如果我們啟用選項3和4,軟體就提供Filters,Noise redction,Amplify,Envelope...
但除了Save功能.我將教你如何在它被禁止的時候啟用它,啟用其他功能的過程與
此相同.
首先,開啟一個檔案,你能看到在File選單中的Save和Save As項是灰色的.
我們想啟用它,因此進入SoftIce(按CTRL+D)並設斷點(bpx enablemenuitem).
EnableMenuItem函式的結構如下:

BOOL EnableMenuItem (
        HMENU hMenu            // handle to menu resource
        UINT uIDEnableItem      // menu item to enable, disable or gray
        UINT uEnable            // menu item flags
        );

在ASM中呼叫的格式是:

PUSH    uEnable
PUSH    uIDEnableItem
PUSH    hMenu
CALL    [KERNEL32!EnableMenuItem]

對於我們來說,重要的是找到那個啟用選單項的標誌
我們知道:

uEnable=0            選單項被啟用(the item is enabled)

好吧,現在退出SoftIce,點選File選單,馬上你又回到SoftIce.按F11鍵返回到:

:00411580 6A01                    push 00000001        <-uEnable flag
:00411582 6875010000              push 00000175
:00411587 56                      push esi
:00411588 FFD3                    call ebx        <- Call EnableMenuItem

這不是我們要找的,因為它傳遞了一個常數給函式
如果你按Ctrl+D,程式將繼續執行EnableMenuItem功能enable或disable各選單項
在這個過程中,請注意EBP暫存器儲存的是uIDEnableItem,直到你看到EBP=047E.
這個ID正好是Save As選單項(你可以用W32Dasm反彙編cool2000.exe並找到此ID,
在列表開始部分的選單資訊區)
當你看到EBP=047E時按F11後程式如下


:004128A5 668B440C1C              mov ax, word ptr [esp+ecx+1C]
:004128AA 50                      push eax
:004128AB 55                      push ebp
:004128AC 56                      push esi
:004128AD FF15D0535600            Call dword ptr [005653D0]    <-EnableMenuItem

eax(uEnable標誌)的值取決於ESP和ECX.我們只要將"mov ax,word ptr[esp+ecx+1c]"
改為"mov ax,0000"(注意在指令後面加nop,保證與前面指令位元組數相同),這樣程式將
把0傳遞給EnableMenuItem函式.按上面的方法修改後,重新啟動程式,你將看到Save As
選單項已經enable了.但是當你按Save As時,程式自動關閉了.到底發生了什麼事情?
跟我來你會看到!!!

步驟2:現在我們已經啟用了所有選單項,我們希望它們能工作.
正如你知道的:當點選選單項時,程式將發出一個WM_COMMAND給系統,系統將根據相關
的ID處理它.
開啟SoftIce並輸入"hwnd".這條命令將返回所有在桌面上已開視窗的handle.
你可看到下列內容:

Window Handle    hQueue    Sz    QOwner    Class Name    Window Procedure

我們感興趣的是window如何處理Cool Edit的主視窗.我們想從WM_COMMAND產生的地方
觀察到底發生了什麼.注意下面:

Window Handle    hQueue    Sz    QOwner        Class Name    Window Procedure

  0414(1)      1087    32    COOL2000        COOL2000SS  32CF:0000051E

現在在message WM_COMMAND(it needs also the handel of the window)處設斷點

                    bmsg 0414 WM_COMMAND

從SoftIce中退出並點選Save As選單項......你將回到SoftIce.
記住我們要找的是處理此ID號的一小段程式碼:我們能在source code中找到,因為
程式設計者不可能修改系統dll使其適應他的程式!

設定下面的斷點:bpx k32thk1632prolog(想了解為什麼?在www.ImmortalDescendants.com
站點可找到相關資料),按Ctrl+D退出SoftIce,但馬上又回來了,按F11鍵,到:

CALL    [KERNEL32!K32Thk1632Prolog]
CALL    [.....]                 <-This is very important!!
CALL    [KERNEL32!K32Thk1632Epilog]

按F8進入[KERNEL32!K32Thk1632Prolog]後面的call,直到你找到cool2000的程式碼,
現在注意各個暫存器的值,繼續跟蹤直到:

:004C896D 8B8C24EC010000          mov ecx, dword ptr [esp+000001EC]
:004C8974 8B9424E8010000          mov edx, dword ptr [esp+000001E8]
:004C897B 51                      push ecx
:004C897C 52                      push edx                <- 1
:004C897D 57                      push edi                <- 2
:004C897E 50                      push eax                <- 3
:004C897F FF15C4545600            Call dword ptr [005654C4]        <- 4

1-將edx壓入堆疊(edx=111).這是WM_COMMAND資訊的HEX碼
2-將edi壓入堆疊(edi=047e).這是Save As選單項的ID
3-將eax壓入堆疊(eax=0414).這是cool2000的window handle
4-呼叫SendMessageA函式

這個功能將WM_COMMAND資訊傳送到系統的資訊佇列.下一步這個資訊將被 DefWindowProcA函式
處理.按F8進入SendMessageA函式直到你再次來到cool2000的程式碼,在此我們將找到關鍵點:

:00422900 55                      push ebp
:00422901 8BEC                    mov ebp, esp
:00422903 83E4F8                  and esp, FFFFFFF8
:00422906 B854140000              mov eax, 00001454
:0042290B E890FE1100              call 005427A0
:00422910 A124AE5800              mov eax, dword ptr [0058AE24]
:00422915 53                      push ebx
:00422916 56                      push esi

注意EDI=047E,繼續跟蹤你將發現程式如何使用EDI
從此處我們的ID將與各種常數比較以確定我們選擇的ID.
跟蹤若干行後,發現:

:0042C389 81FF7E040000            cmp edi, 0000047E    <-Yeah!! Our ID!!
:0042C38F 0F8738070000            ja 0042CACD
:0042C395 0F840A080000            je 0042CBA5        <-Jump to 0042CBA5

At 0042CBA5 we find:

:0042CBA5 6A01                    push 00000001
:0042CBA7 E8C4AB0600              call 00497770
:0042CBAC 83C404                  add esp, 00000004
:0042CBAF 85C0                    test eax, eax
:0042CBB1 7511                    jne 0042CBC4

在0042CBA7的call用於選擇被選的ID是處理還是跳過.
如果eax=0,ID被跳過;eax=1,ID被處理.
因此將jne改為jmp,Save As選單項將恢復功能


希望你能喜歡此教程!

Bye!

UmE

Contact me at: ume15@hotmail.com

相關文章