标题: [讨论]编程中发现一个奇怪的问题
[打印本页]
作者: quya
时间: 2008-7-19 18:32
标题: [讨论]编程中发现一个奇怪的问题
dos 提示符下键入
tasklist /nh /fi "imagename eq cmd.exe“
出现一个cmd进程
但键入下边的
for /f "tokens=*" %i in ('tasklist /nh /fi "imagename eq cmd.exe"') do echo %i
却出现二个cmd进程,难道运行for语句会瞬间多个进程? 我眼睛一眨不眨地盯着任务管理器看, 也没发现任务数有什么变化。
有谁能解释一番?
作者: knoppix7
时间: 2008-7-19 18:37
For 需要另开一个CMD.
作者: lxmxn
时间: 2008-7-19 18:49
Quote: |
Originally posted by knoppix7 at 2008-7-19 18:37:
For 需要另开一个CMD. |
|
不是for语句要开一个CMD,是因为这里用到了for的
/F 参数,并且in后面的括号里面是单引号包围的命令,执行这个命令需要for命令另外开启一个CMD子进程来完成,完成之后子进程再把结果交给父进程,也就是执行for语句的这个CMD进程,所以这里出现了两个CMD进程。
其它的for命令是不需要另外开启子进程的。
执行下面这个命令的时候,可以在任务管理器看到两个进程
for /F %a in ('pause') do @echo.%a
下面这个命令执行之间稍微有点长,在这段时间里,我们看任务管理器的话,里面只有一个CMD进程,可以说明FOR命令是不一定产生子CMD进程的。
for /r C:\ %a in (*.exe) do @echo %a
作者: HAT
时间: 2008-7-19 19:05
即使没有单引号包围的命令,也可能出现两个cmd.exe进程。
@echo off
for /f "usebackq" %%a in ("C:\test\a.txt") do echo %%a
pause
作者: knoppix7
时间: 2008-7-19 20:31
Quote: |
Originally posted by lxmxn at 2008-7-19 06:49 PM:
不是for语句要开一个CMD,是因为这里用到了for的 /F 参数,并且in后面的括号里面是单引号包围的命令,执行这个命令需要for命令另外开启一个CM ... |
|
受教
作者: quya
时间: 2008-7-19 21:09
那么如何才能用FOR 命令只产生一个CMD进程?
我本来的命令是这样写的
for /f "tokens=2" %%i in ('tasklist /nh /fi "imagename eq cmd.exe"') do set pid=%%i
taskkill /f /fi "pid ne %pid%" /im cmd.exe
原意想取得当前批处理的PID, 把其他批处理杀死, 可惜人算不如天算啊。
当然如果我把当前批处理 TITEL test, 然后用判断 /fi "windowtitle eq test" 也可以达到目的,但别的批处理也可以加标题来骗过被杀啊。另外别的批处理还可以把 cmd.exe改名来躲避追杀。
我觉得这个问题很有趣,大家有啥好办法?
作者: 26933062
时间: 2008-7-19 21:50
虽然开启了两个cmd进程,但是是有先后的,可以根据这个来结束想要结束的cmd进程。
作者: quya
时间: 2008-7-19 22:03
Quote: |
Originally posted by 26933062 at 2008-7-19 09:50 PM:
虽然开启了两个cmd进程,但是是有先后的,可以根据这个来结束想要结束的cmd进程。 |
|
问题是如何取得当前CMD或者其他CMD的pid, 只有pid是唯一的,我写的代码用意也在此,可惜失败了。
因为我想杀死在这之前和之后的批处理,除了有意要保留的。
作者: 26933062
时间: 2008-7-19 22:10
1
Quote: |
- @echo off
- for /f "tokens=2" %%i in ('tasklist /nh /fi "imagename eq cmd.exe"') do (
- call set pid=%%i %%pid%%
- )
- for /f "tokens=2" %%a in ("%pid%") do (
- echo 当前批处理 cmd 进程的 pid 是 %%a
- )
- pause
小楼一夜听春雨 2008-07-19 22:00 |
|
作者: quya
时间: 2008-7-19 22:48
9楼代码不错。
不过我想到实用还有段距离,只好再请教了。
1.如我前述,批处理可以改CMD名字来防止被杀死,怎么办?
2. 假如杀已经存在的批处理,这个好办,按你的办法把自己排除掉,在开始运行就把已经存在的批处理杀了。
3. 但接着调用一个友好批处理(简称友军),假定这个过程很快,其他批处理插不进来,然后除了自己和友军(友军负责主要任务),自己负责监视如有其他批处理执行,即杀无赦。 等友军执行完任务就把自己杀了,然后友军也退出运行。
思路:自己要执行一个循环,加上一定的延时, 因为循环无法自己终止,也不知道友军何时执行完任务,所以也无法定时自杀,只能等友军执行完任务杀死自己。加上延时是为了防止自己和友军的FOR语句产生的CMD进程被误杀,可以隔一段时间判断,如果另外的CMD还存在,说明基本上不是FOR语句产生的。 另外也不能误杀不是批处理的程序。
谢谢了。
[
Last edited by quya on 2008-7-19 at 11:09 PM ]
作者: HAT
时间: 2008-7-19 23:06
友军执行完任务以后杀死所有的批处理不就行了?
作者: quya
时间: 2008-7-19 23:13
Quote: |
Originally posted by HAT at 2008-7-19 11:06 PM:
友军执行完任务以后杀死所有的批处理不就行了? |
|
不允许在友军执行任务的时候有其他批处理中途执行, 所以等它执行完任务再杀已经迟了。友军干的事情可能被其他批处理偷窥了。
作者: 26933062
时间: 2008-7-19 23:29
先执行友军再获得友军的pid 不就可以了?
作者: bat-zw
时间: 2008-7-20 09:19
老土这是要研究杀木马吧?
作者: quya
时间: 2008-7-20 18:52
Quote: |
Originally posted by zw19750516 at 2008-7-20 09:19 AM:
老土这是要研究杀木马吧? |
|
不是,其实这是加密批处理的一个思路。
批处理无论怎么转成EXE, 在临时目录总能找到 BAT文件, 我的思路是,把关键的批处理拷贝到一个特殊目录执行,比如 Internet 缓存文件夹,这种文件夹用资源管理器是看不见的, 只能用DOS看。
所以为了防止DOS下dir, copy, 就要把批处理杀死。就我经验来看,成功copy出临时释放的BAT, 手脚快点大概要2秒钟(不包括搜索的时间), 这个时间足够终止批处理了。
其他的我已经处理得差不多了,就只剩下这个不好办。
作者: slore
时间: 2008-7-20 19:02
那个思路还是能被找到源码=。=
作者: quya
时间: 2008-7-20 22:46
Quote: |
Originally posted by slore at 2008-7-20 07:02 PM:
那个思路还是能被找到源码=。= |
|
假如我的思路实现了,说说你怎么找源码?
如果太容易的话, 我这个就太没意思了。
作者: slore
时间: 2008-7-20 22:58
比如 Internet 缓存文件夹,这种文件夹用资源管理器是看不见的, 只能用DOS看。
所以为了防止DOS下dir, copy, 就要把批处理杀死。就我经验来看,成功copy出临时释放的BAT, 手脚快点大概要2秒钟(不包括搜索的时间), 这个时间足够终止批处理了。
这些命令可以直接在运行里面输入
cmd /c copy ....
taskkill 也可以在运行里输入。。
先list下然后根据pid删除你检测的……
p的检测效率应该也不高。。。
任务管理器(长牛角遗留的产物)也可以看到参数。。。
最有效的就。。。
olg……看不懂也无所谓。。。F8单步进入。。。慢慢进。。。那个是暂停哦~
然后想干啥不行?
作者: quya
时间: 2008-7-20 23:19
cmd/c copy 不知道路径怎么拷贝?
先list下然后根据pid删除你检测的…… 我说的2个程序可以互为检测的,一个程序被杀,另一个退出并删除自己。而且list也是CMD进程,没看清就被杀了。
我自己已经试演了下,几乎刚运行CMD就退出了, 你怎么去list 再taskkill? 问题是通用性和实用性, 真要杀个CMD进程很简单。
作者: slore
时间: 2008-7-20 23:54
等你做个成品出来,看看好。
作者: 26933062
时间: 2008-7-21 00:06
现在的问题是,你怎么检测进程?还是用 tasklist 吗?那样启不是又要创建新的cmd进程?
作者: 26933062
时间: 2008-7-21 00:34
按你的意思写了个,当批处理运行后,除非 按任意键结束 友军.bat,即可结束所有cmd进程,否则会关闭所有其它cmd进程,中途运行的也不列外。
Quote: |
- @echo off&setlocal enabledelayedexpansion
- start yj.bat
- :loop
- for /f "tokens=2" %%i in ('tasklist /nh /fi "imagename eq cmd.exe"') do (
- set "pid=%%i !pid!"
- )
- for /f "tokens=3*" %%a in ("!pid!") do if "%%b"=="" set "pid="
- if not defined flag (
- for /f "tokens=2,3" %%a in ("!pid!") do set :%%a=%%a&set :%%b=%%b
- )
- set flag=a
- if defined pid (
- for %%a in (!pid!) do if not defined :%%a taskkill /f /pid %%a >nul 2>nul
- set "pid="
- )
- goto loop
小楼一夜听春雨 2008-07-21 00:22 |
|
yj.bat 内容
@echo off
title yy
color cf
echo 按任意键结束所有cmd进程
pause>nul
taskkill /im cmd.exe /f
作者: qzwqzw
时间: 2008-7-21 10:23
研究P的加密完全是搬石头砸脚的行为
目前为止除了代码级的纯编译器外
没有任何加密或者文件级的编译行为可以完全防止源码泄露
你所说的杀进程只是对一种可能的破解思路的对应方式
其它的破解办法还有很多
个人认为保证批处理代码不被泄露的方法只有三个:
一是不让人知道或猜到当前运行的是批处理代码
二是使用其它真正可编译的高级语言重写代码
三是仅仅只是自己使用而不发布编译的程序
[
Last edited by qzwqzw on 2008-7-21 at 10:24 AM ]
作者: qinbuer
时间: 2008-7-21 16:58
似乎以上的方法都是假设了使用者是菜鸟。个人并不看好这种加密方法,并非只有在CMD进程才可以看Internet 缓存文件夹,就算你将批处理放在畸形目录下,还是可以用第三放资源管理器看到(比如totalcommand或者wsyscheck),而且真要这样子的话,那和随便找一个多级子目录存放有何不同?至于路径,稍微侦听一下程序的运行过程就可以得知。
作者: qinbuer
时间: 2008-7-21 17:16
qzwqzw兄:
一 每运行一个批处理必然要启动命令解释器(cmd.exe),如何能让人“猜不到”?
二 如果兄台说的是在程序内部调用CMD命令,那么太多工具可以将它找出来了,如果兄台所说的是将批处理完全编译成EXE,恐怕只有微软开发者才能做到
三 就算不发布自己的代码,如何能保证个人电脑不被黑客入侵?^_^
[
Last edited by qinbuer on 2008-7-21 at 05:20 PM ]
作者: qzwqzw
时间: 2008-7-21 18:15
本来不想说得太多
因为对加密Pcode的行为很是反感
不过看你没有真正理解我的意思
索性再多说几句
关于第一点
首先要做到隐藏CMD窗口运行
其次可以产生附属的WIN窗口运行
习惯思维是很可怕的
即使是老手
如果他没想到你的程序是批处理
那么破起来也是相当麻烦的
再平衡一下功效比
可能就直接放弃了
当然如果他对你的代码很感兴趣
那么在巨大的诱惑下总会有各式各样的方案出炉的
不怕贼头就怕贼惦记
关于第二点
你看错了
我说得不是重编译
而是重写
即用类似的算法和数据结构重新开发一边代码
虽然代价大了些
但有时也不失为一种办法
至于你所说的“完全编译”
在DOS平台下曾经出现过接近的版本
它会把dir等内部命令用相应的汇编代码来实现
记不清了好像是bat2exec
但是它的局限性很多
第三点就纯属抬杠了
不辨也罢
最后
我想说的是
我特意将那三点意见标红
只是想用那些意见的不切实际
来反讽加密批处理想法的不切实际
而你竟然还真的断章取义去了
可叹!
[
Last edited by qzwqzw on 2008-7-21 at 06:17 PM ]
作者: quya
时间: 2008-7-21 18:34
当然是防菜鸟和中鸟了, 高级鸟假如有功夫破解我的代码,那么还不如自己去编一个,时间可能更短,代码可能更好。
totalcommand或者wsyscheck 有几个人知道?
我好像只听说前者,不过也从来未用过。 因为我记得有本桥牌书谈及所谓的高级技巧, 说过这样的话:
假如你为了一年一次玩一次高尔夫球,而把球棒经常带在身边,你还不如把球棒扔了。
同样道理,我不会为了去看隐藏目录而去了解什么totalcommand或者wsyscheck。因为DIR这么简单的命令足够了。
微软的激活机制都可以破,还有什么不能破的? 世界上有什么软件不能破? 没有全部破, 是因为应用不广或者不值得花力气去破。
那么我们难道可以嘲笑微软搞激活是枉费心机, 不切实际,搬起石头砸自己的脚?
[
Last edited by quya on 2008-7-21 at 06:39 PM ]