Board logo

标题: [原创代码] js静态解密批处理变量加花v0.1 [打印本页]

作者: CrLf    时间: 2015-4-27 05:00     标题: js静态解密批处理变量加花v0.1

本帖最后由 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. }
复制代码





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