JS 有什么手段可以判断一个函数是不是原生代码吗?

2021-05-08 16:22:07 +08:00
 xieqiqiang00

比如 XMLHttpRequest,有没有什么手段可以知道这个东西有没有被人为重写?
网站找了不少方法都做不到
下面是我做的一些尝试,这些检测方法都能被绕过

{
    function isNative(api) {
        return /native code/.test(api.toString()) && typeof api !== 'undefined'
    }

    let test = function (input, fake) {
        console.log("------------------------")
        console.log("是否是伪造:", fake)
        console.log("toString:", input.toString())
        console.log("toString.toString:", input.toString)
        console.log("prototype 方法", input.hasOwnProperty("prototype"))
        console.log("toString.call","方法",Function.prototype.toString.call(input))
        console.log("网传最不靠谱方法:isNative", isNative(input))
    }
    test(XMLHttpRequest, false)
    {
        let XMLHttpRequest = function () {
            "[native code]"
        }
        XMLHttpRequest.toString = function () {
            return "function XMLHttpRequest() { [native code] }"
        }
        let toString = function () {
            return "function toString() { [native code] }"
        }
        toString.toString = toString
        XMLHttpRequest.toString.toString = toString
        Function.prototype.toString = toString
        delete XMLHttpRequest.prototype
        test(XMLHttpRequest, true)
        // XMLHttpRequest.prototype = undefined
        // test(XMLHttpRequest, true)
    }
}
5803 次点击
所在节点    JavaScript
80 条回复
JK9993
2021-05-08 17:05:15 +08:00
Function.prototype.toString.call
JK9993
2021-05-08 17:05:53 +08:00
哦,不行
JK9993
2021-05-08 17:07:39 +08:00
如果原型链上的 toString 被修改了,就只能检测到 toString 被修改这一步了
xieqiqiang00
2021-05-08 17:08:29 +08:00
@JK9993 怎么检测 tostring 被修改了?
JK9993
2021-05-08 17:12:25 +08:00
你可以构造一个函数,然后 toString 输出
xieqiqiang00
2021-05-08 17:13:07 +08:00
@JK9993 不行,我试过
7075
2021-05-08 17:15:30 +08:00
首先你先想想怎么给“原生 /非原生”下一个明确的、可量化、可操作的定义。
有了定义,才有分类的判断标准。
如果能拿到目标函数原始的代码,那么可以用代码做指纹...
mopig
2021-05-08 17:18:07 +08:00
@xieqiqiang00 Function.prototype.toString.call(Function.prototype.toString) 这样检测🤔
xieqiqiang00
2021-05-08 17:18:32 +08:00
@7075 我指的原生就是看不到代码,可能都不是 JS 实现的,浏览器内置的这些东西<br>
fetch 、XMLHTTPRequest 这种
daysv
2021-05-08 17:20:09 +08:00
XMLHttpRequest.toString()

"function XMLHttpRequest() { [native code] }"
xiangwan
2021-05-08 17:20:38 +08:00
如果你信任你的运行时,这个判断才有意义
daysv
2021-05-08 17:22:23 +08:00
再加一个 XMLHttpRequest.toString.toString() ?
xieqiqiang00
2021-05-08 17:22:48 +08:00
@JK9993 懂了
xieqiqiang00
2021-05-08 17:24:00 +08:00
@daysv 我最上面的代码就能绕开这个了
xieqiqiang00
2021-05-08 17:24:55 +08:00
@xiangwan 提高一下成本,打开控制台随便改改就能操作,门槛也太低了
chogath
2021-05-08 17:25:20 +08:00
没懂需要判断的需求是什么,可否描述下场景和需求啊
7075
2021-05-08 17:36:28 +08:00
这个问题往大了说是一个哲学问题。怎么证明你是你。
还不如从原始需求出发,解决最直接的需求问题。
xieqiqiang00
2021-05-08 17:39:16 +08:00
@chogath 想法是用 electron 写一个程序,代码用 vm 预编译,网络用 electron 的证书绑定,但如果直接改 js 文件重写了 XHR,通信的具体细节还是会一览无余。希望提高破解者的破解成本
chogath
2021-05-08 17:43:23 +08:00
@xieqiqiang00 js 有转移二进制码,或者可执行文件的第三方库,或许你可以从这个角度去考虑?
maichael
2021-05-08 17:44:23 +08:00
如果你想沿着现有思路走基本是走不通的,毕竟你的检测工具都可能被篡改。
还不如回到你的需求本身,考虑下其它的方向。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/775677

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX