記得論壇上曾經有人說過一種破解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