当前位置:编程学习 > 网站相关 >>

安全探讨之用Win32汇编写双进程守护

前段时间在看雪论坛逛的时候,有人问说怎么实现双进程守护,其中有人说他用VC++实现了,我就找他要了一份源码。我看了一下,觉得也挺简单的,所以就用win32汇编也写了一份,但还不是很完美。


为什么说不完美,因为我写完后在测试的过程中发现,如果利用鼠标给这个对话框发送WM_CLOSE消息的话,进程守护就很完美,对话框窗口是关不掉的。但是如果利用任务管理器来结束的话,那就很容易了,原因是因为获取的快照是相当于“历史”。而用任务管理器结束掉一个进程后,快照发生改变。就好比我们照像,照好的相片相当于第一次快照,当那个拍照的地方发生改变,我们还根据相片来辩认着拍照的地方。

下面就是相关的源码。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;此程序应该命名为22222222.exe
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc

includelib kernel32.lib
includelib user32.lib
DLG_MAIN equ 1

.data
szFileName db 111111111.exe,0 ;定义要守护的进程名

.data?
Pid dd ?
hSnapShot dd ?
stProcess PROCESSENTRY32 <?>
stStartUp STARTUPINFO <?>
stProcInfo PROCESS_INFORMATION <?>
hInstance dd ?
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;获取快照
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Snapshot proc
@@:
invoke RtlZeroMemory,addr stProcess,sizeof stProcess;有必要清空,不然进程会重复
mov stProcess.dwSize,sizeof stProcess
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,addr stProcess;开始获取快照
mov hSnapShot,eax ;保存到句柄
invoke Process32First,hSnapShot,addr stProcess;列举进程
.while eax
invoke lstrcmp,addr szFileName,addr stProcess.szExeFile;对比是否有111111111.exe
.if eax == NULL ;有则返回
ret
.endif
invoke Process32Next,hSnapShot,addr stProcess ;继续列举
.endw
call _Process ;如果没发现111111111.exe进程,就执行程序创建
loop @B
ret
_Snapshot endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Process proc
invoke GetStartupInfo,addr stStartUp
invoke CreateProcess,addr szFileName,NULL,NULL,NULL,NULL,
NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo
ret
_Process endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam

mov eax,wMsg
.if eax == WM_CLOSE ;关闭窗口的消息列队
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG ;初始化各个消息
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
call _Snapshot
.elseif eax == WM_COMMAND
mov eax,wParam
.else
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,NULL
loop @B
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start

[Copy to clipboard]

 

CODE:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;此程序应该命名为111111111.exe
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc

includelib kernel32.lib
includelib user32.lib
DLG_MAIN equ 1

.data
szFileName db 22222222.exe,0

.data?
Pid dd ?
hSnapShot dd ?
stProcess PROCESSENTRY32 <?>
stStartUp STARTUPINFO <?>
stProcInfo PROCESS_INFORMATION <?>
hInstance dd ?
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Snapshot proc
@@:
invoke RtlZeroMemory,addr stProcess,sizeof stProcess
mov stProcess.dwSize,sizeof stProcess
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,addr stProcess
mov hSnapShot,eax
invoke Process32First,hSnapShot,addr stProcess
.while eax
invoke lstrcmp,addr szFileName,addr stProcess.szExeFile;对比是否有22222222.exe
.if eax == NULL ;有则返回
ret
.endif
invoke Process32Next,hSnapShot,addr stProcess
.endw
call _Process ;如果没有,就执行程序创建
loop @B
ret
_Snapshot endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Process proc
invoke GetStartupInfo,addr stStartUp
invoke CreateProcess,addr szFileName,NULL,NULL,NULL,NULL,
NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo
ret
_Process endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam

mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
call _Snapshot
.elseif eax == WM_COMMAND
mov eax,wParam
.else
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,NULL
ret
loop @B
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start

补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,