前文
其实封包过明显更简单
但是我就是要补出来环境,嘿,就是玩
我要魔改出来一个自动答题过人脸的变态考试专版APP
实战目标
某起
开始
首先点击按钮提示
直接源代码里搜索一下
发现通过m.f判断
因为是webpack打包,往上找m
m来自ba39
直接打断往里追或者搜索ba39都可以
找到了函数,前方的n.d是webpack的环境定义头,直接忽略,发现m.f的f来自于i
我们继续找i
发现i来自763d
继续找763d
发现这个函数的f取决于变量d
而d在下方,默认为假,下方有两个赋值d的,一个是函数,一个是直接调用,我们先忽略函数,直接看调用的s
调用一下打个断点往里追
找到了
function s(e) {
var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}
, n = arguments.length > 2 ? arguments[2] : void 0;
o((function(i) {
i.callHandler(e, t, (function(e) {
var t = e;
if ("string" == typeof e)
try {
t = JSON.parse(e)
} catch (e) {}
n && n(t)
}
))
}
))
}
e是调用事件名,t是变量,n是回调函数
我们调用了o来回调执行函数,那我们去看看o
function o(e) {
if (window.WebViewJavascriptBridge)
e(window.WebViewJavascriptBridge);
else if (i()) {
if (window.WVJBCallbacks)
return window.WVJBCallbacks.push(e),
!1;
window.WVJBCallbacks = [e];
var t = document.createElement("iframe");
t.style.display = "none",
t.src = "wvjbscheme://__BRIDGE_LOADED__",
document.documentElement.appendChild(t),
setTimeout((function() {
document.documentElement.removeChild(t)
}
), 0)
} else
a() && document.addEventListener("WebViewJavascriptBridgeReady", (function() {
e(window.WebViewJavascriptBridge)
}
), !1)
}
这里可以看到在检测各种桥,我们来搞个最基本的
window.WebViewJavascriptBridge吧
调用e(window.WebViewJavascriptBridge);会把我们的函数传进去
去回调
i.callHandler(e, t, (function(e) {
var t = e;
if ("string" == typeof e)
try {
t = JSON.parse(e)
} catch (e) {}
n && n(t)
}
那我们就需要实现callHandler函数,检测是否是getRuntimeEnvironment
如果是的话就去回调第三个参数,第三个参数是个函数,接受一个e
我们应该传入一个对象
然后会对n传入这个对象
n则是
(function(e) {
d = "app" === e.platform
}
)
代表我们传入的对象必须包含platform,并且是app
开始
直接上油猴
window.WebViewJavascriptBridge = {
callHandler: (name, obj, callback) => {
xxxxx
防恶意利用删除代码
balabala
}
}
就会发现我们已经过了APP功能性检测
结语
撒花~