标题: 怎样让批处理进程用普通方法杀不掉? [打印本页]
作者: flyinspace 时间: 2008-8-21 19:29 标题: 怎样让批处理进程用普通方法杀不掉?
不管你采用什么方法,
条件:
1,(cmd命令,vbs)不得使用第三方工具。。
2, 可以产生临时文件,但程序按正常结束时需要能把产生的临时文件清理干净)
目的:
当其他的程序关闭你的批处理的时候。你的批处理能知道这种情况的发生(并处理下列情况之一)
1,并完成批处理被关闭后的操作(现在要求,在批处理的上级目录写入:[关闭的日期][关闭的时间])
2,重新运行被关闭的批处理。(批处理文件是 [echo 哈哈,我又运行了&pause>nul],被关闭前是显示 echo 嗯,现在是批处理测试ing,pause>nul )
3, 使用命令行操作 kill cmd.exe 的时候,能不被干掉。(并显示 "哈哈,我又复活了" 的消息)
4,若上面的做可以做到,那么就要完成这一项,给出一个退出码。在输入退出码后可以正常的退出(不再出现上面的消息)
--------------------------------
我是新人,没有什么积分奖励给大家。
但我相信,高手们都是勇于挑战自我的,不是么?(也请斑竹们帮帮忙,帮完成了挑战的人++分吧)
斑竹们已经放了话了(满分哦~!荣誉的象征呢)
[ 本帖最后由 flyinspace 于 2008-8-21 19:56 编辑 ]
作者: pusofalse 时间: 2008-8-21 19:41
这绝对是一个挑战。只要处理一个情况就可以了吗?
兄有解了吗?
[ 本帖最后由 pusofalse 于 2008-8-21 19:44 编辑 ]
作者: flyinspace 时间: 2008-8-21 19:44
已经成功的完成了挑战啊??
为什么不换个思维呢?
想一下:流氓软件是怎么做出来的,我们要的是方法,嘿嘿
作者: flyinspace 时间: 2008-8-21 19:46
对了。斑竹,你觉得完成了挑战的人应该+多少分呢 ?
而且,说实话,当代码放出来的时候。你会惊讶原来可以如此简单。
作者: pusofalse 时间: 2008-8-21 19:46
貌似这个要用到多进程了,记录下“主军”的pid,用“友军”来监控进程。
作者: pusofalse 时间: 2008-8-21 19:47 标题: 回复 4楼 的帖子
我当然会加满分。^_^
作者: flyinspace 时间: 2008-8-21 19:47
嗯。。斑竹就是厉害,一下就想到了。
那么想看看斑竹的方案哟。
要记得哦。。别杀错了pid哟。
作者: pusofalse 时间: 2008-8-21 19:49
思路是有,但感觉总会有点绕。
“主军”的PID。。。万一运行时开着另外一个CMD.EXE,那要如何区分呢。
这个问题得好好想想。
作者: flyinspace 时间: 2008-8-21 19:49
原帖由 pusofalse 于 2008-8-21 19:41 发表
这绝对是一个挑战。只要处理一个情况就可以了吗?
兄有解了吗?
根据自己的情况呀。如果能同时处理3种情况自然最好。。
但若不行,根据自己的实力,只处理一种情况也行啊。
作者: pusofalse 时间: 2008-8-21 19:51
对了,能产生临时文件吗?
作者: flyinspace 时间: 2008-8-21 19:51
原帖由 pusofalse 于 2008-8-21 19:49 发表
思路是有,但感觉总会有点绕。
“主军”的PID。。。万一运行时开着另外一个CMD.EXE,那要如何区分呢。
这个问题得好好想想。
不饶点,怎么行呢,那里能简简单单的获取分数。你说是吧。
作者: flyinspace 时间: 2008-8-21 19:52
原帖由 pusofalse 于 2008-8-21 19:51 发表
对了,能产生临时文件吗?
当然可以产生临时文件,不过临时文件在正常退出批处理的时候,要能被清除
作者: pusofalse 时间: 2008-8-21 19:54 标题: 回复 12楼 的帖子
了解。。。^_^
作者: pusofalse 时间: 2008-8-21 20:23
对了。。兄所说的“当其他的程序关闭你的批处理的时候。。。”
这里是结束PID,还是直接点那个关闭按钮?
作者: flyinspace 时间: 2008-8-21 21:27
都可以。你可以用任务管理器关闭,也可以点关闭来模拟这种情况的出现。
作者: start 时间: 2008-8-21 21:52
当其他的程序关闭你的批处理的时候。你的批处理能知道这种情况的发生
有能达到这样的效果的命令吗!!!期待中..........
[ 本帖最后由 start 于 2008-8-21 22:03 编辑 ]
作者: 523066680 时间: 2008-8-21 22:04
大哥大 一来就发这种题目……直教人吐血。批处理史上最顽强的病毒版,即将问世,
我能做的就是看着问世。o my god!
作者: pusofalse 时间: 2008-8-21 22:20
- @echo off&setlocal enabledelayedexpansion&title Test
- for %%a in ("%cd%.tmp") do set dir=%%~dpa
- for /f "tokens=2" %%a in ('tasklist /fi "imagename eq cmd.exe" /nh') do set pid=%%a&goto next
- :next
- echo @echo off>%temp%\youjun.bat
- echo :loop>>%temp%\youjun.bat
- echo set zhujunpid=>>%temp%\youjun.bat
- echo for /f "tokens=2" %%%%a in ^('tasklist /fi "pid eq %pid%" /nh') do set "zhujunpid=%%%%a">>%temp%\youjun.bat
- echo if not defined zhujunpid ^(>>%temp%\youjun.bat
- echo echo 被关闭时间是在 [%%date%%] [%%time%%]^>"%dir%关闭时间.txt">>%temp%\youjun.bat
- echo start "" "%dir%关闭时间.txt">>%temp%\youjun.bat
- echo>>%temp%\youjun.bat start %~fs0
- echo echo had^>%temp%\had.tmp>>%temp%\youjun.bat
- echo exit>>%temp%\youjun.bat
- echo ^)>>%temp%\youjun.bat
- echo goto loop>>%temp%\youjun.bat
- :lp
- start /min %temp%\youjun.bat
- :loop
- set n=0
- for /f %%a in ('tasklist /fi "imagename eq cmd.exe" /nh') do cls&set/a n+=1
- if %n% leq 2 goto lp
- if not exist %temp%\had.tmp (
- title 这只是测试ing。。。o^(∩_∩^)o。。。
- ) else (
- title 我又复活了。。。o^(∩_∩^)o。。。
- if %n% gtr 4 (
- del %dir%关闭时间.txt;%temp%\had.tmp;%temp%\youjun.bat
- pause>nul
- )
- )
- for /l %%a in (1 1 400) do cls>nul
- goto loop
复制代码
现在的代码只能完成前面两种情况。在kill cmd.exe之后仍能复活,恐怕BAT的确做不到了。
起初的代码在结束“友军”之后就全部OVER了,现在结束“友军”之后“主军”仍能复活,除非全部kill。
[ 本帖最后由 pusofalse 于 2008-8-22 01:07 编辑 ]
作者: dishuo 时间: 2008-8-21 23:31
努力思考中....
非常期待楼主的"如此简单"的解.
作者: SmallK 时间: 2008-8-22 00:34
鸭子就是鸭子,永远也变不成天鹅!批处理到底就是批处理啊……希望我们的技术精英们能让批处理来个脱胎换骨!呵呵……
[ 本帖最后由 SmallK 于 2008-10-10 00:49 编辑 ]
作者: SmallK 时间: 2008-8-22 00:57
真心地祝你成功!希望我的方法能帮上你~~
作者: pusofalse 时间: 2008-8-22 01:28 标题: 回复 21楼 的帖子
试过了,同样是显示cmd.exe
作者: SmallK 时间: 2008-8-22 02:55
哎……看来现实总是太残忍!………………
[ 本帖最后由 SmallK 于 2008-10-10 00:50 编辑 ]
作者: flyinspace 时间: 2008-8-22 04:03
- @echo off & SetLocal EnableDelayedExpansion
-
- set "self=%~0"
- if /i "%~1"=="ExitCode" goto :EXIT
- if /i "%~1"=="" echo 现在是测试运行
- if /i "%~1"=="WIN_Exit" echo 貌似我又复活了
- echo start "" "%~0" WIN_Exit>ErrExit.cmd
- call :查找进程
-
- call :FINDEXISTPID
-
- call :守护进程
-
- start Check.vbs
- :REINPUT
- echo -----------------------------------------
- echo 输入:ExitCode 完全退出程序
- echo -----------------------------------------
- set /p "Input=请输入入口代码:"
- if /i "%Input%"=="ExitCode" goto :EXITPROCESS_OK
- goto :REINPUT
-
- :查找进程
- echo for each ps in getobject _>ps.vbs
- echo ^("winmgmts:\\.\root\cimv2:win32_process"^).instances_ >>ps.vbs
- echo if ps.name ="cmd.exe" Then wscript.echo ps.handle^&vbtab^&ps.name>>ps.vbs
- echo next>>ps.vbs
- goto :EOF
-
- :FINDEXISTPID
- if exist ExistPid.txt del ExistPid.txt
- for /f "tokens=1,* " %%m in ('cscript //nologo ps.vbs') do echo %%m>>ExistPid.txt
- for /f "tokens=1,* " %%m in ('cscript //nologo ps.vbs') do (
- type ExistPid.txt | find /i "%%m">nul && set "Pid=%%m"
- )
- goto :EOF
-
- :守护进程
- echo set Cleaner=createobject^("wscript.shell"^)>Check.vbs
- echo do>>Check.vbs
- echo WScript.Sleep 100>>Check.vbs
- echo if not isProcessExists^("%Pid%"^) then>>Check.vbs
- echo Cleaner.run "ErrExit.cmd">>Check.vbs
- echo Exit do>>Check.vbs
- echo End if>>Check.vbs
- echo loop>>Check.vbs
- echo Function isProcessExists^(proName^)>>Check.vbs
- echo Set objWMIService = GetObject^("winmgmts:" ^& "{impersonationlevel=impersonate}^!\\.\root\cimv2"^)>>Check.vbs
- echo Set colProcessList = objWMIService.ExecQuery^("Select * from Win32_Process Where Handle='" ^& proName ^& "'"^)>>Check.vbs
- echo isProcessExists = ^(colProcessList.Count ^<^> 0^)>>Check.vbs
- echo End Function>>Check.vbs
- goto :EOF
- :EXITPROCESS_OK
- echo for each ps in getobject _>ps.vbs
- echo ^("winmgmts:\\.\root\cimv2:win32_process"^).instances_ >>ps.vbs
- echo if ps.name ="WScript.exe" Then wscript.echo ps.handle^&vbtab^&ps.name>>ps.vbs
- echo next>>ps.vbs
-
- for /f "tokens=1,* " %%i in ('cscript //nologo ps.vbs') do ntsd -c q -p %%i
- echo del ps.vbs>>deltemp.cmd
- echo del check.vbs>>deltemp.cmd
- echo del ErrExit.cmd>>deltemp.cmd
- echo del ExistPid.txt>>deltemp.cmd
- echo del run.vbs>>deltemp.cmd
- echo del deltemp.cmd>>deltemp.cmd
- echo set Cleaner=createobject^("wscript.shell"^)>>run.vbs
- echo Cleaner.run "cmd /c deltemp.cmd",^0>>run.vbs
- start run.vbs
-
- :EXIT
- exit
复制代码
麻烦大家测试一下..
作者: pusofalse 时间: 2008-8-22 05:12
精彩!
测试果真关不了。最后我先结束Wscript.exe,然后kill cmd.exe,完了,临时文件没删除。
要是这么搞病毒,看来得实时查杀任务管理器。
作者: flyinspace 时间: 2008-8-22 08:21
原帖由 pusofalse 于 2008-8-22 05:12 发表
精彩!
测试果真关不了。最后我先结束Wscript.exe,然后kill cmd.exe,完了,临时文件没删除。
要是这么搞病毒,看来得实时查杀任务管理器。
没有,上面的代码只是演示而已,要不然,得用批处理脚本才能中断了....
最初的代码因为做得比较变态,只能exitcode代码的方式退出来,或者采用中断进程树的形式解决问题.
那个时候就不是简单的用任务管理器可以解决的。
但我还是担心有bug,于是就把那个简化了一下,做成了上面的代码.
作者: 基拉freedom 时间: 2008-8-22 10:55
利用病毒原理 搞进程守护就可以完成 不过效率过低 利用资源过大了
作者: 基拉freedom 时间: 2008-8-22 12:30
看来光用bat是不太可能的
作者: hisplay 时间: 2008-8-23 15:02
很好。。。能解释一下吗?
作者: 千浪 时间: 2008-8-23 17:05
能不能这样.先把CMD.EXE复制为其他AMD.EXE,然后用注册表设置BAT用AMD.EXE来运行.
作者: flyinspace 时间: 2008-8-26 13:19
原帖由 千浪 于 2008-8-23 17:05 发表
能不能这样.先把CMD.EXE复制为其他AMD.EXE,然后用注册表设置BAT用AMD.EXE来运行.
你可以设置一下实验咯。
直接点关闭按钮关闭Amd.exe试下就知道了。
其实与这个无关。
作者: flyinspace 时间: 2008-8-28 18:41
- @echo off & SetLocal EnableDelayedExpansion
-
- set "self=%~0"
- if /i "%~1"=="ExitCode" goto :EXIT
- if /i "%~1"=="" echo 现在是测试运行
- if /i "%~1"=="WIN_Exit" echo 貌似我又复活了
- echo start "" "%~0" WIN_Exit>ErrExit.cmd
-
- ::下面的功能是一次调用。
-
- call :查找进程
-
- call :FINDEXISTPID
-
- call :守护进程
-
- start Check.vbs
- :REINPUT
- echo -----------------------------------------
- echo 输入:ExitCode 完全退出程序
- echo -----------------------------------------
- set /p "Input=请输入入口代码:"
- if /i "%Input%"=="ExitCode" goto :EXITPROCESS_OK
- goto :REINPUT
-
- :查找进程
- :: 创建 vbs脚本,用于检测系统中运行的进程和改进程的pid。
- echo for each ps in getobject _>ps.vbs
- echo ^("winmgmts:\\.\root\cimv2:win32_process"^).instances_ >>ps.vbs
- echo if ps.name ="cmd.exe" Then wscript.echo ps.handle^&vbtab^&ps.name>>ps.vbs
- echo next>>ps.vbs
- goto :EOF
-
- :FINDEXISTPID
- :: 这里是获取进程的 进程的pid。 以便于以后使用。
- if exist ExistPid.txt del ExistPid.txt
- for /f "tokens=1,* " %%m in ('cscript //nologo ps.vbs') do echo %%m>>ExistPid.txt
- for /f "tokens=1,* " %%m in ('cscript //nologo ps.vbs') do (
- type ExistPid.txt | find /i "%%m">nul && set "Pid=%%m"
- )
- goto :EOF
-
- :守护进程
- :: 写入一个vbs脚本,检测守护的cmd进程是否关闭,如果关闭则重新打开这个cmd脚本。
- :: 检测cmd进程是通过 进程的pid 功能完成的。
- echo set Cleaner=createobject^("wscript.shell"^)>Check.vbs
- echo do>>Check.vbs
- echo WScript.Sleep 100>>Check.vbs
- echo if not isProcessExists^("%Pid%"^) then>>Check.vbs
- echo Cleaner.run "ErrExit.cmd">>Check.vbs
- echo Exit do>>Check.vbs
- echo End if>>Check.vbs
- echo loop>>Check.vbs
- echo Function isProcessExists^(proName^)>>Check.vbs
- echo Set objWMIService = GetObject^("winmgmts:" ^& "{impersonationlevel=impersonate}^!\\.\root\cimv2"^)>>Check.vbs
- echo Set colProcessList = objWMIService.ExecQuery^("Select * from Win32_Process Where Handle='" ^& proName ^& "'"^)>>Check.vbs
- echo isProcessExists = ^(colProcessList.Count ^<^> 0^)>>Check.vbs
- echo End Function>>Check.vbs
- goto :EOF
- :EXITPROCESS_OK
- :: 这里是退出程序,也就是exit-code的入口点。。
- echo for each ps in getobject _>ps.vbs
- echo ^("winmgmts:\\.\root\cimv2:win32_process"^).instances_ >>ps.vbs
- echo if ps.name ="WScript.exe" Then wscript.echo ps.handle^&vbtab^&ps.name>>ps.vbs
- echo next>>ps.vbs
-
- for /f "tokens=1,* " %%i in ('cscript //nologo ps.vbs') do ntsd -c q -p %%i
- echo del ps.vbs>>deltemp.cmd
- echo del check.vbs>>deltemp.cmd
- echo del ErrExit.cmd>>deltemp.cmd
- echo del ExistPid.txt>>deltemp.cmd
- echo del run.vbs>>deltemp.cmd
- echo del deltemp.cmd>>deltemp.cmd
- echo set Cleaner=createobject^("wscript.shell"^)>>run.vbs
- echo Cleaner.run "cmd /c deltemp.cmd",^0>>run.vbs
- start run.vbs
-
- :EXIT
- exit
复制代码
对我写的部分代码的解析。。
只解释段代码。。批处理基础过关的人应该都可以看明白了。
作者: jellyhk 时间: 2008-9-1 13:22
顶起哦!!!
期待!
作者: plt 时间: 2008-9-14 21:10 标题: 回复 32楼 的帖子
这批处理好牛,要是能用来控制其他程序不被杀就好了
作者: everest79 时间: 2008-9-15 17:57
按服务来加载,利用系统日志,然后以高特权账户登录,这样超级管理员是无法终止的
作者: flyinspace 时间: 2008-10-5 02:08
原帖由 everest79 于 2008-9-15 17:57 发表
按服务来加载,利用系统日志,然后以高特权账户登录,这样超级管理员是无法终止的
光说没用,写出来。。。。
呵呵
作者: everest79 时间: 2008-10-9 08:16
你自已太懒了,嘿嘿!
作者: flyinspace 时间: 2008-10-17 19:26
原帖由 everest79 于 2008-10-9 08:16 发表
你自已太懒了,嘿嘿!
怎么这么说我呢。。。。我至少还写了代码呀。
拜托,吧你的结论写出来吧。。。
我想批处理室的好多人都在拭目以待呢 。
作者: rat 时间: 2008-10-18 22:21
LZ的代码中vbs的查找进程并不一定能准确的找到运行的批处理的pid,因为实际上找的是cmd.exe的。
作者: flyinspace 时间: 2008-10-19 12:07
原帖由 rat 于 2008-10-18 22:21 发表
LZ的代码中vbs的查找进程并不一定能准确的找到运行的批处理的pid,因为实际上找的是cmd.exe的。
刚才太冲了点。具体你研究吧。。
或者拿出更好的方案出来。。
[ 本帖最后由 flyinspace 于 2008-10-19 12:24 编辑 ]
作者: 523066680 时间: 2008-11-23 09:13
set a=createobject("wscript.shell")
a.run "cmd /c @echo Can you close me? &pause>nul &exit",,true
a.run "cmd /c @echo 这是第二次 &pause>nul &exit",,true
wscript.quit
作者: 523066680 时间: 2008-11-23 09:19 标题: 回复 40楼 的帖子
流氓一下……
set a=createobject("wscript.shell")
for i = 1 to 2 step 0
a.run "cmd /k @echo Can you close me? &pause>nul &exit",,true
next
作者: leaparde 时间: 2008-11-28 19:24
这年头,人怎么这么强大的呢
批处理都能开发病毒了
作者: qlcom 时间: 2008-12-18 21:15
老大,我把你这个p文件直接按键"shift+delete",再点关闭就死翘翘了,呵呵
老大继续完善程序,屏蔽这个bug.期待ing
[ 本帖最后由 qlcom 于 2008-12-18 21:18 编辑 ]
作者: mmfy 时间: 2009-1-15 12:27
如果可以像Worm.Win32.AutoRun.enw的asue.exe和acer.exe进程互锁就可以了。
作者: kurt101 时间: 2009-2-16 22:22
用BAT。。太难了
先把WSCRIPT.EXE干掉,再干掉CMD 就没有东西复活了
作者: luo0527 时间: 2009-3-11 22:19
这里都神人。。。。我站边上看看就成。
作者: qq362220083 时间: 2009-3-18 01:09
俺刚来,在找个资料的时候,偶然发现了这个感兴趣的话题,看来今晚上睡不着觉了。明天还要约会呢,5555555
看我今晚上能不能搞掉这个挑战
作者: qq362220083 时间: 2009-3-18 05:35
- @echo off
-
- if "%~1"=="0" (goto :App0)
- if "%~1"=="1" (goto :App1)
- if "%~1"=="C" (goto :App2)
- if "%~1"=="R" (goto :App3)
-
- start "" %~nx0 0
-
- exit
-
- :App0
- start "" %~nx0 1
- start "" %~nx0 C
- exit
-
- :App1
- title 主
- echo.
- echo.
- echo 嗯,现在是批处理测试ing...
- echo.
- set /p keycode=
- if "%keycode%"=="q" (goto :App4)
- goto :App1
-
- :App2
- title 创建守护VBS...
- ::::::::::::::::::::::::::::::::::::::::::::::::::::
- echo.if Wscript.Arguments.count ^< 1 then >noshut1.vbs
- echo. wscript.quit >>noshut1.vbs
- echo.end if >>noshut1.vbs
- echo.select case ucase(Wscript.Arguments(0)) >>noshut1.vbs
- echo. case "Q" >>noshut1.vbs
- echo. wscript.quit >>noshut1.vbs
- echo. case "R" >>noshut1.vbs
- echo. >>noshut1.vbs
- echo. >>noshut1.vbs
- echo.Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") >>noshut1.vbs
- echo.Set colMonitoredProcesses = objWMIService.ExecNotificationQuery("select * from __instancedeletionevent within 1 where TargetInstance isa 'Win32_Process'") >>noshut1.vbs
- echo.Do While i ^<^> -1 >>noshut1.vbs
- echo.Set objLatestProcess = colMonitoredProcesses.NextEvent >>noshut1.vbs
- echo.if instr(objLatestProcess.TargetInstance.CommandLine,WScript.ScriptName ^& " Q") > 0 then >>noshut1.vbs
- echo. exit do >>noshut1.vbs
- echo.end if >>noshut1.vbs
- echo.for i=1 to Wscript.Arguments.count-1 >>noshut1.vbs
- echo. if instr(objLatestProcess.TargetInstance.CommandLine,Wscript.Arguments(i)) > 0 then >>noshut1.vbs
- echo. '结束的进程是被守护进程i,则启动 >>noshut1.vbs
- echo. if instr(wscript.arguments(i)," 1") > 0 then >>noshut1.vbs
- echo. Wscript.createobject("wscript.shell").run replace(objLatestProcess.TargetInstance.CommandLine," 1"," R"),1 >>noshut1.vbs
- echo. else >>noshut1.vbs
- echo. Wscript.createobject("wscript.shell").run objLatestProcess.TargetInstance.CommandLine,1 >>noshut1.vbs
- echo. end if >>noshut1.vbs
- echo. end if >>noshut1.vbs
- echo.next >>noshut1.vbs
- echo.Loop >>noshut1.vbs
- echo.wscript.sleep 3000 >>noshut1.vbs
- echo.wscript.quit >>noshut1.vbs
- echo.end select >>noshut1.vbs
- ::::::::::::::::::::::::::::::::::::::::::::::::::::
- copy noshut1.vbs noshut2.vbs
- start wscript.exe //nologo noshut1.vbs R "%~nx0 1" "%~nx0 R" "noshut2.vbs R"
- start wscript.exe //nologo noshut2.vbs R "noshut1.vbs R"
- exit
-
- :App3
- title 被关闭后,重新运行
- echo 哈哈,我又运行了!
- pause>nul
- goto :App1
-
- :App4
- title 带参数启动守护VBS,使其结束自身
- start wscript.exe //nologo noshut1.vbs Q
- start wscript.exe //nologo noshut2.vbs Q
- ping.exe 127.1 -n 15 >nul 2>nul
- del noshut1.vbs /f /q /a >nul 2>nul
- del noshut2.vbs /f /q /a >nul 2>nul
- exit
复制代码
似乎第三条,被Kill后不同的提示,这个没法做,只能和被结束一起处理
嘿嘿,2个VBS互相守护
一个看着 bat 和另一个 vbs
另一个只管 第一个vbs
作者: qq362220083 时间: 2009-3-18 05:42
测试的时候发现个问题,系统的bat关联传参数的时候,第一个参数前面有2个空格,所以在启动守护进程的时候,对于bat参数,我多加了个空格。
若有时无法检测bat时,可以去掉看看。反正我的系统是2个空格。。。
作者: qq362220083 时间: 2009-3-18 06:27
又仔细看了下题目,发现我似乎没做第一个。另外参考了前面几位朋友的代码,第三个其实也不麻烦啊。
说下思路吧:
第一个可以修改vbs,检查bat被结束后,则创建以当前日期时间命名的文件或写入某个文件
第三个可以在P启动后创建临时文件,正常关闭时删除临时文件。下次启动时,先检查那个文件,若存在,则删除它,并提示复活。否则继续重复
P处理高级功能有限,尤其对于进程和系统其他高级操作,所以只好借助VBS实现双进程守护。不知能不能实现文件锁定呢,这样删除P就无效了,哈哈
作者: flyinspace 时间: 2009-3-22 01:59
原帖由 qq362220083 于 2009-3-18 06:27 发表
又仔细看了下题目,发现我似乎没做第一个。另外参考了前面几位朋友的代码,第三个其实也不麻烦啊。
说下思路吧:
第一个可以修改vbs,检查bat被结束后,则创建以当前日期时间命名的文件或写入某个文件
第三个 ...
嗯,使用批处理与vbs的结合是可以实现bat被删除时提示"文件正在使用"的..
嗯,就我不玩批处理时的研究,可以实现防修改防删除的目的..
不过方法有点恶心.呵,还可以杀冰刃哟
只提示,可以实现哟:
[ 本帖最后由 flyinspace 于 2009-3-22 02:02 编辑 ]
作者: qq362220083 时间: 2009-3-22 02:20
还是只写思路吧,实在没时间弄代码了,最近调试软件调的我一看代码就头晕。
批处理启动时复制一个自己的副本到临时文件夹
守护VBS使用WMI,检测系统删除文件消息,若是两个批处理的任意一个,则复制对方至被删除的地方。若是主批被删除,复制还原后还需要重新执行主批。
作者: Batcher 时间: 2009-3-22 12:07 标题: 回复 53楼 的帖子
刚学批处理的时候,试着写所谓的批处理病毒,用的就是这个方法,呵呵。
作者: defanive 时间: 2009-3-22 12:12
有wmic的话多简单,直接创建进程就好了,自动返回PID的。。。
作者: youxi01 时间: 2009-3-24 18:41
个人认为,通过此种方式 来实现的话,太容易让人发现了,没太大的应用价值
有个问题不懂:为什么要让一个批处理不停的运行呢?
如果真要这样,把所要的批处理注册为系统服务是不是更简洁明了?
作者: flyinspace 时间: 2009-3-24 21:14
原帖由 youxi01 于 2009-3-24 18:41 发表
个人认为,通过此种方式 来实现的话,太容易让人发现了,没太大的应用价值
有个问题不懂:为什么要让一个批处理不停的运行呢?
如果真要这样,把所要的批处理注册为系统服务是不是更简洁明了?
如果需要有价值的话,就不是讨论这个了.
这个题目只是为了开阔批处理的使用方式而已..
另:思路大家都会想,但实现才是最重要的..
就好象说想飞到天上去:甚至有很多现成的思路可以帮你完成,但若你自己要飞上去,还是有好多细节要完成的.
而细节决定成败.
作者: qq381234916 时间: 2009-3-25 13:41 标题: 大家看看这个代码应该能行~~不是本人原创!!
@echo off & SetLocal EnableDelayedExpansion
set "self=%~0"
if /i "%~1"=="ExitCode" goto :EXIT
if /i "%~1"=="" echo 现在是测试运行
if /i "%~1"=="WIN_Exit" echo 貌似我又复活了
echo start "" "%~0" WIN_Exit>ErrExit.cmd
call :查找进程
call :FINDEXISTPID
call :守护进程
start Check.vbs
:REINPUT
echo -----------------------------------------
echo 输入:ExitCode 完全退出程序
echo -----------------------------------------
set /p "Input=请输入入口代码:"
if /i "%Input%"=="ExitCode" goto :EXITPROCESS_OK
goto :REINPUT
:查找进程
echo for each ps in getobject _>ps.vbs
echo ^("winmgmts:\\.\root\cimv2:win32_process"^).instances_ >>ps.vbs
echo if ps.name ="cmd.exe" Then wscript.echo ps.handle^&vbtab^&ps.name>>ps.vbs
echo next>>ps.vbs
goto :EOF
:FINDEXISTPID
if exist ExistPid.txt del ExistPid.txt
for /f "tokens=1,* " %%m in ('cscript //nologo ps.vbs') do echo %%m>>ExistPid.txt
for /f "tokens=1,* " %%m in ('cscript //nologo ps.vbs') do (
type ExistPid.txt | find /i "%%m">nul && set "Pid=%%m"
)
goto :EOF
:守护进程
echo set Cleaner=createobject^("wscript.shell"^)>Check.vbs
echo do>>Check.vbs
echo WScript.Sleep 100>>Check.vbs
echo if not isProcessExists^("%Pid%"^) then>>Check.vbs
echo Cleaner.run "ErrExit.cmd">>Check.vbs
echo Exit do>>Check.vbs
echo End if>>Check.vbs
echo loop>>Check.vbs
echo Function isProcessExists^(proName^)>>Check.vbs
echo Set objWMIService = GetObject^("winmgmts:" ^& "{impersonationlevel=impersonate}^!\\.\root\cimv2"^)>>Check.vbs
echo Set colProcessList = objWMIService.ExecQuery^("Select * from Win32_Process Where Handle='" ^& proName ^& "'"^)>>Check.vbs
echo isProcessExists = ^(colProcessList.Count ^<^> 0^)>>Check.vbs
echo End Function>>Check.vbs
goto :EOF
:EXITPROCESS_OK
echo for each ps in getobject _>ps.vbs
echo ^("winmgmts:\\.\root\cimv2:win32_process"^).instances_ >>ps.vbs
echo if ps.name ="WScript.exe" Then wscript.echo ps.handle^&vbtab^&ps.name>>ps.vbs
echo next>>ps.vbs
for /f "tokens=1,* " %%i in ('cscript //nologo ps.vbs') do ntsd -c q -p %%i
echo del ps.vbs>>deltemp.cmd
echo del check.vbs>>deltemp.cmd
echo del ErrExit.cmd>>deltemp.cmd
echo del ExistPid.txt>>deltemp.cmd
echo del run.vbs>>deltemp.cmd
echo del deltemp.cmd>>deltemp.cmd
echo set Cleaner=createobject^("wscript.shell"^)>>run.vbs
echo Cleaner.run "cmd /c deltemp.cmd",^0>>run.vbs
start run.vbs
:EXIT
exit
作者: hkmhd 时间: 2009-3-26 18:30
对我来说是极大的难度,我等着看结果~不过这样有点类似于禁止终结某个进程以及本批处理也防止被终止
作者: a5417871 时间: 2009-3-31 02:40
只有看的份。插不上嘴。呵呵
作者: netbenton 时间: 2009-4-10 22:49
如果再加上个AT ...,三重保险,就更不得了了
作者: jinyaxin 时间: 2009-4-16 23:09
因为还看不懂 所以支持一下
作者: he200377 时间: 2009-4-28 21:12
先不论技术,首先这个题就没有多打意义?批处理的优势在于“源码”完全公开,还搞那么流氓干啥?
作者: namejm 时间: 2009-4-28 23:33
从楼主的描述来看,可能是想做一个批处理版的流氓程序,挑战一下批处理的极限——既然是挑战区,就意味着不一定具有多大的现实的实用性,有可能只是做一些尝试,甚至是近似无聊的尝试,有时候,从这些尝试中会得到意想不到的收获。
作者: flyinspace 时间: 2009-5-16 00:44
原帖由 he200377 于 2009-4-28 21:12 发表
先不论技术,首先这个题就没有多打意义?批处理的优势在于“源码”完全公开,还搞那么流氓干啥?
呵呵,谢谢你的指正..
其实,批处理的优势并不在于源代码的公开,那个叫开源.
批处理的优势在于能处理一些我们很讨厌的重复劳动..仅仅如此而已..
比如,用批处理做四则混合运算?为什么要用批处理呢?只是因为想尝试一下可能性而已..
请问,你有无尝试用批处理做过c语言里的绝大多数题目...
在尝试后。你会发现,当遇到一个新的题目的时候。你会很容易的判断出你想要做的事情,批处理是否可以办得到....
如果你都办到了.那么你的批处理水平就小成了...可是这不够..因为批处理只是辅助工具..
学会了批处理可能会花掉小小工夫..但以后的工作里,会节省好多的功夫..
挑战的意义在于思维的开阔,而不是你说的"流氓软件"
作者: stuqx 时间: 2009-5-25 12:09
原帖由 pusofalse 于 2008-8-21 19:49 发表
思路是有,但感觉总会有点绕。
“主军”的PID。。。万一运行时开着另外一个CMD.EXE,那要如何区分呢。
这个问题得好好想想。
- copy c:\windows\system32\cmd.exe 786236546346556.exe
- start 786236546346556.exe /c d:\my.bat
- exit
复制代码
这样不就行了 找786236546346556.exe这个就可以了
再找个监视进程随时重起程序就可以了 HOHO
最后不用的时候 把生成的这个临时的程序删掉就行了
名字可以随机生成数字
作者: canyuexiaolang 时间: 2009-8-26 08:02
有难度啊,考虑考虑,还是考不出来
但借用临时文件的话,可以监视
重点代码是什么
作者: canyuexiaolang 时间: 2009-8-26 08:04
原帖由 pusofalse 于 2008-8-21 19:49 发表
思路是有,但感觉总会有点绕。
“主军”的PID。。。万一运行时开着另外一个CMD.EXE,那要如何区分呢。
这个问题得好好想想。
那就先把CMD给KILL一下在运行呗
作者: a4188809b 时间: 2009-10-4 18:16
原帖由 qq381234916 于 2009-3-25 13:41 发表
@echo off & SetLocal EnableDelayedExpansion
set "self=%~0"
if /i "%~1"=="ExitCode" goto :EXIT
if /i "%~1"=="" echo 现在是测试运行
if /i "%~1"=="WIN_Exit" echo 貌似我又复活了
echo start "" "%~0" ...
如果快速的连续点结束 就直接结束了!
作者: bluewing009 时间: 2009-11-30 18:08 标题: 扩展思路,请验证。
使用debug 命令 即可生成exe
满足楼主条件 (debug为CMD命令,exe为临时文件)
这样 一些系统函数,API钩子 均有exe做 即可满足楼住条件(exe能做到的多了去了)
挑战完毕。O(∩_∩)O~
作者: caruko 时间: 2009-12-2 15:42
如果不设置一个子程序来监测,可以调用 at 命令来检查自己是不是被关掉..不过,at只能每分钟执行一次...
如果要顽固点,就要写入注册表,比如跟随ie,explorer启动了..
作者: hacker_ 时间: 2009-12-25 22:54
终于找到了,找你找得好苦啊!!!!以前开到过了,也测试过,但是没保存下来1!!!现在终于找到了!!!!!哈哈,收藏了
作者: anoki 时间: 2010-2-9 00:42
牛人的挑战……学习中!
作者: qq506657335 时间: 2010-8-26 14:56
关注ing ,,,,,,,,,,,,,,
作者: hbagxbzyan 时间: 2010-8-27 23:06
假如在执行的话能让这个批处理在使用就好了,要不可以删除。删除后关闭就不能复活了。
我是新手只能关注各位大侠
作者: gfwlxx 时间: 2010-9-19 15:21
用空了写个驱动, 丢出来晒晒
作者: 523066680 时间: 2010-9-19 15:44 标题: 回复 76楼 的帖子
这位比某些忠实用户还要忠实地出现了……
作者: wshydzz 时间: 2010-10-10 15:06
牛人到处有,这里特别多
多看看,学无止境啊
作者: flyingd 时间: 2012-6-27 17:24
简单想了一下思路,本机测试通过,测试前在C盘建一个TEST的目录将script1与script2放入test目录
C_File2过程是用于生成另一个文件的 比如script1.cmd就是用if exist XX和echo XXX>script2.cmd检测script2。 同样的script2.cmd中的C_File2用于检测和生成script1.cmd. 此处节省时间没写。
--------Script 1------
@ECHO OFF
:Main
title Script1
SET S1=1
SET S2=1
:C_File1
If not exist c:\test\wait1.vbs echo WScript.Sleep 100 >c:\test\wait1.vbs
:C_File2
Rem here is use for create SCRIPT2.CMD
:S_LOOP
FOR /F %%i IN ('TASKLIST /v ^|FIND "Script1" /i /c') DO SET S1=%%i
IF /I %S1% GEQ 2 GOTO END
FOR /F %%i IN ('TASKLIST /v ^|FIND "Script2" /i /c') DO SET S2=%%i
IF /I %S2% GEQ 1 (
ECHO Running script 2 is %S2%
) ELSE (
ECHO script 2 is closed, rerun it
Start /min C:\test\script2.cmd
)
START /wait /MIN CSCRIPT.EXE C:\TEMP\Wait1.vbs
GOTO S_LOOP
:END
-----------Script 2------------
@ECHO OFF
:Main
title script2
SET S3=1
SET S4=1
:C_File1
If not exist c:\test\wait1.vbs echo WScript.Sleep 100 >c:\test\wait2.vbs
:C_File2
Rem here is use for create SCRIPT1.CMD
:S_Loop
FOR /F %%i IN ('tasklist /V ^|FIND "script2" /i /c') DO SET S3=%%i
IF /I %S3% GEQ 2 Goto END
ECHO Check MKFIRST is running...
FOR /F %%i IN ('tasklist /V ^|FIND "Script1" /i /c') DO SET S4=%%i
IF /I %S4% GEQ 1 (
ECHO Running script 1 is %S4%
) ELSE (
ECHO script 1 is closed, rerun it
Start /min C:\test\script1.cmd
)
START /wait /MIN CSCRIPT.EXE C:\TEMP\Wait2.vbs
GOTO S_LOOP
:END
作者: 狗屁不通 时间: 2012-8-17 21:09
以SYSTEM权限运行即可
作者: 路过 时间: 2012-10-20 15:51
可以开启两个本身,生成两个临时文件。每个批处理都不停的修改一个文件并检测另一个文件
如果一个文件停止修改则代表一个程序已经运行结束
检测到就重新打开一个
作者: 111 时间: 2013-4-12 20:38
这样就无法关闭了- @echo off
- :loop
- start "" "%0"
- goto loop
复制代码
作者: yixinyichao 时间: 2014-8-2 11:45
目前只能用一種方式處理問題
作者: cmd1152 时间: 2021-8-3 23:41
回复 82# 111
会死机的...
作者: cmd1152 时间: 2021-8-3 23:44
回复 81# 路过
可taskkill是同时结束的呀,就算有0.4秒的延迟也无法保证边写入边读取呀(cpu使用率:100%)!
作者: 看电池 时间: 2021-8-14 18:58
- dim a
- do
- a=inputbox("输入密码","a")
- loop
复制代码
VB代码可以吧,但也放不了结束进程啊
作者: 看电池 时间: 2021-8-14 19:25
- @echo off
- :1
- taskkill /f /t /im cmd.exe||start cmd.exe
- goto 1
复制代码
e,通过不断关闭和打开,使taskkill无能为力,所以他把自己关了
(即使转成exe都不好使)
作者: LJY4.0 时间: 2022-4-26 19:59
回复 3# flyinspace
双线程
作者: LJY4.0 时间: 2022-4-26 20:03
回复 81# 路过
可以写bat,vbs,互相防护
作者: cmd1152 时间: 2022-6-4 19:41
回复 26# flyinspace
结束进程树不行吗? (啊啊啊,怎么又顶到坟贴 )
作者: LJY4.0 时间: 2022-6-5 11:33
回复 32# flyinspace
刚刚我把程序改了一下,改错了,程序过多蓝屏了
作者: czjt1234 时间: 2022-11-15 16:41
回复 80# 狗屁不通
在win7x64里测试下,以system权限运行cmd,用taskkill杀不掉,但是任务管理器可以结束掉
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |