V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
netabare
V2EX  ›  程序员

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

  •  
  •   netabare · 11 小时 5 分钟前 · 939 次点击

    比如说,假设一段不知哪来的代码,先 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 能不能帮助理解?

    12 条回复    2026-03-18 14:35:11 +08:00
    geelaw
        1
    geelaw  
       10 小时 34 分钟前
    取决于如何定义“理解”“意图”。这种操作没有密码学意义下的混淆能力。

    应该注意的是在“标识符替换为 a b c 等”之后,“把标识符替换成带有语义的词”是无意义的操作,因为后者可以轻松撤销。
    xue777hua
        2
    xue777hua  
       9 小时 43 分钟前 via iPhone
    @geelaw 这是针对人的 而不是针对机器的。

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

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

    然后这个藏的很深很深

    传统的专门针对人的代码保护技巧😂
    msg7086
        3
    msg7086  
       8 小时 24 分钟前
    不用足够多的行数,我直接把反编译的字节码丢给 AI ,他就可以给我基于代码意图整理出可读的代码。
    前几天就在做的,lua 字节码反编译。
    msg7086
        4
    msg7086  
       7 小时 58 分钟前
    帮你试着喂了 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
        5
    geelaw  
       7 小时 6 分钟前
    @xue777hua #2 如果一个人在分析被瞎改过变量名的代码,显然会自动克制望文生义的冲动。
    cryptovae
        6
    cryptovae  
       6 小时 41 分钟前
    我猜你这代码是 webpack 这类工具 build 后的代码
    codehz
        7
    codehz  
       6 小时 35 分钟前 via Android
    其实可以再混淆一次再丢给 ai 的🌚
    shaozelin030405
        8
    shaozelin030405  
       6 小时 29 分钟前
    能啊,只是压缩,没啥意义
    sir283
        9
    sir283  
       6 小时 20 分钟前
    混淆吗?那只是对人而言,阅读起来有点阻碍,对机器而言,没啥意义,本质上最后都会转换为 0 和 1.
    sentinelK
        10
    sentinelK  
       5 小时 36 分钟前
    可以被理解,只是因为没有变量名、注释的辅助,导致理解难度变高了而已。
    这个行为有个专有名词,叫混淆。如果只是尽量缩短代码量,但不增加运算符复杂度,叫压缩。

    因为无论你的代码如何变化,最终呈现给编译器/解释器的一定是等价逻辑的代码。否则你的程序就不成立。
    而且现阶段的大语言模型很擅长于“反混淆”,因为其上下文容量比人脑大得多。可以更从容的发掘代码中的统计学规律。
    jackOff
        11
    jackOff  
       5 小时 21 分钟前
    代码混淆是防止人一下子看懂,但是 ai 时代这没有用
    AoEiuV020JP
        12
    AoEiuV020JP  
       47 分钟前
    奇怪的混淆在反混淆时第一步就是重新混淆一遍,换成稍微有点意义的,比如至少体现是类名还是函数,是全局变量还是局部变量,并加 001/002 确保每个标识符都不同,再阅读理解时把已知的一个一个更换成真实有意义的词,
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5563 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:22 · PVG 15:22 · LAX 00:22 · JFK 03:22
    ♥ Do have faith in what you're doing.