记得论坛上曾经有人说过一种破解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
- 标 题:WinZip Nag 的去除 (3千字)
- 作 者:夜月
- 时 间:2001-9-13 21:13:27
- 链 接:http://bbs.pediy.com