找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 72941|回复: 15

[文本处理] [已解决]批处理如何读取txt文档中的代码并逐行执行?

[复制链接]
发表于 2018-12-20 18:15:27 | 显示全部楼层 |阅读模式
本帖最后由 tz_being 于 2018-12-25 17:48 编辑


  降低难度见9楼的要求。

  众所周知,现在批处理的加密基本如同虚设,为躲避“追 杀”,只好东躲西藏,把核心代码放到文档当中。就像下面的txt文档内就藏了一段批处理代码,内容是这样的:

  古时候,在一个神秘的部落,父亲把儿子送到远方的一个智者那里学习。三年后儿子回来了,他带回了那个书院所能授予的最高奖励。他通过了所有的考试,得到了最高的分数,带回了许多的知识。父亲问他,你学到“那个”了吗?你学到的知识全部都是“关于”某个东西,属于这个东西的外围,你有深入到东西的核心里吗?
……

begin
for /f "skip=9 tokens=3" %%d in ('echo list volume ^| diskpart') do (fsutil fsinfo drivetype %%d:|find "可移动" && if exist %%d: set MoveDisk=%%d)
for /f "tokens=1,2*" %%l in ('md5.exe %MoveDisk%:\芝麻开门.exe') do set md5=%%l
if /i "%md5%"=="2E11364852E70C4EC1F3B6AE7FA4E022" goto chkpass
end

……
  李东垣指出:“五脏皆禀气于脾胃,以达于九窍;烦劳伤中,使冲和之气不能上升,故目昏而耳聋也”。就是说:人体五脏之气汇集在脾胃,靠脾胃来主导升降,肝肾来疏泄。当人体的脾胃、肝肾功能不平衡,清阳不升,浊气上扰,疏泄不利,就会瘀阻宗脉造成耳神经受损,就会产生耳鸣耳聋的症状。李东垣以黄芪15g﹑人参15,葛根9、蔓荆子9,白芍6﹑黄柏6,升麻4,炙甘草3组方成益气聪明汤,参、芪甘温以补脾胃,甘草甘缓以和脾胃,干葛、升麻、蔓荆轻扬升发,入阳明鼓舞胃气上行头目。中气既足,清阳上升,则九窍通利,耳聪而目明矣。白芍敛阴和血,黄柏补肾生水,盖目为肝窍,耳为肾窍,故又用二者,平肝滋肾也。

  现在需要一个批处理逐行读取begin与end之间的代码(不包括begin和end)并执行,就是把中间的代码提取出一行就运行一行代码,然后提取第二行,再运行第二行,这样隐密性比较高,路过的大侠请不吝赐教。
发表于 2018-12-21 01:55:39 | 显示全部楼层

12.25更新

本帖最后由 yhcfsr 于 2018-12-26 03:18 编辑
  1. @set @n=0/*&echo off
  2. set "TXT=test.txt"
  3. cscript -nologo -E:jscript "%~f0" "%TXT%" "%TEMP%"
  4. call "%temp%\ftmp.bat"
  5. del /f /q  /a:h "%temp%\ftmp.bat"
  6. pause&exit */

  7. var file=WScript.Arguments(0);
  8. var temp=WScript.Arguments(1);
  9. var fso=new ActiveXObject('scripting.FileSystemObject');
  10.         fo=fso.OpenTextFile(file);
  11. var result='';       
  12.         while(!fo.AtEndOfStream)
  13.         {
  14.                 line=fo.ReadLine();
  15.                 if(line=='end') break;
  16.                 if(begin) result+=line+'\r\n';
  17.                 if(line=='begin') var begin=1;
  18.         }
  19.         fo.close();
  20.         temp=temp+'/ftmp.bat';
  21.         fo=fso.OpenTextFile(temp,2,true);
  22.         fo.Write(result)
  23.         fo.close();
  24.         f = fso.GetFile(temp);
  25.         f.attributes=2
复制代码

评分

参与人数 1技术 +1 收起 理由
tz_being + 1 辛苦了,谢谢。

查看全部评分

发表于 2018-12-21 02:46:25 | 显示全部楼层
回复 2# yhcfsr
给大佬敬茶,这混编功底不是一般的强!
 楼主| 发表于 2018-12-21 09:21:45 | 显示全部楼层
本帖最后由 tz_being 于 2018-12-21 09:22 编辑

2楼辛苦了 , 2楼的代码经测试,能把txt中间的批处理代码作一整体提取出来并覆盖原来的txt文档,已经非常接近我所想达到的目标了。可能我没有表达清楚,我想把中间的代码提取出一行就运行一行代码,然后提取第二行,再运行第二行。

举个例子:
先提取出for /f "tokens=1,2*" %%l in ('md5.exe %MoveDisk%:\芝麻开门.exe') do set md5=%%l并运行,
然后提取if /i "%md5%"=="2E11364852E70C4EC1F3B6AE7FA4E022" goto chkpass并运行。
发表于 2018-12-21 09:38:30 | 显示全部楼层
回复 4# tz_being


    BAT代码本身就是逐行执行的,2楼这种方式跟你说的那种方式在结果上有什么差异吗?
 楼主| 发表于 2018-12-21 10:26:32 | 显示全部楼层
    BAT代码本身就是逐行执行的,2楼这种方式跟你说的那种方式在结果上有什么差异吗? ...


    2楼的方式把代码一下子提取到一个临时文件当中,本来想隐藏于txt深处的代码就一下子暴露了。如果提取一行执行一行,隐密性会更高。

    众所周知,现在批处理的加密基本如同虚设,为躲避“追 杀”,只好东躲西藏,把核心代码放到文档当中,当然要更隐密的话,还可以把txt文档与图片合并起来伪装成图片的样子。一些不成熟的想法,见笑了
发表于 2018-12-21 12:50:18 | 显示全部楼层
回复 6# tz_being


    建议把需求介绍也更新到顶楼吧,以便大家理解一致。
 楼主| 发表于 2018-12-21 13:57:06 | 显示全部楼层
回复  tz_being
    建议把需求介绍也更新到顶楼吧,以便大家理解一致。
Batcher 发表于 2018-12-21 12:50


谢谢提醒。
 楼主| 发表于 2018-12-24 08:26:34 | 显示全部楼层
回复 Batcher


    看来这个问题难住了各位高手,现在降低难度,帮忙看看是否可以解决了呢。

    已知一个test.txt文档内容如下:
for /f "skip=9 tokens=3" %%d in ('echo list volume ^| diskpart') do (fsutil fsinfo drivetype %%d:|find "可移动" && if exist %%d: set MoveDisk=%%d)
for /f "tokens=1,2*" %%l in ('md5.exe %MoveDisk%:\芝麻开门.exe') do set md5=%%l
if /i "%md5%"=="2E11364852E70C4EC1F3B6AE7FA4E022" goto chkpass


    现在需要一个批处理文件逐行读取上述代码并执行,就好像上述的代码是这个批处理自己的一样,要求不能把test.txt改名为test.bat

   我用 for /f "delims=" %%a in (test.txt) do %%a只能读取每一行中的for、if,怎么读完整呢?

发表于 2018-12-24 18:23:39 | 显示全部楼层
回复 9# tz_being

这个不需要降低任何难度。顶楼和9楼都可以。
但你的文本中的P脚本要改方式。
1。P脚本中任何一行都要是完整内容。不要读取其它行的变量赋值,也不要设定不量。把需要设定的变量用 ECHO 的方式存储某一临时文件。后面的行从这临时文件读取变量。
2。任何一行中不要用 GOTO ,把GOTO 内容完整写在该行内。CALL 内容也依此。
你要一行一行读取执行。那么一行执行完,CMD就退出了。后面的行会重新打开CMD。和行变成了相互独立的了。

不生成临时文件。可以把这些命令用某方式(如POWERSHELL 的数组、字典)把它们拼成一行完整的命令。

把所有的 %% 改成 % 。这基本上是摸拟在CMD命令窗口中执行。

其实生成临时的 BAT文件更好。可以隐藏。执行完就删除。
 楼主| 发表于 2018-12-25 08:30:05 | 显示全部楼层
回复 10# xczxczxcz


    多谢指点。看来问题是无法解决了,这是由批处理的特点决定的。听说批处理是把全部代码读进内存,预先算好结果后再逐条执行,导致外来的代码只能以变量的形式参与进来,不能与主体代码融合一体。
 楼主| 发表于 2018-12-25 08:46:35 | 显示全部楼层
yhcfsr 发表于 2018-12-21 01:55
for /f "delims=" %%a in ('cscript -nologo -E:jscript "%~f0" "%TXT%"') do %%a



我想把输出文件%~f0改为d:\out.txt发现提取不出代码,麻烦帮看一下,因为不想把提取出的代码覆盖原文件。最好还能把输出文件设置成隐藏属性的。
发表于 2018-12-25 09:08:30 | 显示全部楼层
回复 11# tz_being


    你听说哪种脚本不是这样执行的
发表于 2018-12-25 13:04:18 | 显示全部楼层
回复 12# tz_being


自己不明白,还要瞎折腾.这里哪有什么输出文件?又哪有提取代码覆盖原文件?
你的这种加密方式本身就没有多少加密性可言,无非是掩耳盗铃罢了.
 楼主| 发表于 2018-12-25 13:27:34 | 显示全部楼层
回复 14# yhcfsr


    好吧,我承认是瞎折腾 。回到主楼,test.txt内容是这样:
  众所周知,现在批处理的加密基本如同虚设,为躲避“追 杀”,只好东躲西藏,把核心代码放到文档当中。就像下面的txt文档内就藏了一段批处理代码,内容是这样的:
……
begin
for /f "skip=9 tokens=3" %%d in ('echo list volume ^| diskpart') do (fsutil fsinfo drivetype %%d:|find "可移动" && if exist %%d: set MoveDisk=%%d)
for /f "tokens=1,2*" %%l in ('md5.exe %MoveDisk%:\芝麻开门.exe') do set md5=%%l
if /i "%md5%"=="2E11364852E70C4EC1F3B6AE7FA4E022" goto chkpass
end
……
  故又用二者,平肝滋肾也。


  用了你的代码后,test.txt变成:
for /f "skip=9 tokens=3" %%d in ('echo list volume ^| diskpart') do (fsutil fsinfo drivetype %%d:|find "可移动" && if exist %%d: set MoveDisk=%%d)
for /f "tokens=1,2*" %%l in ('md5.exe %MoveDisk%:\芝麻开门.exe') do set md5=%%l
if /i "%md5%"=="2E11364852E70C4EC1F3B6AE7FA4E022" goto chkpass


  我的意思是,咱们不改变test.txt的内容,就只把上述的代码输出到另一个txt文本当中,劳烦一下,不胜感激。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 22:45 , Processed in 0.024345 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表