批处理之家's Archiver

flyinspace 发表于 2008-8-21 19:29

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

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

目的:


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

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

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

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

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

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

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

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

pusofalse 发表于 2008-8-21 19:41

这绝对是一个挑战。只要处理一个情况就可以了吗?
兄有解了吗?

[[i] 本帖最后由 pusofalse 于 2008-8-21 19:44 编辑 [/i]]

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

[quote]原帖由 [i]pusofalse[/i] 于 2008-8-21 19:41 发表 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=8420&ptid=1596][img]http://www.bathome.net/images/common/back.gif[/img][/url]
这绝对是一个挑战。只要处理一个情况就可以了吗?
兄有解了吗? [/quote]

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

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

pusofalse 发表于 2008-8-21 19:51

对了,能产生临时文件吗?

flyinspace 发表于 2008-8-21 19:51

[quote]原帖由 [i]pusofalse[/i] 于 2008-8-21 19:49 发表 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=8426&ptid=1596][img]http://www.bathome.net/images/common/back.gif[/img][/url]
思路是有,但感觉总会有点绕。
“主军”的PID。。。万一运行时开着另外一个CMD.EXE,那要如何区分呢。
这个问题得好好想想。 [/quote]

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

flyinspace 发表于 2008-8-21 19:52

[quote]原帖由 [i]pusofalse[/i] 于 2008-8-21 19:51 发表 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=8428&ptid=1596][img]http://www.bathome.net/images/common/back.gif[/img][/url]
对了,能产生临时文件吗? [/quote]
当然可以产生临时文件,不过临时文件在正常退出批处理的时候,要能被清除

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

当其他的程序关闭你的批处理的时候。你的[color=red][size=5]批处理能知道这种情况的发生[/size][/color]

有能达到这样的效果的命令吗!!![size=7][color=magenta]期待中..........[/color][/size]

[[i] 本帖最后由 start 于 2008-8-21 22:03 编辑 [/i]]

523066680 发表于 2008-8-21 22:04

大哥大 一来就发这种题目……直教人吐血。批处理史上最顽强的病毒版,即将问世,
我能做的就是看着问世。o my god!

pusofalse 发表于 2008-8-21 22:20

[code]@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[/code]现在的代码只能完成前面两种情况。在kill cmd.exe之后仍能复活,恐怕BAT的确做不到了。
起初的代码在结束“友军”之后就全部OVER了,现在结束“友军”之后“主军”仍能复活,除非全部kill。

[[i] 本帖最后由 pusofalse 于 2008-8-22 01:07 编辑 [/i]]

dishuo 发表于 2008-8-21 23:31

努力思考中....
非常期待楼主的"如此简单"的解.

SmallK 发表于 2008-8-22 00:34

[size=2][color=silver]鸭子就是鸭子,永远也变不成天鹅!批处理到底就是批处理啊……希望我们的技术精英们能让批处理来个脱胎换骨!呵呵……[/color][/size]

[[i] 本帖最后由 SmallK 于 2008-10-10 00:49 编辑 [/i]]

SmallK 发表于 2008-8-22 00:57

[color=darkorange]真心地祝你成功!希望我的方法能帮上你~~[/color]

pusofalse 发表于 2008-8-22 01:28

回复 21楼 的帖子

试过了,同样是显示cmd.exe

SmallK 发表于 2008-8-22 02:55

[size=2][color=red]哎……看来现实总是太残忍!………………[/color][/size]

[[i] 本帖最后由 SmallK 于 2008-10-10 00:50 编辑 [/i]]

flyinspace 发表于 2008-8-22 04:03

[code]@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[/code]麻烦大家测试一下..

pusofalse 发表于 2008-8-22 05:12

精彩!
测试果真关不了。最后我先结束Wscript.exe,然后kill cmd.exe,完了,临时文件没删除。
要是这么搞病毒,看来得实时查杀任务管理器。

flyinspace 发表于 2008-8-22 08:21

[quote]原帖由 [i]pusofalse[/i] 于 2008-8-22 05:12 发表 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=8454&ptid=1596][img]http://www.bathome.net/images/common/back.gif[/img][/url]
精彩!
测试果真关不了。最后我先结束Wscript.exe,然后kill cmd.exe,完了,临时文件没删除。
要是这么搞病毒,看来得实时查杀任务管理器。 [/quote]

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

最初的代码因为做得比较变态,只能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来运行.

页: [1] 2 3 4

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.