WinZip Nag 的去除 (3千字)

看雪資料發表於2001-09-13

記得論壇上曾經有人說過一種破解NAG的方法:在NAG彈出來以後,給可以關閉它的BUTTON送一個
WM_COMMAND訊息。思路早就有了,可是具體實現的方法還沒看見過有人寫(不過我看過一片E文的文章專門
講這個的,講得很好。看來中國的CRACKER們寫東西的幹勁不太足呀!^_^)。前天借同學買的《電腦愛好
者》2001年上半年合訂本看的時候,看到有篇文章就是寫這個的,文章題目叫:《Winzip賴帳器》,有興趣
的朋友可以自己去找找看看,那篇文章是VC++寫的,我們CRACKER們最喜歡的還是ASM吧?所以我寫了一個
ASM的版本,給大家參考參考(大蝦們不要笑我不自量力喲!)。
    首先分析一下程式的作用:假設我們程式的名稱叫做“loader.exe”。我們把它放在Winzip的目錄
中,然後在資源管理器中設定zip檔案的開啟方式為:loader.exe。當我們雙擊一個zip檔案時,loader.exe
獲取要解壓的zip檔案的檔名,並以此為命令列引數傳遞給winzip32.exe,由於我們使用的winzip是未註冊版本,所以winzip32.exe一執行,就會出來一個NAG,讓我們選擇“I Agree”,或者是“Quit”,我們程式的
任務就是向I Agree按鈕傳送一個WM_COMMAND訊息,以此消除NAG。
    好了,程式的功用我們知道了,下面我們就要分析一下用什麼函式可以達到我們的目的:
    要傳送一個WM_COMMAND函式給一個BUTTON,我們必須知道兩個值:按鈕所在視窗的HWND和按鈕的ID
,這樣我們就可以用invoke SendMessage,HWND,WM_COMMAND,ID,0達到給它傳送訊息的目的。按鈕的ID很好辦
,執行WINZIP,用SPY看一下就可以了。我得出的結果是:左邊的按鈕的ID是2901,右邊的按鈕的ID是2902,
下面我們就要得到視窗的HWND了,取得HWND,最常用的方法是FindWindow,你只要知道視窗的caption,用該
函式就可以得到該視窗的HWND,但是,WINZIP執行時,除開開始的那個NAG外,還有一個不可見的也以WINZIP
為CAPTION的視窗,所以,我們得到HWND後,還要用GetWindowLong獲得該視窗的GWL_ID,如果是0,那麼我們就算找到了我們要找的視窗了(用SPY可以得知NAG的ID是0)。
    好了,大致的流程定下來了,下面我們還有一個工作要做:判斷到底是2901是我們要得BUTTON,還是
2902是我們要的BUTTON。跟蹤一下知道,按鈕上的文字是DrawTextA畫上去的,所以,我們還要寫一段gdi函式。
    問題都解決了,下面看看該程式的原始碼吧:
----------------------------------------Cut From Here--------------------------------------
    .386
    .model flat,stdcall
    option casemap :none

include    windows.inc
include    gdi32.inc
include    kernel32.inc
include    user32.inc

includelib    gdi32.lib
includelib    kernel32.lib
includelib    user32.lib
    
    .data
szDirect    db    100 dup (?)
szCmdline    db    100 dup (?)
szExename    db    'WinZip32.exe'
szFile    db    50 dup (0)
szLoad    db    'loader.exe',0
szWinzip    db    'WinZip',0
szSubbuffer db    20 dup (0)
stStartup    STARTUPINFO    <?>
stProcinfo    PROCESS_INFORMATION    <?>
rcMyrect    RECT    <?>
szFlag    dd    ?
hWinzip    dd    ?
dcMydc    dd    ?

    .code
start:            
    mov    dword ptr [stStartup],44h
    call    GetCommandLine
    mov    esi,eax
    xor    eax,eax
    invoke    lstrlen,esi
    mov    ecx,eax
    invoke    SearchPath,NULL,offset szLoad,NULL,100,offset szDirect,offset szFlag
    add    esi,eax
    mov    edi,offset szFile
    invoke    lstrlen,esi
    mov    ecx,eax
    rep    movsb
    invoke    CreateProcess,0,offset szExename,0,0,0,20h,0,0,offset stStartup,offset stProcinfo
find:
    invoke    FindWindow,NULL,offset szWinzip
    or    eax,eax
    jz    find
    mov    hWinzip,eax
    invoke    GetWindowLong,eax,GWL_ID
    cmp    eax,0
    jnz    find
    invoke    SetWindowPos,hWinzip,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE OR SWP_NOMOVE
    invoke    GetWindowRect,hWinzip,offset rcMyrect
    invoke    GetDC,0
    mov    dcMydc,eax
    invoke    GetPixel,dcMydc,384,402
    .if    eax==0
        invoke    SendMessage,hWinzip,WM_COMMAND,2902,0
    .else    
        invoke    SendMessage,hWinzip,WM_COMMAND,2901,0
    .endif
    invoke    ExitProcess,NULL
end    start
---------------------------------------------Cut End-----------------------------------------
                    The End:
aNY qUESTION,eMAIL tO:luoyi.ly@yeah.net
Thanks For Your Reading

相關文章