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

[原创代码] js静态解密批处理变量加花v0.1

[复制链接]
发表于 2015-4-27 05:00:51 | 显示全部楼层 |阅读模式
本帖最后由 CrLf 于 2015-4-27 20:58 编辑

碰到变量加花的加密批处理是一件很蛋疼的事情,手工解密费时费力,用预处理来解密又不能对代码中的 set 随机应变
现有的做法基本都是利用预处理来解析,其实之前也写过(嗯,代码在这儿),本来想写个加强版的 bat,后来觉得预处理易,解析 set 难...
考虑到日后改写 js 版 cmd 的可能性(就像联盟的那个在线 cmd——我是懒得搞的,不过如果有人要做,代码可以随便取用不客气),索性用 js 实现
写了个框架,基本实现了初步的语法解析,能够判断代码块、&&、||、句柄、内部命令名称、读写变量
函数名应该比较直观了,大概看一下带注释的主体内容(10~45行)也就知道怎么用了,再不懂就问我

本脚本的优势:
1、静态解析,可尝试解密安全性不确定的加密脚本
2、能解析出脚本中的 set 命令,并更新环境变量
3、支持代码块

目前的已知缺陷有:
1、静态解密天生的硬伤,因流程控制语句的结果不确定,所以无法预知脚本的执行顺序
2、目前只实现了 set 命令的基础语法,尚不能处理 set 命令的 /a、prompt、path 以及其他可改变环境变量的命令
3、还未添加对动态环境变量的支持,不过对解密的影响好像不大
4、对 if 命令的兼容性很差

加密.txt 的内容可以参照以下几贴:
http://www.bathome.net/thread-27912-1-1.html(此例效果最好,因为加密时未使用系统变量,比较恒定)
http://www.bathome.net/thread-35380-1-1.html(此例使用系统变量加密,可能因环境不同而无法执行)
http://www.bathome.net/thread-17490-1-1.html(同上)
  1. 1>1/* :
  2. @echo off
  3. cscript -nologo -e:jscript "%~0" <解密.txt | more
  4. pause & exit /b
  5. */

  6. var undefined = void 0
  7. var arrCodeBlock = []

  8. while(!WScript.StdIn.AtEndOfStream){
  9.         var line_base = WScript.StdIn.ReadLine()
  10.         //循环读取一行

  11.         var line_analyze = analyze_ExpandString(line_base)
  12.         //对该行中的 % 进行扩展

  13.         arrCodeBlock.push(line_analyze)
  14.         //“压栈”到代码块数组

  15.         if(!test_AtEndOfCodeBlock&&!WScript.StdIn.AtEndOfStream)continue
  16.         //若测试发现代码块未结束则继续读取下一行

  17.         var text_CodeBlock = arrCodeBlock.join('\n')
  18.         //连接代码块数组

  19.         WSH.Echo(text_CodeBlock)
  20.         //输出代码块

  21.         var text_CodeBlock = analyze_CleanCrLf(text_CodeBlock)
  22.         //行格式化

  23.         var split_CodeBlock = analyze_Split(text_CodeBlock)
  24.         //根据 | 和 & 拆分代码块为多条命令

  25.         for(var i=0;i<split_CodeBlock.length;i++){
  26.                 split_CodeBlock[i] = analyze_Handle(split_CodeBlock[i])
  27.                 //解析一条语句中的句柄

  28.                 split_CodeBlock[i] = analyze_Command(split_CodeBlock[i])
  29.                 //解析一条语句中的命令
  30.         }

  31.         arrCodeBlock = []
  32.         //清空代码块
  33. }



  34. function test_AtEndOfCodeBlock(strText){
  35.         var tmpText = strText
  36.                 .replace(/[<>&|]/g,' ')
  37.                 .replace(/\^[\s\S]|"[^"\n]*"|[^()]\(|\)[^()]/g,' ')
  38.                 .replace(/[^()]+/g,'')

  39.         while(/\(\)/.test(tmpText)){
  40.                 tmpText=tmpText.replace(/\(\)/g,'')
  41.         }

  42.         return tmpText.length == 0
  43. }



  44. function analyze_CleanCrLf(strText){
  45.         return strText
  46.                 .replace(/\r\n/g,'\n')
  47.                 .replace(/\^\n/g,'')
  48. }

  49. function analyze_ExpandString(strText){
  50.         return strText
  51.                 .replace(
  52.                         /%([0-9])|%:|%[^%]*%|%$/g,
  53.                         function(strText,intArgv){
  54.                                 if(strText==='%')return ''

  55.                                 if(strText==='%%')return strText

  56.                                 if(strText==='%:')return ':'

  57.                                 if(intArgv !== undefined)return strText //return WScript.Arguments.length>intArgv ? WScript.Arguments(intArgv) : ''

  58.                                 return analyze_Variable(strText.replace(/%/g,''))
  59.                         }
  60.                 )
  61. }

  62. function analyze_Variable(strText){

  63.         var match = strText.match(/([^:]+)(?::(.*))?/)
  64.         var variableName = match[1]
  65.         var variableCode = match[2] ? match[2] : ''

  66.         var ws = new ActiveXObject("Wscript.Shell")
  67.         var variableValue = ws.ExpandEnvironmentStrings('%'+variableName+'%')

  68.         if(!variableCode)return variableValue
  69.         //扩展普通变量

  70.         var match = variableCode.match(/^~\s*(-?0x[0-9a-f]+|-?[0-9]+)?,?\s*(-?0x[0-9a-f]+|-?[0-9]+)?$/i)
  71.         if(match){
  72.                 var splitStart = match[1] ? match[1]*1 : 0
  73.                 var splitLength = match[2] ? match[2]*1 : 8191 - variableName.length

  74.                 return cut(variableValue,splitStart,splitLength)
  75.         }
  76.         //扩展变量截取

  77.         var match = variableCode.match(/^([^=]+)=?(\*)?([s\S]+)?$/)
  78.         if(match){
  79.                 var replaceFrom = match[1].replace(/\W/g,'\\$&')
  80.                 var replaceHead = !!match[2]
  81.                 var replaceTo = match[3] ? match[3].replace(/\$/g,'$$$$') : ''

  82.                 if(replaceHead){
  83.                         return variableValue.replace(new RegExp('^.*?'+replaceFrom,'i'),replaceTo)
  84.                 } else {
  85.                         return variableValue.replace(new RegExp(replaceFrom,'ig'),replaceTo)
  86.                 }
  87.         }
  88.         //扩展变量替换

  89.         return strText

  90.         function cut(strText,intStart,intLength){
  91.                 if(intStart<0){
  92.                         variableValue = variableValue.substr(variableValue.length - -intStart)
  93.                 } else {
  94.                         variableValue = variableValue.substr(intStart)
  95.                 }

  96.                 if(intLength<0){
  97.                         return variableValue.substring(0,-intLength)
  98.                 } else {
  99.                         return variableValue.substr(0,intLength)
  100.                 }
  101.         }

  102. }


  103. function analyze_Split(strText){
  104.         var retArr = []
  105.         var strText = strText.replace(
  106.                         /(^|&&?|\|\|?)?[\(\s]*([^\^"&|]*(?:"[^"]*(?:"|$))*[^\^"&|]*)?[\s\)]*/mg,
  107.                         function(strMatch,strSpecial,strCommand){
  108.                                 retArr.push({strSpecial:strSpecial,strCommand:strCommand})
  109.                         }
  110.                 )
  111.         return retArr
  112. }


  113. function analyze_Handle(objCommand){
  114.         var tmpArr = []
  115.         var strCommand = objCommand.strCommand.replace(
  116.                         /"[^"]*"|\^[<>]|([0-9]?)(&?[<>]|\>\>)([^\^"\s&|<>]*(?:"[^"]*(?:"|$))*[^\^"\s&|<>]*)?/mg,
  117.                         function(strMatch,intHandle,strSpecial,strTarget){
  118.                                 intHandle = intHandle?intHandle:''
  119.                                 strTarget = strTarget?strTarget:''
  120.                                 if(strSpecial){
  121.                                         tmpArr.push(' '+intHandle+strSpecial+strTarget)
  122.                                         return ''
  123.                                 } else {
  124.                                         return strMatch
  125.                                 }
  126.                         }
  127.                 )
  128.         return {Command:strCommand,Handle:tmpArr}
  129. }


  130. function analyze_Command(objCommand){
  131.         var RegExp_command = /^\s*(ASSOC|BREAK|CALL|CD|CHDIR|CLS|COLOR|COPY|DEL|ENDLOCAL|ERASE|EXIT|FOR|FTYPE|GOTO|GRAFTABL|IF|MD|MKLINK|MOVE|PATH|PAUSE|POPD|PROMPT|PUSHD|RD|REM|REN|SET|SETLOCAL|SHIFT|START|TIME|TITLE|TYPE|VER|VERIFY|VOL)(?:([ \t,;=]*|$)(.*))?$/mi

  132.         var match = objCommand.Command.match(RegExp_command)
  133.         if(match){
  134.                 objCommand.commandName = match[1]
  135.                 objCommand.spaceChar = match[2] ? match[2] : ''
  136.                 objCommand.commandValue = match[3] ? match[3] : ''

  137.                 if(objCommand.commandName.toUpperCase()==='SET'){
  138.                         Command_SET(objCommand.commandValue)
  139.                 }
  140.         }

  141.         return objCommand
  142. }


  143. function Command_SET(strText){
  144.         strText = strText.replace(/^"(.*)"?$/,'$1')

  145.         var match = strText.match(/^\s*([^=]+)=?([^\^"&|]*(?:"[^"]*(?:"|$))*[^\^"&|]*)?\s*/)
  146.         if(match){
  147.                 var variableName = match[1]
  148.                 var variableCode = match[2] ? match[2] : ''

  149.                 var ws = new ActiveXObject("Wscript.Shell")
  150.                 ws.Environment("Process")(variableName) = variableCode

  151.         }
  152. }
复制代码

评分

参与人数 1技术 +1 收起 理由
bailong360 + 1 强悍

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 01:36 , Processed in 0.018498 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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