爬虫入门之查找JS入口篇(九) ---补充

声明:本文只做技术交流,不提供源码,如有侵权,请告知删除,谢谢。

知识点预热,用Python调用JS:

import execjs	

	
def use_eval():	
    jscode = "return 5;"	

	
    ejs = execjs.compile(jscode)	

	
    value = ejs.eval('')	

	
    return value	

	
def use_func(a,b):	
    jscode = """	
         function add(a,b){	
             return a+b;	
         }	
    """	
    ejs = execjs.compile(jscode)	
    value = ejs.call("add",a,b)	

	
    return value	

	
if __name__ == "__main__":	
    value = use_eval()	
    print ("Use eval:", value)	

	
    value = use_func(5,6)	
    print ("Use function:", value)

上述代码的运行结果:

640?wx_fmt=png

这样,你就学到了怎么用Python调用JS的方法。

预热过后我们试着把 混淆的代码进行部分还原试试。

依然打开这个网站,然后找到混淆的代码:

https://www.amazon.cn/ap/signin?_encoding=UTF8&ignoreAuthState=1&openid.assoc_handle=cnflex&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.pape.max_auth_age=0&openid.return_to=https%3A%2F%2Fwww.amazon.cn%2F%3Fref_%3Dnav_ya_signin&switch_account=

从这里,一直扣到文件底部:

640?wx_fmt=png

复制代码,先在 https://beautifier.io/  这个网站美化下,注意勾选这个:

640?wx_fmt=png

也可以用它的Python库来美化JS代码:

pip install jsbeautifier

将美化后的JS代码保存为JS文件,并用 UE打开:

640?wx_fmt=png

开始分析这段代码:

var _$2 = function(_$s, _li, _oQo) {	
        var _li1Il = ['da', 't', 'aB', 6464];	
        var _oo = _li1Il[3];	
        return _li1Il[0] + _li1Il[1] + _li1Il[2];	
    };

代码里面大部分都是这种结构,就是先定义一个数组,然后从数组里面取值。

这时,我的想法就是 就是写个正则表达式将 这些数组全部找出来:

640?wx_fmt=png

不过这都是字符串,如何变成 Python里的列表呢?

这时,就用上了 Python调用JS的功能,即将这每个数组名都 return 出来,然后再调用eval(见例子中的 use_eval),就可以得到了:

640?wx_fmt=png

由于用IDLE运行,每调用一次JS,就会弹出一个黑色的命令框,所以我换成VSCODE了。

这些数组返回了,成了Python里的列表,这时,我们可以将列表里的值进行全局替换,例如将 _li1Il[0] 替换为 'da',

jscode = jscode.replace(f"{arr}[{i}]",value)

注意:由于Pthon调用JS,当数组里面有正则表达式时,正则表达式被替换成了 {},如下:

def use_eval():	
    jscode = "return /abc/g;"	

	
    ejs = execjs.compile(jscode)	

	
    value = ejs.eval('')	

	
    return value

返回结果:

Use eval: {}

所以需要特殊处理下,我这里选择的是当 数组值为 {},不进行替换。当然也会有其他的情况,也需要特殊处理,这里我就不赘述了。

下面是我还原后的部分代码:

640?wx_fmt=png

其实就是将一些数组还原成里面的值,这样的代码看着还是不那么清爽啊,如这个:

'use' + ' strict';

这不就是"use strict"么,以及这样的:

'__fwc' + ('i' + 'm') + ('Lo' + 'a' + ('d' + 'e')) + 'd'

这不就是 "__fwcimLoaded"么,这样我们还可以进一步美化,将这样的表达式全部 正则找出来,再进行替换,替换后的代码如下:

640?wx_fmt=png

这样的代码看着明显清爽多啦。我们再试试搜索 base64看看,第一个在这里:

return _O0QO + ':' + _lli11['encodeBase64'](_SzZ$(_lli11['encodeObject'](_lllLlL), _0o0QO));

我们再看看这个 _O0QO 这个是啥:

var _O0QO = 'ECdITeCs';

这时的你想必已经有9分把握相信 这个return语句就是加密返回的位置。找到位置是不是非常的快?

就算不知道搜索 base64,也可以直接搜索:"ECdITeCs",因为经过抓包分析,metadata1参数,冒号前面的这个值都是固定的,肯定会想着去搜索。

或者,你想着它可能有自定义的base64编码函数,肯定有码表,直接搜索"ABCD"也是可以的:

var _LllL = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

就直接定位到了编码函数,就想上篇文章在编码函数打上断点跟踪堆栈,也能找到加密的地方。

总之,稍微还原下,JS代码更清晰,更有利于我们分析,毕竟,看着一大坨数组,也不知道是干嘛的,头发掉的比较多。

嗯,发际线又后移了一点,求防脱发秘诀。

用Python来还原部分JS代码,想想觉得别扭,那直接写JS代码来处理?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flybirding10011

谢谢支持啊999

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值