注册 登录
编程论坛 汇编论坛

汇编模糊查杀。杀不了。帮我看下那里错了

onepc 发布于 2009-09-08 15:25, 839 次点击
.386
.model flat,stdcall
option casemap:none
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include     Shlwapi.inc
includelib  Shlwapi.lib   ;strstr
;;
.data
.const
close db '百度',0
.code

;定义回调函数
_CloseWnd proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
  local @buffer[256]:BYTE   ;接收窗口标题
  invoke IsWindowVisible,hWnd
.if eax ;是否是可见的窗口 eax的值是否不为0
    invoke GetWindowText,hWnd,addr @buffer,256
    invoke StrStr,addr @buffer,offset close
   .if eax
       ;invoke PostMessage,hWnd,WM_CLOSE,0,0
       invoke MessageBox,hWnd,addr @buffer,addr @buffer,0
   .endif
.endif

_CloseWnd endp
start:
.while TRUE
invoke Sleep,300
invoke EnumWindows,_CloseWnd,NULL
.endw

end start
6 回复
#2
东海一鱼2009-09-09 08:48
首先,回调函数原形错误。正确原形为:

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lparam) ;

其次,在EnumWindows没有枚举完窗口前,如果你没有找到目标窗口。应该返回TRUE。返回FALSE将导致EnumWindows退出。

根据以上分析,修改如下:

程序代码:
_CloseWnd proc hWnd,lParam
  local @buffer[256]:BYTE   
  invoke IsWindowVisible,hWnd
.if eax  
    invoke GetWindowText,hWnd,addr @buffer,256
    invoke StrStr,addr @buffer,offset close
   .if eax
       invoke PostMessage,hWnd,WM_CLOSE,0,0
       invoke MessageBox,NULL,addr @buffer,addr @buffer,0
       sub eax,eax                                          ;找到了,返回FALSE  
       ret  
   .endif
.endif
    or eax,1                                                ;没找到,返回TRUE
    ret
_CloseWnd endp
start:
 
.repeat
    invoke    Sleep,300
    invoke   EnumWindows,offset _CloseWnd,NULL
.until eax                                                  ;这里返回FALSE的话,表示目标已找到 窗口枚举完毕                       
    invoke ExitProcess,0
end start
#3
onepc2009-09-26 14:32
再问一下吧。 我用while死循环。但是会不断增加内存。是否是频繁申请局部变量导致的?

程序代码:
_CloseWnd proc uses ebx edi esi,hWnd,lParam
  local @buffer[256]:BYTE   ;接收窗口标题
  invoke IsWindowVisible,hWnd
.if eax ;是否是可见的窗口 eax的值是否不为0
    invoke GetWindowText,hWnd,addr @buffer,256
    invoke StrStr,addr @buffer,offset close
   .if eax
       invoke PostMessage,hWnd,WM_CLOSE,0,0
   .endif
.endif
mov eax,TRUE
ret
_CloseWnd endp
start:
.while TRUE
invoke Sleep,300
invoke EnumWindows,addr _CloseWnd,NULL
.endw
invoke ExitProcess,NULL
end start




EnumWindows调用之后,系统枚举所有窗口,找到一个窗口之后就会进入回调过程。。在过程中,就是你要处理的事情,还有在过程中这个返回false是指什么呢?返回true又是什么,我百度的c代码都是返回true的。。我是这样想,这个过程一定是要返回true的,表示过程结束,控制权又交回给系统枚举下一个窗口。是否这样呢?  
不过这里不管结不结束用了ret是直接会把地址返回??


[ 本帖最后由 onepc 于 2009-9-26 14:45 编辑 ]
#4
东海一鱼2009-09-26 15:16
1、再问一下吧。 我用while死循环。但是会不断增加内存。是否是频繁申请局部变量导致的?
 申请局部变量不会导致内存不断增加,因为局部变量在函数结束后就自动释放了。
 你的内存不断增加是使用API不当导致系统内部资源占用引起的。

2、EnumWindows调用之后,系统枚举所有窗口,找到一个窗口之后就会进入回调过程。。在过程中,就是你要处理的事情,还有在过程中这个返回false是指什么呢?返回true又是什么,我百度的c代码都是返回true的。。我是这样想,这个过程一定是要返回true的,表示过程结束,控制权又交回给系统枚举下一个窗口。是否这样呢?   
不过这里不管结不结束用了ret是直接会把地址返回??

这个我在上面讲过,详见MSDN:

EnumWindowsProc
This function is an application-defined callback function that receives top-level window handles as a result of a call to the EnumWindows function.  
 
BOOL CALLBACK EnumWindowsProc(
HWND hwnd,  
LPARAM lParam );
Parameters
hwnd  
[out] Handle to a top-level window.  
lParam  
[in] Specifies the application-defined value given in EnumWindows or EnumDesktopWindows.  
Return Values
TRUE continues enumeration. FALSE stops enumeration.    //返回 TRUE 继续枚举   返回 FALSE 停止枚举

ret 会返回到系统枚举函数中,系统枚举函数靠返回的eax值(TRUE 、FALSE)判断你的用意。决定下部行动。
 
#5
onepc2009-09-26 15:30
嗯。比如我要 一个程序,一直运行。如何。使他不会内存增加啊?
比如我要查杀我的电脑这个窗口。要如何写呢? 我在上面也没有别的地方申请内存之类的啊?那些api好像也不会有内存操作之类的。
#6
东海一鱼2009-09-26 16:17
API对传给你的每一个窗口句柄在其内部都分配有一个结构变量。内存增加并不可怕,自己分配的只要能够适时释放就行。系统内部的会自己释放。内核对象需要你用CloseHandle之类的函数释放。
#7
swp1601082009-09-27 10:21
api当然有内存操作
1