• 标 题:WinZip Nag 的去除 (3千字)
  • 作 者:夜月
  • 时 间:2001-9-13 21:13:27
  • 链 接:http://bbs.pediy.com

记得论坛上曾经有人说过一种破解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