Board logo

标题: 怎样让批处理进程用普通方法杀不掉? [打印本页]

作者: 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

  1. @echo off&setlocal enabledelayedexpansion&title Test
  2. for %%a in ("%cd%.tmp") do set dir=%%~dpa
  3. for /f "tokens=2" %%a in ('tasklist /fi "imagename eq cmd.exe" /nh') do set pid=%%a&goto next
  4. :next
  5. echo @echo off>%temp%\youjun.bat
  6. echo :loop>>%temp%\youjun.bat
  7. echo set zhujunpid=>>%temp%\youjun.bat
  8. echo for /f "tokens=2" %%%%a in ^('tasklist /fi "pid eq %pid%" /nh') do set "zhujunpid=%%%%a">>%temp%\youjun.bat
  9. echo if not defined zhujunpid ^(>>%temp%\youjun.bat
  10. echo         echo 被关闭时间是在 [%%date%%]   [%%time%%]^>"%dir%关闭时间.txt">>%temp%\youjun.bat
  11. echo         start "" "%dir%关闭时间.txt">>%temp%\youjun.bat
  12. echo>>%temp%\youjun.bat         start %~fs0
  13. echo         echo had^>%temp%\had.tmp>>%temp%\youjun.bat
  14. echo         exit>>%temp%\youjun.bat
  15. echo ^)>>%temp%\youjun.bat
  16. echo goto loop>>%temp%\youjun.bat
  17. :lp
  18. start /min %temp%\youjun.bat
  19. :loop
  20. set n=0
  21. for /f %%a in ('tasklist /fi "imagename eq cmd.exe" /nh') do cls&set/a n+=1
  22. if %n% leq 2 goto lp
  23. if not exist %temp%\had.tmp (
  24.         title 这只是测试ing。。。o^(∩_∩^)o。。。
  25.         ) else (
  26.         title 我又复活了。。。o^(∩_∩^)o。。。
  27.         if %n% gtr 4 (
  28. del %dir%关闭时间.txt;%temp%\had.tmp;%temp%\youjun.bat
  29. pause>nul
  30.        )
  31. )
  32. for /l %%a in (1 1 400) do cls>nul
  33. 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

  1. @echo off & SetLocal EnableDelayedExpansion
  2. set "self=%~0"
  3. if /i "%~1"=="ExitCode" goto :EXIT
  4. if /i "%~1"=="" echo 现在是测试运行
  5. if /i "%~1"=="WIN_Exit" echo 貌似我又复活了
  6. echo start "" "%~0" WIN_Exit>ErrExit.cmd
  7. call :查找进程
  8. call :FINDEXISTPID
  9. call :守护进程
  10. start Check.vbs
  11. :REINPUT
  12. echo -----------------------------------------
  13. echo  输入:ExitCode 完全退出程序
  14. echo -----------------------------------------
  15. set /p "Input=请输入入口代码:"
  16. if /i "%Input%"=="ExitCode" goto :EXITPROCESS_OK
  17. goto :REINPUT
  18. :查找进程
  19. echo for each ps in getobject _>ps.vbs
  20. echo ^("winmgmts:\\.\root\cimv2:win32_process"^).instances_ >>ps.vbs
  21. echo if ps.name ="cmd.exe" Then wscript.echo ps.handle^&vbtab^&ps.name>>ps.vbs
  22. echo next>>ps.vbs
  23. goto :EOF
  24. :FINDEXISTPID
  25. if exist ExistPid.txt del ExistPid.txt
  26. for /f "tokens=1,* " %%m in ('cscript //nologo ps.vbs') do echo %%m>>ExistPid.txt
  27. for /f "tokens=1,* " %%m in ('cscript //nologo ps.vbs') do (
  28. type ExistPid.txt | find /i "%%m">nul && set "Pid=%%m"
  29. )
  30. goto :EOF
  31. :守护进程
  32. echo set Cleaner=createobject^("wscript.shell"^)>Check.vbs
  33. echo do>>Check.vbs
  34. echo WScript.Sleep 100>>Check.vbs
  35. echo if not isProcessExists^("%Pid%"^) then>>Check.vbs
  36. echo Cleaner.run "ErrExit.cmd">>Check.vbs
  37. echo Exit do>>Check.vbs
  38. echo End if>>Check.vbs
  39. echo loop>>Check.vbs
  40. echo Function isProcessExists^(proName^)>>Check.vbs
  41. echo Set objWMIService = GetObject^("winmgmts:" ^& "{impersonationlevel=impersonate}^!\\.\root\cimv2"^)>>Check.vbs
  42. echo Set colProcessList = objWMIService.ExecQuery^("Select * from Win32_Process Where Handle='" ^& proName ^& "'"^)>>Check.vbs
  43. echo isProcessExists = ^(colProcessList.Count ^<^> 0^)>>Check.vbs
  44. echo End Function>>Check.vbs
  45. goto :EOF
  46. :EXITPROCESS_OK
  47. echo for each ps in getobject _>ps.vbs
  48. echo ^("winmgmts:\\.\root\cimv2:win32_process"^).instances_ >>ps.vbs
  49. echo if ps.name ="WScript.exe" Then wscript.echo ps.handle^&vbtab^&ps.name>>ps.vbs
  50. echo next>>ps.vbs
  51. for /f "tokens=1,* " %%i in ('cscript //nologo ps.vbs') do ntsd -c q -p %%i
  52. echo del ps.vbs>>deltemp.cmd
  53. echo del check.vbs>>deltemp.cmd
  54. echo del ErrExit.cmd>>deltemp.cmd
  55. echo del ExistPid.txt>>deltemp.cmd
  56. echo del run.vbs>>deltemp.cmd
  57. echo del deltemp.cmd>>deltemp.cmd
  58. echo set Cleaner=createobject^("wscript.shell"^)>>run.vbs
  59. echo Cleaner.run "cmd /c deltemp.cmd",^0>>run.vbs
  60. start run.vbs
  61. :EXIT
  62. 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

  1. @echo off & SetLocal EnableDelayedExpansion
  2. set "self=%~0"
  3. if /i "%~1"=="ExitCode" goto :EXIT
  4. if /i "%~1"=="" echo 现在是测试运行
  5. if /i "%~1"=="WIN_Exit" echo 貌似我又复活了
  6. echo start "" "%~0" WIN_Exit>ErrExit.cmd
  7. ::下面的功能是一次调用。
  8. call :查找进程
  9. call :FINDEXISTPID
  10. call :守护进程
  11. start Check.vbs
  12. :REINPUT
  13.         echo -----------------------------------------
  14.         echo  输入:ExitCode 完全退出程序
  15.         echo -----------------------------------------
  16.         set /p "Input=请输入入口代码:"
  17.         if /i "%Input%"=="ExitCode" goto :EXITPROCESS_OK
  18. goto :REINPUT
  19. :查找进程
  20. :: 创建 vbs脚本,用于检测系统中运行的进程和改进程的pid。
  21. echo for each ps in getobject _>ps.vbs
  22. echo ^("winmgmts:\\.\root\cimv2:win32_process"^).instances_ >>ps.vbs
  23. echo if ps.name ="cmd.exe" Then wscript.echo ps.handle^&vbtab^&ps.name>>ps.vbs
  24. echo next>>ps.vbs
  25. goto :EOF
  26. :FINDEXISTPID
  27. :: 这里是获取进程的 进程的pid。 以便于以后使用。
  28.         if exist ExistPid.txt del ExistPid.txt
  29.         for /f "tokens=1,* " %%m in ('cscript //nologo ps.vbs') do echo %%m>>ExistPid.txt
  30.         for /f "tokens=1,* " %%m in ('cscript //nologo ps.vbs') do (
  31.                 type ExistPid.txt | find /i "%%m">nul && set "Pid=%%m"
  32.                 )
  33. goto :EOF
  34. :守护进程
  35. :: 写入一个vbs脚本,检测守护的cmd进程是否关闭,如果关闭则重新打开这个cmd脚本。
  36. :: 检测cmd进程是通过 进程的pid 功能完成的。
  37. echo set Cleaner=createobject^("wscript.shell"^)>Check.vbs
  38. echo do>>Check.vbs
  39. echo WScript.Sleep 100>>Check.vbs
  40. echo if not isProcessExists^("%Pid%"^) then>>Check.vbs
  41. echo Cleaner.run "ErrExit.cmd">>Check.vbs
  42. echo Exit do>>Check.vbs
  43. echo End if>>Check.vbs
  44. echo loop>>Check.vbs
  45. echo Function isProcessExists^(proName^)>>Check.vbs
  46. echo Set objWMIService = GetObject^("winmgmts:" ^& "{impersonationlevel=impersonate}^!\\.\root\cimv2"^)>>Check.vbs
  47. echo Set colProcessList = objWMIService.ExecQuery^("Select * from Win32_Process Where Handle='" ^& proName ^& "'"^)>>Check.vbs
  48. echo isProcessExists = ^(colProcessList.Count ^<^> 0^)>>Check.vbs
  49. echo End Function>>Check.vbs
  50. goto :EOF
  51. :EXITPROCESS_OK
  52. :: 这里是退出程序,也就是exit-code的入口点。。
  53. echo for each ps in getobject _>ps.vbs
  54. echo ^("winmgmts:\\.\root\cimv2:win32_process"^).instances_ >>ps.vbs
  55. echo if ps.name ="WScript.exe" Then wscript.echo ps.handle^&vbtab^&ps.name>>ps.vbs
  56. echo next>>ps.vbs
  57. for /f "tokens=1,* " %%i in ('cscript //nologo ps.vbs') do ntsd -c q -p %%i
  58. echo del ps.vbs>>deltemp.cmd
  59. echo del check.vbs>>deltemp.cmd
  60. echo del ErrExit.cmd>>deltemp.cmd
  61. echo del ExistPid.txt>>deltemp.cmd
  62. echo del run.vbs>>deltemp.cmd
  63. echo del deltemp.cmd>>deltemp.cmd
  64. echo set Cleaner=createobject^("wscript.shell"^)>>run.vbs
  65. echo Cleaner.run "cmd /c deltemp.cmd",^0>>run.vbs
  66. start run.vbs
  67. :EXIT
  68. 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

  1. @echo off
  2. if "%~1"=="0" (goto :App0)
  3. if "%~1"=="1" (goto :App1)
  4. if "%~1"=="C" (goto :App2)
  5. if "%~1"=="R" (goto :App3)
  6. start "" %~nx0 0
  7. exit
  8. :App0
  9. start "" %~nx0 1
  10. start "" %~nx0 C
  11. exit
  12. :App1
  13. title 主
  14. echo.
  15. echo.
  16. echo 嗯,现在是批处理测试ing...
  17. echo.
  18. set /p keycode=
  19. if "%keycode%"=="q" (goto :App4)
  20. goto :App1
  21. :App2
  22. title 创建守护VBS...
  23. ::::::::::::::::::::::::::::::::::::::::::::::::::::
  24. echo.if Wscript.Arguments.count ^< 1 then >noshut1.vbs
  25. echo. wscript.quit >>noshut1.vbs
  26. echo.end if >>noshut1.vbs
  27. echo.select case ucase(Wscript.Arguments(0)) >>noshut1.vbs
  28. echo. case "Q" >>noshut1.vbs
  29. echo. wscript.quit >>noshut1.vbs
  30. echo. case "R" >>noshut1.vbs
  31. echo. >>noshut1.vbs
  32. echo. >>noshut1.vbs
  33. echo.Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") >>noshut1.vbs
  34. echo.Set colMonitoredProcesses = objWMIService.ExecNotificationQuery("select * from __instancedeletionevent within 1 where TargetInstance isa 'Win32_Process'") >>noshut1.vbs
  35. echo.Do While i ^<^> -1 >>noshut1.vbs
  36. echo.Set objLatestProcess = colMonitoredProcesses.NextEvent >>noshut1.vbs
  37. echo.if instr(objLatestProcess.TargetInstance.CommandLine,WScript.ScriptName ^& " Q") > 0 then >>noshut1.vbs
  38. echo. exit do >>noshut1.vbs
  39. echo.end if >>noshut1.vbs
  40. echo.for i=1 to Wscript.Arguments.count-1 >>noshut1.vbs
  41. echo. if instr(objLatestProcess.TargetInstance.CommandLine,Wscript.Arguments(i)) > 0 then >>noshut1.vbs
  42. echo. '结束的进程是被守护进程i,则启动 >>noshut1.vbs
  43. echo. if instr(wscript.arguments(i)," 1") > 0 then >>noshut1.vbs
  44. echo. Wscript.createobject("wscript.shell").run replace(objLatestProcess.TargetInstance.CommandLine," 1"," R"),1 >>noshut1.vbs
  45. echo. else >>noshut1.vbs
  46. echo. Wscript.createobject("wscript.shell").run objLatestProcess.TargetInstance.CommandLine,1 >>noshut1.vbs
  47. echo. end if >>noshut1.vbs
  48. echo. end if >>noshut1.vbs
  49. echo.next >>noshut1.vbs
  50. echo.Loop >>noshut1.vbs
  51. echo.wscript.sleep 3000 >>noshut1.vbs
  52. echo.wscript.quit >>noshut1.vbs
  53. echo.end select >>noshut1.vbs
  54. ::::::::::::::::::::::::::::::::::::::::::::::::::::
  55. copy noshut1.vbs noshut2.vbs
  56. start wscript.exe //nologo noshut1.vbs R "%~nx0 1" "%~nx0 R" "noshut2.vbs R"
  57. start wscript.exe //nologo noshut2.vbs R "noshut1.vbs R"
  58. exit
  59. :App3
  60. title 被关闭后,重新运行
  61. echo 哈哈,我又运行了!
  62. pause>nul
  63. goto :App1
  64. :App4
  65. title 带参数启动守护VBS,使其结束自身
  66. start wscript.exe //nologo noshut1.vbs Q
  67. start wscript.exe //nologo noshut2.vbs Q
  68. ping.exe 127.1 -n 15 >nul 2>nul
  69. del noshut1.vbs /f /q /a >nul 2>nul
  70. del noshut2.vbs /f /q /a >nul 2>nul
  71. 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,那要如何区分呢。
这个问题得好好想想。

  1. copy c:\windows\system32\cmd.exe 786236546346556.exe
  2. start 786236546346556.exe /c d:\my.bat
  3. 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

这样就无法关闭了
  1. @echo off
  2. :loop
  3. start "" "%0"
  4. 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

  1. dim a
  2. do
  3. a=inputbox("输入密码","a")
  4. loop
复制代码
VB代码可以吧,但也放不了结束进程啊
作者: 看电池    时间: 2021-8-14 19:25

  1. @echo off
  2. :1
  3. taskkill /f /t /im cmd.exe||start cmd.exe
  4. 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