|
// ==UserScript== |
|
// @name Soraacg Killer |
|
// @version 1.1+plus |
|
// @description try to take over the disable-devtool |
|
// @author CyanChanges<contact@cyans.me> |
|
// @match *://*/* |
|
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== |
|
// @grant none |
|
// @run-at document-start |
|
// ==/UserScript== |
|
|
|
(function() { |
|
'use strict'; |
|
const codeSig = "me()}function z(e){var t=h();return e(),h()-t}function B(n,i){function e(t){return function(){n&&n();var e=t.apply(void 0,arguments);return i&&i(),e}}var t=window.alert,o=window.confirm,r=window.prompt;try{window.alert=e(t),window.confirm=e(o),window.prompt=e(r)}catch(e){}}var p={iframe:!1,pc:!1,qqBrowser:!1,firefox:!1,macos:!1,edge:!1,oldEdge:!1,ie:!1,iosChrome:!1,iosEdge:!1,chrome:!1,seoBot:!1,m" |
|
let disposables = [] |
|
let origDefine = undefined |
|
let defineHook |
|
function dispose() { |
|
disposables = disposables.splice(0).filter((dispose) => { |
|
dispose() |
|
}) |
|
} |
|
Object.defineProperty(window, 'DisableDevtool', {set(value) {throw "You can't use it disable devtools"}}) |
|
function addDefineHook(){ |
|
function removeDefineHook() { |
|
if (!origDefine) delete window.define |
|
else window.define = origDefine |
|
} |
|
console.debug("Killer[+] hook enabled!") |
|
defineHook = window.define = (t, ...args)=>{ |
|
if (typeof t === 'function') { |
|
if (t.toString().indexOf(codeSig) !== -1) { |
|
console.debug("fake define caught") |
|
var defineCaught = true |
|
window.define = undefined |
|
delete window.define |
|
return |
|
} |
|
t() |
|
} |
|
return removeDefineHook |
|
} |
|
window.define.amd = true // Make sure disable-devtool use this mocked define |
|
} |
|
new MutationObserver((_, observer) => { |
|
const { body } = document; |
|
if (!body) return; |
|
// Remove this observer, since it's not needed anymore; body exists |
|
observer.disconnect(); |
|
|
|
function lookFor(text) {return body.innerHTML.indexOf(text) !== -1} |
|
if (!lookFor("disable-devtool") && !lookFor("disable-devtool-auto")) dispose() |
|
disposables.push(addDefineHook()) |
|
}).observe(document.documentElement, { childList: true }); |
|
|
|
const detectorSig = 'function(){if(!(o.isSuspend||l||F())){var e,t,n=s($);try{for(n.s();!(e=n.n()).done;){var i=e.value;v(i.type),i.detect(G++)}}catch(e){n.e(e)}finally{n.f()}D(),"function"==typeof w.ondevtoolclose&&(t=d,!q()&&t&&w.ondevtoolclose())}}' |
|
const keyBlockerSig = "function(e){var t=(e=e||n.event).keyCode||e.which;if(t===a||c(e,t)||l(e,t))return ne(n,e)}" |
|
|
|
const realIntervaler = window.setInterval |
|
const realAddListener = window.addEventListener |
|
|
|
document.addEventListener('onload', function rollback(){ // Dispose side-effects after the disable-devtool has been removed |
|
const body = document.body |
|
function lookFor(text) {return body.innerHTML.indexOf(text) !== -1} |
|
if (!lookFor('disable-devtool') && !lookFor('disable-devtool-auto')) dispose() |
|
else { |
|
setTimeout(dispose, 500) |
|
} |
|
if (!rollback.timed) { |
|
rollback.timed = true |
|
setTimeout(rollback, 200) |
|
} |
|
}) |
|
function addFuncHooks() { |
|
window.setInterval = (...args)=>{ |
|
if (args[0].toString() == detectorSig) { |
|
console.debug("Detector took down!") |
|
window.setInterval = realIntervaler |
|
return -1 |
|
} |
|
return realIntervaler(...args) |
|
} |
|
window.addEventListener = (ev, handler)=>{ |
|
if (ev !== 'keydown') realAddListener(ev, handler) |
|
if (handler.toString() == keyBlockerSig) { |
|
console.debug("Key Listener took down!") |
|
window.addEventListener = realAddListener |
|
return |
|
} |
|
realAddListener(ev, handler) |
|
} |
|
return ()=>{ |
|
window.setInterval = realIntervaler |
|
window.addEventListener = realAddListener |
|
} |
|
} |
|
disposables.push(addFuncHooks()) |
|
function randomChar() { |
|
return btoa(String.fromCharCode.apply(null, window.crypto.getRandomValues(new Uint8Array(5)))) |
|
} |
|
const sign = randomChar() |
|
console.log("[killer] context signuature", sign) |
|
Object.defineProperty(window.document, `context${sign}`, {configurable: false, enumerable: false, value: new Proxy({ |
|
name: 'sorakiller', |
|
dispose, signuatures: {code: codeSig, detector: detectorSig, listener: keyBlockerSig} |
|
}, {})}) |
|
})(); |