各位观众老爷,大家好!今天咱们不聊八卦,来点硬核的——AST(抽象语法树)和 CFG(控制流图)的结合,看看这两位大佬如何联手,把咱们的代码扒个底朝天,提取语义信息,搞更深度的程序分析。 开场白:代码的灵魂拷问 咱们写代码,那可不是随便敲几个字符,而是要表达一定的意图。比如,int x = 1 + 2; 这行代码,计算机读到它,知道你要声明一个整型变量 x,然后把 1 + 2 的结果赋值给它。但是,计算机是怎么理解这些意图的呢?这就得靠编译器/解释器里头的各种神器了,其中就包括 AST 和 CFG。 AST 就像是代码的骨架,它把代码的语法结构用树形结构表示出来,让计算机能更容易地理解代码的组成部分。而 CFG 则像是代码的血管,它描绘了代码的执行流程,让计算机知道代码的执行顺序。 第一幕:AST——代码的骨架 AST,全称 Abstract Syntax Tree,中文名叫抽象语法树。它是一种树状的数据结构,用来表示编程语言的语法结构。 简单来说,就是把代码拆解成一个个节点,然后按照语法规则把它们连接起来。 为什么叫“抽象”? 因为它忽略了一些无关紧要的细节,比如空格、注释等等,只保 …
控制流图 (Control Flow Graph, CFG) 重建:如何从混淆后的 JavaScript 代码中提取 CFG,并识别其真实的程序流?
嘿,各位代码探险家们,欢迎来到“JavaScript 迷宫寻宝”讲座!今天我们要聊的是如何从那些被搅得一团糟的 JavaScript 代码里,像福尔摩斯一样,抽丝剥茧,把程序的真实运行轨迹,也就是控制流图(CFG),给重建出来。 准备好了吗?让我们开始这场烧脑但绝对有趣的旅程吧! 第一幕:认识我们的对手——混淆 JavaScript 首先,我们得了解一下我们的对手,也就是那些把代码搞得乱七八糟的混淆技术。 它们的主要目标是: 让代码难以阅读: 变量名改成 a, b, c,函数名改成 _0xabc,常量变成 16 进制等等。 隐藏代码逻辑: 用各种奇葩的控制流结构,比如 if (!true),或者用 while(true) 包裹一大段代码,然后用 break 跳出来。 增加代码复杂度: 插入大量无意义的代码,让代码体积膨胀,分析难度增加。 举个例子,下面这段简单的 JavaScript 代码: function greet(name) { if (name) { console.log(“Hello, ” + name + “!”); } else { console.log(“Hell …
继续阅读“控制流图 (Control Flow Graph, CFG) 重建:如何从混淆后的 JavaScript 代码中提取 CFG,并识别其真实的程序流?”