Board logo

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

作者: tz_being    时间: 2018-12-20 18:15     标题: [已解决]批处理如何读取txt文档中的代码并逐行执行?

本帖最后由 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)并执行,就是把中间的代码提取出一行就运行一行代码,然后提取第二行,再运行第二行,这样隐密性比较高,路过的大侠请不吝赐教。

作者: yhcfsr    时间: 2018-12-21 01:55     标题: 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
复制代码

作者: jiavip    时间: 2018-12-21 02:46

回复 2# yhcfsr
给大佬敬茶,这混编功底不是一般的强!
作者: tz_being    时间: 2018-12-21 09:21

本帖最后由 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并运行。
作者: Batcher    时间: 2018-12-21 09:38

回复 4# tz_being


    BAT代码本身就是逐行执行的,2楼这种方式跟你说的那种方式在结果上有什么差异吗?
作者: tz_being    时间: 2018-12-21 10:26

    BAT代码本身就是逐行执行的,2楼这种方式跟你说的那种方式在结果上有什么差异吗? ...


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

    众所周知,现在批处理的加密基本如同虚设,为躲避“追 杀”,只好东躲西藏,把核心代码放到文档当中,当然要更隐密的话,还可以把txt文档与图片合并起来伪装成图片的样子。一些不成熟的想法,见笑了
作者: Batcher    时间: 2018-12-21 12:50

回复 6# tz_being


    建议把需求介绍也更新到顶楼吧,以便大家理解一致。
作者: tz_being    时间: 2018-12-21 13:57

回复  tz_being
    建议把需求介绍也更新到顶楼吧,以便大家理解一致。
Batcher 发表于 2018-12-21 12:50


谢谢提醒。
作者: tz_being    时间: 2018-12-24 08:26

回复 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,怎么读完整呢?


作者: xczxczxcz    时间: 2018-12-24 18:23

回复 9# tz_being

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

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

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

其实生成临时的 BAT文件更好。可以隐藏。执行完就删除。
作者: tz_being    时间: 2018-12-25 08:30

回复 10# xczxczxcz


    多谢指点。看来问题是无法解决了,这是由批处理的特点决定的。听说批处理是把全部代码读进内存,预先算好结果后再逐条执行,导致外来的代码只能以变量的形式参与进来,不能与主体代码融合一体。
作者: tz_being    时间: 2018-12-25 08:46

yhcfsr 发表于 2018-12-21 01:55
for /f "delims=" %%a in ('cscript -nologo -E:jscript "%~f0" "%TXT%"') do %%a



我想把输出文件%~f0改为d:\out.txt发现提取不出代码,麻烦帮看一下,因为不想把提取出的代码覆盖原文件。最好还能把输出文件设置成隐藏属性的。
作者: Batcher    时间: 2018-12-25 09:08

回复 11# tz_being


    你听说哪种脚本不是这样执行的
作者: yhcfsr    时间: 2018-12-25 13:04

回复 12# tz_being


自己不明白,还要瞎折腾.这里哪有什么输出文件?又哪有提取代码覆盖原文件?
你的这种加密方式本身就没有多少加密性可言,无非是掩耳盗铃罢了.
作者: tz_being    时间: 2018-12-25 13:27

回复 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文本当中,劳烦一下,不胜感激。
作者: yhcfsr    时间: 2018-12-25 13:50

回复 15# tz_being

我不太确定是否有修改过代码.不过现在的脚本并没有写文件的操作,应该不会修改源文件的内容才对.
如果有问题,看我签名联系我.




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2