声明:本文只做技术交流,不提供源码,如有侵权,请告知删除,谢谢。
知识点预热,用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)
上述代码的运行结果:
这样,你就学到了怎么用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=
从这里,一直扣到文件底部:
复制代码,先在 https://beautifier.io/ 这个网站美化下,注意勾选这个:
也可以用它的Python库来美化JS代码:
pip install jsbeautifier
将美化后的JS代码保存为JS文件,并用 UE打开:
开始分析这段代码:
var _$2 = function(_$s, _li, _oQo) {
var _li1Il = ['da', 't', 'aB', 6464];
var _oo = _li1Il[3];
return _li1Il[0] + _li1Il[1] + _li1Il[2];
};
代码里面大部分都是这种结构,就是先定义一个数组,然后从数组里面取值。
这时,我的想法就是 就是写个正则表达式将 这些数组全部找出来:
不过这都是字符串,如何变成 Python里的列表呢?
这时,就用上了 Python调用JS的功能,即将这每个数组名都 return 出来,然后再调用eval(见例子中的 use_eval),就可以得到了:
由于用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: {}
所以需要特殊处理下,我这里选择的是当 数组值为 {},不进行替换。当然也会有其他的情况,也需要特殊处理,这里我就不赘述了。
下面是我还原后的部分代码:
其实就是将一些数组还原成里面的值,这样的代码看着还是不那么清爽啊,如这个:
'use' + ' strict';
这不就是"use strict"么,以及这样的:
'__fwc' + ('i' + 'm') + ('Lo' + 'a' + ('d' + 'e')) + 'd'
这不就是 "__fwcimLoaded"么,这样我们还可以进一步美化,将这样的表达式全部 正则找出来,再进行替换,替换后的代码如下:
这样的代码看着明显清爽多啦。我们再试试搜索 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代码来处理?