双进程守护技术第二版
文章作者:Asm
信息来源:邪恶八进制信息安全团队(http://www.eviloctal.com/)
进程守护技术?很简单,就是为了防止进程被结束掉,采用一些编程手段将进程保护起来,例如灰鸽子,它hook了api,或者注入其他的进程空间例如一般都喜欢注入explorer.exe(关于注入explorer.exe,我在邪恶八进制发表过一篇文章,就是注入explorer.exe)隐藏进程,达到隐蔽的目.就灰鸽子,使用了rootkit,但是我等菜鸟还不是很了解,更别谈利用编程手段来实现了 :)
如上的可以称做是“单进程”,很明显,双进程守护技术,就是两个拥有同样功能的代码程序,不段地检测是否对方已经被别人结束,如果发现对方已经被结束了,那么又开始创建对方。这样又能够让对方执行。有了原理,我们还需要解决一些问题,例如,彼此在不断检测对方的时候,消耗的CPU是致命的,不到几秒钟就让人家死机了,谁都会怀疑的。同时也是不可避免的,因为循环执行命令,需要消耗服务器资源..那么怎么解决?我们可以这样设想:比如进程甲,进程乙两个,甲首先历遍快照,如果发现乙存在,那么就继续刷新,重新历遍快照;如果没发现乙,则开始创建乙,然后甲要退出。当甲退出的时候,乙又开始重复着甲的动作。这个一退一执行,实际上是发生在瞬间,也就等于是在执行一个进程,这个时候,任务管理器显示的CPU使用率是100%,实际上,在甲退后,CPU就恢复了原来的状态2%,但是,同时乙又开始执行,CPU又到了100%,接着乙有创建甲,退出,CPU又恢复到%2,如此循环下去,就等于CPU都没占用.举个形象一点的例子,我吃饱了又马上饿了,马上饿了的时候又马上吃饱了,肚子得到了缓冲,不饿也不饱 :)
可能我的文学水平不足,解释得不够清楚,下面大家看代码(我只对其中一段代码进行注释):
:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;这个是代码一,测试过程中,你们可以一直看着任务管理器进程,两个进程会循环交换
;CPU虽然是100%,但是速度没有改变
;就会更加明白我对双进程守护技术的解释
;代码编写 By Asm
;如果转载,请保持文章的完整性,
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
.data
szFileName db '22222222.exe',0
.data?
hSnapShot dd ?
stProcess PROCESSENTRY32 <?>
stStartUp STARTUPINFO <?>
stProcInfo PROCESS_INFORMATION <?>
hInstance dd ?
hWinList dd ?
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Snapshot proc
invoke RtlZeroMemory,addr stProcess,sizeof stProcess ;清空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 ;如果发现了,就调用_Snapshot1刷新快照
call _Snapshot1
.endif
invoke Process32Next,hSnapShot,addr stProcess
.endw
call _Process ;如果没发现,就执行22222222.exe
invoke ExitProcess,NULL ;一定要退出,不然会大量消耗CPU导致死机
_Snapshot endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Snapshot1 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 ;如果发现
call _Snapshot ;重新刷新快照重复
.endif
invoke Process32Next,hSnapShot,addr stProcess
.endw
call _Process ;如果没发现,就执行它,执行完毕,退出
invoke ExitProcess,NULL
_Snapshot1 endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;开始调用CreateProcess创建22222222.exe
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_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
start:
call _Snapshot ;程序一开始运行就要马上历遍快照
end start
;************************************************************************
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;这个是代码二,测试过程中,你们可以一直看着任务管理器进程,两个进程会循环交换
;CPU虽然是100%,但是速度没有改变
;就会更加明白我对双进程守护技术的解释
;代码编写 By Asm
;如果转载,请保持文章的完整性,
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
.data
szFileName db '111111111.exe',0
.data?
Pid dd ?
hSnapShot dd ?
stProcess PROCESSENTRY32 <?>
stStartUp STARTUPINFO <?>
stProcInfo PROCESS_INFORMATION <?>
hInstance dd ?
hWinList 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
.if eax == NULL
call _Snapshot1
.endif
invoke Process32Next,hSnapShot,addr stProcess
.endw
call _Process
invoke ExitProcess,NULL
_Snapshot endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Snapshot1 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
.if eax == NULL
call _Snapshot
.endif
invoke Process32Next,hSnapShot,addr stProcess
.endw
call _Process
invoke ExitProcess,NULL
_Snapshot1 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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _Snapshot
end start
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>