【澳门新葡亰平台官网】0之与COM对象交互,破解伪元素和混淆JS

 

$jsLines = Get-Content “FileSize.js”

 

Write-Host “Using Eval”

众所周知,函数是需要被调用才能运行的,那么入口呢,就很巧妙的隐藏在了这里

$vbsCode = [string]::Join(“`n”, $vbsLines)

 

$fileSize.GetFileSize($fileName)

这个就是调用上面的那些大部分的变量组成字典集

function GetFileSize(filePath)

 

End Function

基本就是这样,如果单纯的抓取页面元素后会是这样:

$fileName = (dir FileSize.vbs).FullName

 1         /// <summary>
 2         /// 格式化字符串
 3         /// </summary>
 4         /// <param name="str"></param>
 5         /// <param name="resultKey"></param>
 6         /// <param name="resultValue"></param>
 7         public void getStr(string str, ref string resultKey, ref string resultValue)
 8         {
 9             try
10             {
11                 if (str.IndexOf("var") > 0)
12                 {
13                     str = str.Substring(0, str.IndexOf("var"));
14                 }
15                 resultKey = str.Split(new string[] { "()" }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault().Replace("function", "").Trim();
16                 resultValue = JSHelper.ExecJs(str + " " + resultKey + "();").ToString();
17                 return;
18             }
19             catch (Exception ex)
20             {
21                throw;
22             }
23         }
24         public void getStr2(string str, ref string resultKey, ref string resultValue)
25         {
26             try
27             {
28                 string[] str2 = str.Replace("var", "").Replace("'", "").Trim().Split('=');
29                 resultKey = str2[0];
30                 resultValue = str2[1];
31             }
32             catch (Exception ex)
33             {
34                 throw ex;
35             }
36         }
37         public void getStr3(string str, ref string resultKey, ref string resultValue)
38         {
39             try
40             {//var AC_=function(){'AC_';var _A=function(){return '格';}; return _A();}
41                 string[] str2 = str.Replace("var", "").Trim().Split('=');
42                 resultKey = str2[0];
43                 if (str.Split(new string[] { "function" }, StringSplitOptions.None).Length > 2)
44                 {
45                     string str3 = Regex.Match(str, @"vars?SS_=s?functions?(S{0,5})s?{.*?return.*?}").Value;//取出赋值函数
46                     string str4 = str3.Substring(str3.IndexOf("return") + 6);
47                     string[] str5 = str4.Split(new string[] { "'" }, StringSplitOptions.None);
48                     resultValue = str5[1];
49                 }
50                 else
51                 {
52                     string str3 = str2[str2.Length - 1].Substring(str2[str2.Length - 1].LastIndexOf("return"));
53                     string[] str4 = str3.Split(''');
54                     resultValue = str4[1];
55                 }
56             }
57             catch (Exception ex)
58             {
59                 throw ex;
60             }
61         }    

$vbsCode = [string]::Join(“`n”, $vbsLines)

(其实笔者想过使用.net直接运行JS,后来发现他们这个JS是有错误的,并且(……)(document)这种形式使用MSScriptControl.ScriptControl和JScript都无法识别,只能硬着头皮分析了。。。如果有能识别这种JS,求留言推荐,十分感谢。)

下面创建一个名为“VBScriptEval.ps1”的脚本,通过调用VBScript代码定义的GetFileSize()函数,代码如下:

破解数据字典,其实就是模拟我们上面分析的JS解析过程,其中用到大量的正则分别处理不同格式的数据集

图3 执行结果

  1         /// <summary>
  2         /// 获取数据字典
  3         /// </summary>
  4         /// <param name="strAllHTML"></param>
  5         /// <param name="keyLink"></param>
  6         /// <param name="configpl"></param>
  7         /// <param name="optionpl"></param>
  8         public void GetAutoHomeDictionary(string strAllHTML, ref string[] keyLink, ref string[] configpl, ref string[] optionpl)
  9         {
 10             MatchCollection carInfoMatches = Regex.Matches(strAllHTML, "<script>((?:.|\n)*?)</script>");
 11             List<string> matcheslist = new List<string>();
 12             foreach (var item in carInfoMatches)
 13             {
 14                 if (item.ToString().IndexOf("try{document.") < 0 && item.ToString().Length > 500)
 15                 {
 16                     matcheslist.Add(item.ToString());
 17                 }
 18             }
 19             for (int i = 0; i < matcheslist.Count; i++)
 20             {
 21                 #region 生成文字集1
 22                 Dictionary<string, string> dc = new Dictionary<string, string>();
 23                 MatchCollection matchlist = Regex.Matches(matcheslist[i].Replace("})(document);</script>", " function"), @"functions(S){0,2}_()s*{.*?}.*?(?=function)");//取出function              
 24                 for ( int j = 0; j < matchlist.Count; j++)
 25                 {
 26                     string str1 = string.Empty, str2 = string.Empty;
 27                     getStr(matchlist[j].Value, ref str1, ref str2);
 28                     dc.Add(str1, str2);
 29                 }
 30                 try
 31                 {
 32                     MatchCollection matchlist2 = Regex.Matches(matcheslist[i], @"vars?SS_=s?'S*'");//取出赋值变量
 33                     for (int j = 0; j < matchlist2.Count; j++)
 34                     {
 35                         string str1 = string.Empty, str2 = string.Empty;
 36                         getStr2(matchlist2[j].Value, ref str1, ref str2);
 37                         dc.Add(str1, str2);
 38                     }
 39 
 40                     MatchCollection matchlist3 = Regex.Matches(matcheslist[i], @"vars?SS_=s?functions?()s?{.*?return.*?return.*?}");//取出赋值函数
 41                     for (int j = 0; j < matchlist3.Count; j++)
 42                     {
 43                         string str1 = string.Empty, str2 = string.Empty;
 44                         getStr3(matchlist3[j].Value, ref str1, ref str2);
 45                         dc.Add(str1, str2);
 46                     }
 47                 }
 48                 catch (Exception ex)
 49                 {
 50                     throw ex;
 51                 }
 52                 StringBuilder sb = new StringBuilder();
 53                 string str = Regex.Match(matcheslist[i], @"functions*$FillDicData$s*()s*?{.*?$RenderToHTML").Value;
 54                 string tmp2 = str.Substring(str.IndexOf("$GetWindow$()"), str.IndexOf("$rulePosList$") - str.IndexOf("$GetWindow$()"));
 55                 string tmp3 = tmp2.Substring(tmp2.IndexOf(']') + 1);
 56                 string[] tmp4 = tmp3.Split('+');
 57                 try
 58                 {
 59                     for (int j = 1; j < tmp4.Length - 1; j++)
 60                     {
 61                         //if (Regex.IsMatch(tmp4[j], @"[u4e00-u9fbb]{1,5}"))
 62                         //{
 63                         //    sb.Append(Regex.Match(tmp4[j], @"[u4e00-u9fbb]{1,5}").ToString());
 64                         //}
 65                         if (Regex.IsMatch(tmp4[j], @"(functions{0,3}(){.*?return.*?return.*?})"))
 66                         {
 67                             var strtmp = Regex.Match(tmp4[j], @"(functions{0,3}(){.*?return.*?return.*?})").Value;
 68                             var strtmp2 = Regex.Match(strtmp, "return.*?(.*?).*?return.*(.*?)").Value.Split(new string[] { "return" }, StringSplitOptions.RemoveEmptyEntries);
 69                             foreach (var item in strtmp2)
 70                             {
 71                                 if (item.Split(''').Length == 3) sb.Append(item.Split(''')[1].Replace("'", "").Trim());
 72                             }
 73                         }
 74                         else if (Regex.IsMatch(tmp4[j], @"('([A-Z]|[a-z]|[0-9]|[,]|[']|[;]|[u4e00-u9fbb]){1,10}')"))
 75                         {
 76                             sb.Append(Regex.Match(tmp4[j], @"('([A-Z]|[a-z]|[0-9]|[,]|[']|[;]|[u4e00-u9fbb]){1,10}(?='))").ToString().Substring(2));
 77                         }
 78                         else if (Regex.IsMatch(tmp4[j], @"()"))
 79                         {
 80                             sb.Append(dc[tmp4[j].Replace("()", "")]);
 81                         }
 82                         else if (Regex.IsMatch(tmp4[j], @"'([A-Z]|[a-z]|[0-9]|[,]|[']|[;]|[u4e00-u9fbb]){1,10}'(?!))"))
 83                         {
 84                             sb.Append(Regex.Match(tmp4[j], @"'([A-Z]|[a-z]|[0-9]|[,]|[']|[;]|[u4e00-u9fbb]){1,10}'").ToString().Replace("'",""));
 85                         }
 86                         else if (Regex.IsMatch(tmp4[j], @"S{3}"))
 87                         {
 88                             sb.Append(dc[tmp4[j]]);
 89                         }
 90                         else
 91                         {
 92                             sb.Append("X");
 93                         }
 94                     }
 95                 }
 96                 catch (Exception ex)
 97                 {
 98                     throw;
 99                 }
100                 #endregion                
101 
102                 #region 取下标
103                 string tmp11 = str.Substring(str.IndexOf("$rulePosList$"));
104                 string tmp12 = tmp11.Substring(0, tmp11.IndexOf("$SystemFunction2$"));
105                 StringBuilder sb2 = new StringBuilder();
106                 string[] tmp13 = tmp12.Split('+');
107                 try
108                 {
109                     tmp13[tmp13.Length - 1] = tmp13[tmp13.Length - 1].Replace("),", "");
110                     for (int j = 1; j < tmp13.Length; j++)
111                     {
112                         if (Regex.IsMatch(tmp13[j], @"('([A-Z]|[a-z]|[0-9]|[,]|[']|[;]|[u4e00-u9fbb]){1,10}')"))
113                         {
114                             sb2.Append(Regex.Match(tmp13[j], @"('([A-Z]|[a-z]|[0-9]|[,]|[']|[;]|[u4e00-u9fbb]){1,10}(?='))").ToString().Substring(2));
115                         }
116                         else if (Regex.IsMatch(tmp13[j], @"returns{0,2}'([0-9]|[,]|[;]){1,10}'"))
117                         {
118                             var tmp = Regex.Match(tmp13[j], @"returns{0,2}'([0-9]|[,]|[;]){1,10}'").Value.ToLower().Replace("return", "").Replace("'", "").Trim();
119                             sb2.Append(tmp);
120                         }
121                         else if (Regex.IsMatch(tmp13[j], @"()"))
122                         {
123                             tmp13[j] = tmp13[j].Substring(0, tmp13[j].IndexOf("()") + 2);
124                             sb2.Append(dc[tmp13[j].Replace("()", "")]);
125                         }
126                         else if (Regex.IsMatch(tmp13[j], @"S{3}") && tmp13[j].IndexOf("'") < 0)
127                         {
128                             sb2.Append(dc[tmp13[j]]);
129                         }
130                         else if (tmp13[j].Split(new string[] { "'" }, StringSplitOptions.None).Length > 2)
131                         {
132                             sb2.Append(tmp13[j].Replace("'", "").Trim());
133                         }
134                         else if (tmp13[j].Trim() == "''")
135                         {
136                             continue;
137                         }
138                         else
139                         {
140                             sb2.Append("X");
141                         }
142                     }
143                 }
144                 catch (Exception ex)
145                 {
146                     throw;
147                 }
148 
149                 #endregion
150 
151                 #region 生成字典
152                 List<string> list = new List<string>();
153                 try
154                 {
155                     foreach (var item in sb2.ToString().Split(';'))
156                     {
157                         var numlist = item.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
158                         StringBuilder sbresult = new StringBuilder();
159                         foreach (var num in numlist)
160                         {
161                             var tmpstr = sb.ToString()[Cvt.ToInt32(num)];
162                             sbresult.Append(tmpstr);
163                         }
164                         list.Add(sbresult.ToString());
165                     }
166                 }
167                 catch (Exception e)
168                 {
169 
170                     throw;
171                 }
172 
173                 #endregion
174 
175                 if (i == 0) keyLink = list.ToArray();
176                 else if (i == 1) configpl = list.ToArray();
177                 else if (i == 2) optionpl = list.ToArray();
178             }
179         }

$vbscript.AddCode($vbsCode)

如上图所示,里面有好多函数和变量,里面会返回一段文字或者符号,这些零零散散的文字将被组成一个完成数据字典库,

$vbscript.Language = “VBScript”

 var lI_ = function() {
     'return lI_';
     return '3;7';
 };

$jscript.Language = “JScript”

紧接着下面的这个方法就是获取下标集合

$fileSize = $jscript.CodeObject

 接着会跳到这个函数

图4 执行结果

 1 using Microsoft.JScript;
 2 using Microsoft.JScript.Vsa;
 3 using System;
 4 using System.CodeDom.Compiler;
 5 using System.Collections.Generic;
 6 using System.Linq;
 7 using System.Reflection;
 8 using System.Text;
 9 using System.Threading.Tasks;
10 
11 namespace library
12 {
13     public static class JSHelper
14     {
15         static VsaEngine Engine = VsaEngine.CreateEngine();
16         public static object ExecJs(string str)
17         {
18             return EvalJScript(str);
19         }
20         public static object EvalJScript(string JScript)
21         {
22             object Result = null;
23             try
24             {
25                 Result = Microsoft.JScript.Eval.JScriptEvaluate(JScript, Engine);
26             }
27             catch (Exception ex)
28             {
29                 return ex.Message;
30             }
31             return Result;
32 
33         }
34     }
35 }

2 在MSScriptControl中公开对象

  function hw_() {
      function _h() {
          return 'hw_';
      };
      if (_h() == 'hw__') {
          return _h();
      } else {
          return 're';
      }
  }

var fileSystem = new ActiveXObject(“Scripting.FileSystemObject”);

如有不明或更好的建议,欢迎留言交流。

$fileName = (dir FileSize.js).FullName

澳门新葡亰平台官网 1

 

 

在将脚本代码包含在脚本控件中后,即可调用在Jscript中定义的函数,为此可以使用Eval()或者Run()方法。Eval()方法将字符串作为输入并执行,其返回值将会把结果返回给调用方,本实例为PowerShell;Run()方法可以接受多个参数,其中第1个是函数名,后续是将要传递给函数的参数,该方法返回函数的返回值给PowerShell的脚本。在这里创建一个名为“JScriptEval.ps1”的脚本,分别使用Eval()和Run()调用Jscript函数,代码如下:

 

$jscript = New-Object -COM MSScriptControl.ScriptControl

获取数据字典,模拟了刚才分析的JS

图1 执行结果

** 温馨提示:如需转载本文,请注明内容出处。**

这个脚本与前面Jscript版本的最大不同是创建脚本控件对象的Language属性值。需要强调的一点是在VBScript脚本中调用Eval()方法时,不需要转义反斜杠字符,因其在VBScript中并不包含特殊含义。该脚本的执行结果如图2所示。

分析到这里了,后面也就不难了,不再详细说明,如有不明白的,可以留言给我。

图2 执行结果

澳门新葡亰平台官网 2

$jscript.AddCode($jsCode)

 其他的没什么用,第五个可能是什么运动套装之类的,豪车才有,没仔细看。

$jsCode = [string]::Join(“`n”, $jsLines)

这个JS是被混淆过的,不可以根据变量名去获取。

网络中存在大量由VBScript和Jscript或者其他Windows脚本宿主相关的语言编写的代码,其中相当一部分用对应语言实现很简短,而且有部分代码甚至不能转换为PowerShell代码。丢弃所有这些代码并且完全使用PowerShell重写很不明智,因此需要在PowerShell中有一种重用Jscript和VBScript脚本的代码方法。

 

Write-Host “Using Eval”

5.解析被混淆的JS,格式化后可以得到这样的一串JS

Eval()和Run()方法的执行结果相同,使用Run()方法可避免很多不必要的麻烦。

 

Set fileSystem = CreateObject(“Scripting.FileSystemObject”)

(PS小妙招:将网页保存本地后发现文字依旧显示,然后大面积删除JS后刷新页面,如果文字依旧显示,继续删,直到找到加载数据的JS为止)

$vbsLines = Get-Content “FileSize.vbs”

澳门新葡亰平台官网 3

其中将Language属性设置为“JScript”,表示其后调用的所有代码都是Jscript。接下来用Get-Content
cmdlet获取FileSize.js文件中包含的所有内容,然后为各行代码添加换行符,并将其拼接后传递给AddCode()方法。

澳门新葡亰平台官网 4

$vbscript.Run(“GetFileSize”, $fileName)

澳门新葡亰平台官网 5澳门新葡亰平台官网 6

$jscript.Language = “JScript”

 

PowerShell为COM对象提供了近乎完美的支持,本文的实例涉及主要的交互性操作,如使用集合和索引属性。只要不同的应用程序和服务已经具有公开的COM自动化接口,则可尝试使用COM来提高工作效率。本文介绍了针对Windows脚本宿主的自动化编程,用户可以通过以上的介绍扩展到对其他COM对象进行操作。

3.解密JS在这里澳门新葡亰平台官网 7

$jsLines = Get-Content “FileSize.js”

替换伪元素的整个JS

$vbscript.AddCode($vbsCode)

网站地址:

1 执行代码

本文链接:https://www.cnblogs.com/grom/p/9242156.html 

VBScript脚本的代码如下:

2.配置项数据在页面上

Write-Host “Using Run”

  通过函数为变量赋值的,值等于return后面的字符串,如

能够看到每种语言都有其相对特殊的函数声明方法、变量,以及与COM对象操作的方法。为了能够从PowerShell中调用Jscript函数,需要读取FileSize.js文件内容并且传递给脚本空间的AddCode()方法。这个方法将会执行函数定义,并使其在后面可用。

 

$vbscript.Language = “VBScript”

提供一个完整的JS,有兴趣的小伙伴可以去研究研究

Eval()方法需要将双引号转义为Jscript字符串,把反斜杠替换为双反斜杠。因为反斜杠在Jscript中是一个有特殊含义的转义字符,需要被转义;Run()方法不需要执行任何转义操作,因为使用的是脚本控件的机制传递参数。图1所示为该脚本的执行结果。

这个方法实现根据坐标集取得字典
,注意这个方法是不混淆的!可以直接搜索方法名找到。

Dim file

发表评论

电子邮件地址不会被公开。 必填项已用*标注