musescore-downloader/src/anti-detection.ts

61 lines
1.4 KiB
TypeScript
Raw Normal View History

2020-11-05 21:36:24 +00:00
/* eslint-disable no-extend-native */
/* eslint-disable @typescript-eslint/ban-types */
/**
* make hooked methods "native"
*/
export const makeNative = (() => {
2020-11-05 22:18:43 +00:00
const l = new Set<Function>()
2020-11-05 21:36:24 +00:00
2020-11-05 21:54:07 +00:00
hookNative(Function.prototype, 'toString', (_toString) => {
return function () {
if (l.has(this)) {
// "function () {\n [native code]\n}"
return _toString.call(parseInt) as string
}
return _toString.call(this) as string
2020-11-05 21:36:24 +00:00
}
2020-11-05 21:54:07 +00:00
})
2020-11-05 21:36:24 +00:00
return (fn: Function) => {
l.add(fn)
}
})()
2020-11-05 21:47:50 +00:00
2020-11-05 21:54:07 +00:00
export function hookNative<T extends object, M extends (keyof T)> (
2020-11-05 21:47:50 +00:00
target: T,
method: M,
hook: (originalFn: T[M], detach: () => void) => T[M],
2020-11-05 21:54:07 +00:00
): void {
2020-11-05 21:47:50 +00:00
// reserve for future hook update
const _fn = target[method]
const detach = () => {
target[method] = _fn // detach
}
// This script can run before anything on the page,
// so setting this function to be non-configurable and non-writable is no use.
const hookedFn = hook(_fn, detach)
target[method] = hookedFn
2020-11-05 21:54:07 +00:00
setTimeout(() => {
makeNative(hookedFn as any)
})
2020-11-05 21:47:50 +00:00
}
2020-11-05 22:18:43 +00:00
export const hideFromArrFilter = (() => {
const l = new Set()
hookNative(Array.prototype, 'filter', (_filter) => {
return function (...args) {
const arr = _filter.apply(this, args)
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
return _filter.call(arr, (e) => !l.has(e))
}
})
return (item: any) => {
l.add(item)
}
})()