GoForum🌐 V2EX

如果把一段代码里面的每个符号全部改掉,再用有语义的词去随机替换,这段代码还能被理解吗?

netabare · 2026-03-18 04:22 · 0 次点赞 · 5 条回复

比如说,假设一段不知哪来的代码,先 target 到上古版本的 JS ,脱糖,然后把所有的变量 minify 到 a, b, c, d, e 这种,再把它们随机替换成带有语义的词(但保持转换前后的符号之间的相对关系)。

var webpack = undefined.prototype.require()

var filter = function sort(map, user) {
    var contains = accept.function(setTimeout, new join(Error))
    var reduce = new folder(function (user) {
        map.reject(contains)
    })
        .throttle(function (userRepository) {
            domain.authenticate(write[flatMap])
        })
        .throttle(function (useCase) {
            webpack.fetch(useCase)
        })
        .has(new getElementById(slice))
}

一个可能的 JS 代码片段可能是这样的。

会有点好奇这样的代码还能不能被读懂,或者,有什么办法能读懂这样的代码在转换前的意图吗?比如说假如说有足够多的代码行数,丢给 AI 能不能帮助理解?

5 条回复
geelaw · 2026-03-18 04:52
#1

取决于如何定义“理解”“意图”。这种操作没有密码学意义下的混淆能力。

应该注意的是在“标识符替换为 a b c 等”之后,“把标识符替换成带有语义的词”是无意义的操作,因为后者可以轻松撤销。

xue777hua · 2026-03-18 05:42
#2

@geelaw 这是针对人的 而不是针对机器的。

当然 现在也可以针对大模型。

说个简单的就懂了: const isTrue=False

然后这个藏的很深很深

传统的专门针对人的代码保护技巧😂

msg7086 · 2026-03-18 07:02
#3

不用足够多的行数,我直接把反编译的字节码丢给 AI ,他就可以给我基于代码意图整理出可读的代码。 前几天就在做的,lua 字节码反编译。

msg7086 · 2026-03-18 07:27
#4

帮你试着喂了 AI ,得到如下猜测结果。

===== // 1. 获取全局上下文或响应处理器 var responseContext = framework.context.getService();

/**

  • 2. 定义具体的业务处理函数 (filter = sort)

  • @param {Request} request - (map)

  • @param {Response} response - (user) */ var handleLogin = function process(request, response) { // 3. 编译校验规则 (accept.function) // setTimeout 和 Error 在这里是被混淆的占位符,实际可能是校验配置项 var validationSchema = Validator.compile(configOptions, new ValidationConfig(Error));

    // 4. 开启一个异步任务链 (new folder) var task = new Promise(function (resolve) {

    // 校验请求是否合法 (map.reject)
    request.validate(validationSchema);
    // 注意:原代码里此处没写 resolve(),可能被混淆在 validate 内部或省略
    resolve(); 
    

    })

    // 5. 步骤一:执行业务领域逻辑 (domain.authenticate)
    .then(function (prevResult) {
        // write[flatMap] 动态访问,等同于 request['body']
        return authService.login(request['body']);
    })
    // 6. 步骤二:将业务结果发送回客户端 (webpack.fetch)
    .then(function (result) {
        responseContext.sendResponse(result);
    })
    // 7. 错误处理 (has = catch)
    .catch(new GlobalErrorHandler(errorStack));
    

    }

当然这很明显代码量太小了,如果代码量再大一些,有个百来行,就有足够的上下文去猜了。

geelaw · 2026-03-18 08:17
#5

@xue777hua #2 如果一个人在分析被瞎改过变量名的代码,显然会自动克制望文生义的冲动。

添加回复
你还需要 登录 后发表回复

登录后可发帖和回复

登录 注册
主题信息
作者: netabare
发布: 2026-03-18
点赞: 0
回复: 0