安全探讨之用Win32汇编写双进程守护(获取进程快照 枚举进程)

 

安全探讨之用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值