Closed horsley closed 9 months ago
有两个问题需要修正:
经过调试定位,出错的上下文是这样的
代码逻辑看起来要把“函数体里面做加法操作的”的调用语句替换为加法的两个元素,但是本例里面还有入参,如果要处理需要把入参代入才行
function purifyFunction(path) {
const node = path.node
- if (!t.isIdentifier(node.left) || !t.isFunctionExpression(node.right)) {
+ if (
+ !t.isIdentifier(node.left) ||
+ !t.isFunctionExpression(node.right) ||
+ node.right.params.length != 0
+ ) {
return
}
const name = node.left.name
尝试这种修补可以绕过报错进行解密,但结果看起来还有一层eval
eval好解决,拿出来运行一下就行了,只是需要先删除里面的域名锁定代码。
domain-lock 是在 eval 的内部,我以为应该先解开eval呢 现在我明白了,解开eval过程就是执行eval,而eval的内容开头就是domain-lock导致无法执行下去
混淆顺序是 string -> eval -> sojson ,domain-lock是sojson阶段加的。
等你拿到eval里面的字符串会发现里面有一个decode函数,需要传入由html获得的string。
我核对了一下 domain-lock 的 template,完全是一样的,但这部分通过 ast 逐个节点判定不太可能,如果没有sojson的具体源码,那么针对这个case我觉得可以抽样 domain-lock 片段的几个特征点进行校验,如果确定有 domain-lock片段,整片去除,应该不影响其他地方
里面有4个array,分别用来查找document
,domain
,location
,hostname
这几个key是否存在。
目前这4个array是写死的,在commit javascript-obfuscator/javascript-obfuscator@8a81043dd3a63f1d835c268d864d732b06a266df (3年前)被引入,可以以此来判断。
此处我先给出样本,还在研究大佬的代码中,有结论也会在此处同步