[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

怎样让批处理进程用普通方法杀不掉?

不管你采用什么方法,
条件:
1,(cmd命令,vbs)不得使用第三方工具。。
2,  可以产生临时文件,但程序按正常结束时需要能把产生的临时文件清理干净)

目的:


当其他的程序关闭你的批处理的时候。你的批处理能知道这种情况的发生(并处理下列情况之一)

1,并完成批处理被关闭后的操作(现在要求,在批处理的上级目录写入:[关闭的日期][关闭的时间])

2,重新运行被关闭的批处理。(批处理文件是 [echo 哈哈,我又运行了&pause>nul],被关闭前是显示 echo 嗯,现在是批处理测试ing,pause>nul )

3,  使用命令行操作 kill cmd.exe 的时候,能不被干掉。(并显示 "哈哈,我又复活了" 的消息)

4,若上面的做可以做到,那么就要完成这一项,给出一个退出码。在输入退出码后可以正常的退出(不再出现上面的消息)

--------------------------------

我是新人,没有什么积分奖励给大家。
但我相信,高手们都是勇于挑战自我的,不是么?(也请斑竹们帮帮忙,帮完成了挑战的人++分吧)
斑竹们已经放了话了(满分哦~!荣誉的象征呢)

[ 本帖最后由 flyinspace 于 2008-8-21 19:56 编辑 ]

已经成功的完成了挑战啊??

为什么不换个思维呢?

想一下:流氓软件是怎么做出来的,我们要的是方法,嘿嘿

TOP

对了。斑竹,你觉得完成了挑战的人应该+多少分呢 ?

而且,说实话,当代码放出来的时候。你会惊讶原来可以如此简单。

TOP

嗯。。斑竹就是厉害,一下就想到了。

那么想看看斑竹的方案哟。

要记得哦。。别杀错了pid哟。

TOP

原帖由 pusofalse 于 2008-8-21 19:41 发表
这绝对是一个挑战。只要处理一个情况就可以了吗?
兄有解了吗?


根据自己的情况呀。如果能同时处理3种情况自然最好。。

但若不行,根据自己的实力,只处理一种情况也行啊。

TOP

原帖由 pusofalse 于 2008-8-21 19:49 发表
思路是有,但感觉总会有点绕。
“主军”的PID。。。万一运行时开着另外一个CMD.EXE,那要如何区分呢。
这个问题得好好想想。


不饶点,怎么行呢,那里能简简单单的获取分数。你说是吧。

TOP

原帖由 pusofalse 于 2008-8-21 19:51 发表
对了,能产生临时文件吗?

当然可以产生临时文件,不过临时文件在正常退出批处理的时候,要能被清除

TOP

都可以。你可以用任务管理器关闭,也可以点关闭来模拟这种情况的出现。

TOP

  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
复制代码
麻烦大家测试一下..
3

评分人数

TOP

原帖由 pusofalse 于 2008-8-22 05:12 发表
精彩!
测试果真关不了。最后我先结束Wscript.exe,然后kill cmd.exe,完了,临时文件没删除。
要是这么搞病毒,看来得实时查杀任务管理器。


没有,上面的代码只是演示而已,要不然,得用批处理脚本才能中断了....

最初的代码因为做得比较变态,只能exitcode代码的方式退出来,或者采用中断进程树的形式解决问题.

那个时候就不是简单的用任务管理器可以解决的。

但我还是担心有bug,于是就把那个简化了一下,做成了上面的代码.

TOP

原帖由 千浪 于 2008-8-23 17:05 发表
能不能这样.先把CMD.EXE复制为其他AMD.EXE,然后用注册表设置BAT用AMD.EXE来运行.

你可以设置一下实验咯。

直接点关闭按钮关闭Amd.exe试下就知道了。

其实与这个无关。

TOP

  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
复制代码

对我写的部分代码的解析。。
只解释段代码。。批处理基础过关的人应该都可以看明白了。

TOP

原帖由 everest79 于 2008-9-15 17:57 发表
按服务来加载,利用系统日志,然后以高特权账户登录,这样超级管理员是无法终止的

光说没用,写出来。。。。

呵呵

TOP

原帖由 everest79 于 2008-10-9 08:16 发表
你自已太懒了,嘿嘿!

怎么这么说我呢。。。。我至少还写了代码呀。

拜托,吧你的结论写出来吧。。。

我想批处理室的好多人都在拭目以待呢 。

TOP

原帖由 rat 于 2008-10-18 22:21 发表
LZ的代码中vbs的查找进程并不一定能准确的找到运行的批处理的pid,因为实际上找的是cmd.exe的。


刚才太冲了点。具体你研究吧。。

或者拿出更好的方案出来。。

[ 本帖最后由 flyinspace 于 2008-10-19 12:24 编辑 ]

TOP

返回列表