固定的JS代码保存到本地分析后,经过格式化或AST还原或其他Hook操作,再替换回去,可能会存在报错,大概率就是JS逻辑中存在代码结构检测,导致某些地方的值不对了,或者走了不正确的分支逻辑。
将修改后的JS替换回去后,重新请求以执行JS,会发现出现了以下错误

为了更清楚的知道其内部的处理逻辑(也算是积累相关的经验),这里不使用hook等方式来分析代码结构检测,直接跟着异常堆栈进去看一下具体逻辑

这里T3是undefined,追一下T3是哪里定义的,这里刚好就在前几行
这里t2[M2()["Km"].apply(null, [2, 428, 32])]和t2[tg()["Km"].apply(null, [0, jM(33)])]算出来的都是undefined
再往前几行看到var E4 = Hm[1];,这里Hm是当前所在函数的入参,跟踪发现是个定值,也就是E4这里恒为false,那只要分析t2[tg()["Km"].apply(null, [0, jM(33)])];就可以了
看一下t2,其就是window,也就是说window中没有tg()["Km"].apply(null, [0, jM(33)])算出来的属性
因为后面的参数都是固定的,所以接着看一下tg()["Km"]这个函数干了什么

进lM

进HH

走case 22分支,这里的分支选择也对应上了刚才的那几个结论分析

E9是入参,fX和W2函数是运算操作不用管,看下v9干了啥

直接返回了之前步骤算出来的rg,那就看一下rg怎么算出来的
先看下B3

M2()["Hg"]是一个函数,这里相当于对这个函数进行toString(),B3就在这个函数的函数体里,其实这里大概也能猜到B3整体的逻辑就和代码结构有关。
接着看A3

Cz算出来的是个定值,Y9的逻辑如下
就是在找M2()["Hg"]函数字符串中0xece2744的位置,代码结构的改变会导致位置算出来不一样。
A3就分析完了,接着看d2

结合上面Y9的分析,这里的逻辑就是从Y9算出来的位置开始去找;的位置,代码结构的改变也会导致位置算出来不一样。
M函数的逻辑如下
就是取字符串片段,这里就是取M2()["Hg"]函数字符串的片段,代码结构的改变会导致取出来的片段不一样。
v9中的B3就分析完了,接着看Bm

跟着代码看一下lx的逻辑
分析可知lx就是从M2()["Hg"]函数的字符串中取了两个代码片段,再加上typeof t2[M2()["Hg"].name],这里就是undefined,总体也会因为代码结构变化而变化
接着看P3

F的逻辑如下,其中this对应m2
这里面的逻辑有点绕,大概知道其中会改变m2中jp的值即可,P3的输出也和此有关
到这里v9中的rg的生成过程就分析完了,可以发现其中有很多涉及代码结构的逻辑,代码结构的改变导致rg是个错误的值,所以我们只要得到未修改过的JS里rg的值,然后在v9中写死即可,这个点改完之后可以发现代码不再报错,最终跑出来的结果也是可用的,那后面的case 22的逻辑就可以不用管了。
据此分析过程也可以大概知道大多数代码结构检测都是围绕一个或多个关键函数的字符串来做文章,可以尝试hook函数的toString方法快速定位检测点。
var T3 = E4 ? t2[M2()["Km"].apply(null, [2, 428, 32])] : t2[tg()["Km"].apply(null, [0, jM(33)])];
var T3 = E4 ? t2[M2()["Km"].apply(null, [2, 428, 32])] : t2[tg()["Km"].apply(null, [0, jM(33)])];
function pI(a, b, c) {
return a.indexOf(b, c);
}
function Y9() {
return pI(`${M2()["Hg"]}`, "0xece2744");
}
function pI(a, b, c) {
return a.indexOf(b, c);
}
function Y9() {
return pI(`${M2()["Hg"]}`, "0xece2744");
}
function M(a, b, c) {
return a.substr(b, c);
}
function M(a, b, c) {
return a.substr(b, c);
}
function nm() {
return M(`${M2()["Hg"]}`, 0, Y9());
}
function Sz() {
return M(`${M2()["Hg"]}`, d2() + 1);
}
function lx() {
return nm() + Sz() + typeof t2[M2()["Hg"].name];
}
function nm() {
return M(`${M2()["Hg"]}`, 0, Y9());
}
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!