以下内容仅作为技术讨论使用,务商业使用。
在查看梦幻藏宝阁的时,像了解下对于数据的展示,这种平台是如何操作,于是对网页数据进行了分析,以下是分析出数据的方法。
对于一些敏感数据,网站就需要对其进行混淆,增加爬虫的成本。
例如网页https://xyq.cbg.163.com/equip?s=212&eid=201908132100113-212-AQYRMWM0DU8U&o&equip_refer=58
分析其返回的response,发现返回值并没有直接赋值上去。
1 | <tr> |
由pet对象来获取,则在网页中查找这个对象
1 | <% |
继续查找pet_attrs
1 | var pet_desc = parse_desc_info($("equip_desc_" + el.getAttribute("data_equipid")).value); |
这串代码中,根据equip_desc_查到到了这个网页的主要信息内容。
1 | <textarea id="equip_desc_value" style="display:none"> |
过程有些顺利
接下来在解析角色时,发现equip_desc_value的value值并没有直接体现出来。
如:https://xyq.cbg.163.com/equip?s=579&eid=201907212200113-579-5ZF1WK0H3GFP&equip_refer=26&view_loc=reco_left
1 | <textarea id="equip_desc_value" style="display:none"><textarea id="equip_desc_value" style="display:none">@VB38(因内容太多,此处省略)DAxOSJ9@</textarea> |
继续追本溯源查找equip_desc_value,查找到以下代码
1 | var role_info = js_eval(lpc_2_js(get_equip_desc('equip_desc_value'))); |
通过打断点的方式发现get_equip_desc方法为解析加密的内容的核心方法。(lpc_2_js是将字符串转为对象字符串的方法,并不是核心方法)
继续往下查找get_equip_desc方法
1 | function get_equip_desc(elemId) { |
好吧,继续查看decode_desc方法,看到这种代码,终于进入主题了。
1 | !function(_0xcbc80b) { |
对此先将方法去混淆.刚开始看到 _0x1c0cdf[_0x3a8e(‘0x1’)](0x0, _0x33c80e) 这种写法我还懵圈了老半天,这是种什么写法。后来在去混淆的过程中发现 _0x3a8e(‘0x1’) 的值是substring,这不就是方法名吗,然后意识到,这不就是js调用方法的另一种写法吗 ,只是很久不用这种写法第一眼没有认出来。
1 | function decode_desc(ciphertext) { |
至此提供一个完整版js解密代码
1 | function decodeObject(){ |
另外附上依照此js写的java版本(仅核心代码,其他缺失部分可以自己手动填加)
1 | private static String decodeStr(String ciphertext) throws UnsupportedEncodingException, ScriptException { |