首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS 代码染色原理及技术实践

基本块 基本块 (Basic Block) 是满足下列条件的最大的 连续三地址指令序列 : 控制流只能从基本块中的第一个指令进入该块。...只要基本块中的第一个指令被执行,那么基本块中的所有指令都会得到执行 其中中间代码指令序列生成 BB 块的算法如下: 确定中间代码序列中哪些指令是首指令 中间代码的第一个三地址指令是一个首指令。...任意一个条件或无条件转移指令之后的目标指令是一个首指令。 紧跟在一个条件或无条件转移指令之后的指令是一个首指令。...E0-E7 是边(edges) 插桩逻辑 覆盖率计数指令的插入会进行两次循环,外层循环遍历编译单元中的函数,内层循环遍历函数的基本块。函数遍历用来向 gcno 文件中写入函数位置信息。...一个函数中基本块的插桩方法如下: 统计所有 BB 的后继数 n,创建和后继数大小相同的数组 ctr[n]。

1.7K10

一种高端的APP代码保护方案

OLLVM的混淆原理,就是在不改变源代码功能前提下,将C或C++代码中的控制语句if、while、for、do等转换成switch分支语句。...混淆的具体实现思路,首先将要实现代码平坦化的函数分成多个基本块(就是case代码块)和一个入口块,并为每个基本块设置编号,并让这些基本块都有共同的前驱模块和后继模块。...这个混淆它并不会增强过多的安全性,因为它可以通过重新优化生成的代码轻松删除,如果选择使用随机生成器以不同数值作为种子,指令替换会在生成的二进制文件中带来多样性。...它支持以下的2种模式功能: -mllvm -sub:激活指令替换 -mllvm -sub_loop=3:如果激活了传递,则在函数上应用3次。...这个主要原理就是在当前基本块之前添加一个新的基本块用来修改函数调用图,这个新的基本块包含一个不透明的谓词,通过有条件地跳转到原来的基本块。原始的基本块也会被克隆并填充随机的垃圾指令。

1.6K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    听GPT 讲Rust源代码--compiler(27)

    控制流图是用于分析程序中代码执行的特定分析工具。在Rust编译器中,控制流图表示程序中的各个基本块(Basic Block)之间的控制流关系,其中基本块是一个连续的指令序列,没有分支或跳转。...该文件定义了与控制流图中的基本块和指令相关的结构和函数。具体而言,它定义了以下结构: BasicBlock: 表示控制流图中的基本块。...提供基本块(basic block)相关的操作函数:包括创建基本块、在基本块中插入指令等。 提供指令相关的操作函数:包括创建和获取指令、设置指令的操作码、设置指令的操作数等。...它包含一个基本块的指针,用于在迭代过程中获取基本块中的指令。 这些结构体的作用是使得在编译器的代码生成过程中,可以方便地遍历和操作LLVM中的指令,从而实现代码生成的功能。...在这个过程中,编译器需要将一些特殊的函数或操作翻译为对应的 LLVM IR。这些特殊的函数或操作包含在所谓的内置函数中,常见的示例包括整数加法、浮点数乘法、内存拷贝等。

    9610

    【AI系统】LLVM IR 详解

    因此这条指令可以表示为四元组: (add, %a, %b, %result) LLVM IR 指令示例 以下是一个简单的 LLVM IR 示例,它展示了一个函数实现: ; 定义一个函数,接受两个 32...LLVM IR 的内存模型是基于基本块的,每个基本块都有自己的内存空间,指令只能在其内存空间内执行。 在 LLVM 架构中,几乎所有的实体都是一个 Value。...实际上,LLVM 中还定义了一个 Use 类,Use 是一个对象,它表示对一个 Value 的单个引用或使用。...Function 在 Module 中,可以定义多个函数(Function),每个函数都有自己的类型签名、参数列表、局部变量列表、基本块列表和属性列表等。...BasicBlock 每个函数可以有多个基本块(BasicBlock),每个基本块由若干条指令(Instruction)组成,最后以一个终结指令(terminator instruction)结束。

    24010

    LLVM编译器中的内置(built-in)函数

    在一些.h头文件中或者实现代码中经常会看到一些以__builtin_开头的函数声明或者调用,比如下面的头文件#include 中的函数定义: //这里的memcpy函数的由内置函数...比如对于GCC来说它所支持的内置函数都在GCC内置函数列表中被定义和声明,这些内置函数大部分也被LLVM编译器所支持。 本文不会介绍所有的内置函数,而是只介绍其中几个特殊的内置函数以及使用方法。...因此为了提升性能,可以预先将某个内存地址中的数据读取或写入到高速缓存中去,这样当真实需要对内存地址进行存取时实际上是在高速缓存中进行。...而__builtin_prefetch函数就是用来将某个内存中的数据预先加载或写入到高速缓存中去。...时间局部性是指,如果程序中某一条指令一旦执行,则不久之后该指令可能再被执行;如果某数据被访问,则不久之后该数据会被再次访问。该值的范围在 0 - 3 之间。

    2.7K30

    iOS 增量代码覆盖率检测实践

    .gcno 利用 Clang 分别生成源文件的 AST 和 IR 文件,对比发现,AST 中不存在计数指令,而 IR 中存在用来记录执行次数的代码。搜索 LLVM 源码可以找到覆盖率映射关系生成源码。...从编译器角度看,基本块(Basic Block,下文简称 BB)是代码执行的基本单元,LLVM 基于 BB 进行覆盖率计数指令的插入,BB 的特点是: 1. 只有一个入口。 2. 只有一个出口。...只要基本块中第一条指令被执行,那么基本块内所有指令都会顺序执行一次。 分支、循环结构对应着基本块之间的跳转。LLVM 基于 BB 进行覆盖率计数指令的插入。...覆盖率计数指令的插入会进行两次循环,外层循环遍历编译单元中的函数,内层循环遍历函数的基本块。函数遍历仅用来向 .gcno 中写入函数位置信息,这里不再赘述。 一个函数中基本块的插桩方法如下: 1....随着 BB 遍历,写入 BB 编号、BB 起止范围、BB 的后继节点编号(标记基本块跳转关系)。 4. 写入函数中BB对应行号信息(标注基本块与源码行数关系)。

    1.7K30

    iOS 覆盖率检测原理与增量代码测试覆盖率工具实现

    从编译器角度看,基本块(Basic Block,下文简称 BB)是代码执行的基本单元,LLVM 基于 BB 进行覆盖率计数指令的插入,BB 的特点是: 只有一个入口。 只有一个出口。...只要基本块中第一条指令被执行,那么基本块内所有指令都会顺序执行一次。 覆盖率计数指令的插入会进行两次循环,外层循环遍历编译单元中的函数,内层循环遍历函数的基本块。...函数遍历仅用来向 .gcno 中写入函数位置信息,这里不再赘述。 一个函数中基本块的插桩方法如下: 统计所有 BB 的后继数 n,创建和后继数大小相同的数组 ctrn。...随着函数遍历写入文件地址、函数名和函数在源文件中的起止行数(标记文件名,函数在源文件对应行数)。 随着 BB 遍历,写入 BB 编号、BB 起止范围、BB 的后继节点编号(标记基本块跳转关系)。...写入函数中BB对应行号信息(标注基本块与源码行数关系)。

    1.6K20

    Python中的chdir函数:更改工作目录利器

    在Python中,`chdir`是一个内置函数,用于更改当前工作目录。今天就给大家简单介绍一下该函数的用法和一些注意事项,一起来学习一下吧。  ...什么是工作目录  在计算机操作系统中,每个进程都有一个当前工作目录。文件操作通常是相对于该目录进行的,也就是说,如果没有指定完整的路径名,则文件操作将相对于当前工作目录进行。  ...`chdir`函数的使用  `chdir`函数可以用于更改当前工作目录。它接受一个字符串参数,表示目标目录的路径名。...3、在更改工作目录后,如果需要返回到之前的工作目录,可以使用`os.getcwd()`函数获取当前工作目录,并将其保存下来。...然后,需要恢复之前的工作目录时,可以调用`chdir`函数并将之前保存的路径名作为参数传递。  4、在多线程或多进程环境中,应当避免在不同的线程或进程中同时更改工作目录,以避免导致意外结果。

    24540

    Fairplay DRM与混淆实现的研究

    混淆原理和一些实现 LLVM Pass LLVM是一个优良的编译器框架,其中,我们可以将其大略的分为前端、中端、后端: 图 5 前端负责将高级语言转化为LLVM IR;中端处理LLVM IR,完成一系列的分析...非直接跳转(Indirect Branch) 将一些基本块的起始地址保存在全局变量中,通过不透明常量的生成,使得反汇编工具和肉眼无法直接获取到基本块跳转的目标,模型如下: //记录基本块地址到全局查找表...同时,这里面对一些传递的参数进行了异或混淆,在子函数里面再恢复出来,使得我们难以直接得到原始数据,而静态分析的工具比如IDA Pro也不支持跨函数的数据流分析。...通过跟踪,我们发现在arm64e设备下,该内核驱动中,同一个函数的所有基本块在运行到跳转指令时,均使用了同一个PAC Context,或者称之为PAC Modifier。...0xB + w19) << 3] //0xB代表两个基本块的在LUT中的下标差 通过CSET指令的形式,我们已经可以推断跳转指令应该是J.NE或者J.EQ了,通过我们的调试器插件,我们可以得到其中一个分支的跳转地址和原本的跳转指令

    2.1K50

    听GPT 讲Rust源代码--compiler(46)

    全局汇编指令是一种在整个编译单元中跨越函数或模块的汇编指令。该枚举与InlineAsmOperandRef类似,提供了对全局汇编指令的操作数进行解析和验证的功能。...首先,该文件定义了一系列的from_和to_前缀的函数,用于将Rust类型转换为对应的LLVM IR类型,或将LLVM IR类型转换为Rust类型。...codegen_llvm_intrinsic_call函数:该函数是MIR层面的内建函数调用的代码生成器。它在Rust编译器的LLVM后端中被调用,将MIR中的内建函数调用编译成LLVM IR指令。...通过该结构体和其中的方法,可以根据指令类型进行相应的代码生成。 MergingSucc枚举:该枚举用于表示基本块的终结符指令中的后继块的类型。...这些结构体和枚举类型的作用是为了在代码生成过程中处理MIR基本块的控制流和返回情况,并根据具体的情况生成相应的代码。通过这些结构体和枚举类型,编译器可以根据MIR的指令生成对应的机器码或汇编代码。

    9610

    分支记录机制(Branch Recording Mechanisms)

    嗯,因为这是我们如何确定程序控制流的方式。我们基本上忽略基本块(参见 [@sec:BasicBlock])中的其他指令,因为分支总是基本块中的最后一个指令。...由于基本块中的所有指令都保证执行一次,因此我们只能关注将“代表”整个基本块的分支。因此,如果我们跟踪每个分支的结果,就可以重建程序的整个逐行执行路径。...启用此模式后,LBR 数组仍像以前一样捕获函数调用,但随着返回指令的执行,最后捕获的分支 (call) 记录将以后进先出 (LIFO) 方式从数组中刷新。...使用分支记录,我们还可以找到一个“超块”(有时称为“超级块”),它是函数中一系列热门基本块的链,这些基本块不一定按照顺序排列,但它们是顺序执行的。因此,超块代表了函数、代码片段或程序的典型热路径。...由于前一个 (N-1) LBR 条目中的目标地址是一个基本块 (BB) 的开始,而当前 (N) LBR 条目中的源地址是同一个基本块的最后一个指令,因此周期计数就是这个基本块的延迟。

    26310

    ARM Linux ELF加壳方案

    压缩加密 技术原理类似桌面应用的「压缩壳」,将 SO 文件中的代码段压缩或加密,在入口函数中解密再执行。...」进行改造,以实现函数级的代码混淆,在相当长的一段时间内,基于LLVM的代码保护技术,成为函数级保护的主流方案。...可以被反编译 由于 OLLVM 是在编译过程中对 LLVM IR 进行了处理,IR 属于架构无关指令,在 LLVM 后端依然要生成平台相关的指令,所以最终只是变成了「更加复杂的 C/C++ 代码」而已。...边界清晰 通过「基本块」拆分,虽然函数中的逻辑块变得很分散,但它们依旧排列在一起,函数有明确的起始和结尾。...无函数边界 通过链接器乱序再重定位,生成的指令块在可执行文件中的位置是随机的,函数保护后变成了无数个随机位置的指令碎片,无法知道函数的边界。

    5.6K30

    Auto-Vectorization in LLVM

    该指令允许启用或禁用矢量化和交错。也可以手动指定矢量宽度和交叉计数。...为了更好地优化C/C++数学库函数,使用“-fNO数学ErrNO”。 循环向量器知道目标上的特殊指令,并将对包含映射到指令的函数调用的循环进行矢量化。...循环向量器通过执行循环的部分展开来提高指令级并行度(ILP)。 在下面的示例中,整个数组被累加到变量“sum”中。这是低效的,因为处理器只能使用一个执行端口。...2.4 持续发展方向 对LLVM循环向量器的流程进行建模和基础设施升级。 三、The SLP Vectorizer 3.1 详情 SLP向量化的目标是将相似的独立指令组合成向量指令。...例如,以下函数对其输入(a1,b1)和(a2,b2)执行非常相似的操作。基本块向量器可以将这些组合成向量操作。

    3.3K30

    深度学习编译器之公共子表达式消除和死代码消除实现

    %[[OUT:[a-zA-Z0-9_]+]] 是一个正则表达式捕获组,用于捕获一个以 % 开头、后跟一系列字母、数字或下划线的字符串。这个字符串对应于 MLIR 中的一个值名称。"...根据函数名称,这个函数创建一个CSE Pass,会处理或放置属性。...此结构体旨在为用于 LLVM DenseMap 中的 Operation 对象提供自定义的哈希和相等性函数。它重载了两个方法: getHashValue: 为 Operation* 计算哈希值。...这里的重点是 simplifyRegion 函数,这是执行 CSE 的具体细节。这个函数主要使用支配树遍历区域中的基本块,并调用 simplifyBlock() 函数对每个基本块进行简化。...从代码中可以推测,该函数的目的是简化一个给定的基本块。

    66950

    llvm入门教程-Kaleidoscope前端-3-代码生成

    Value是用来表示LLVM中的“静态单赋值(SSA)寄存器”或“SSA值”的类。SSA值最明显的方面是,它们的值是在相关指令执行时计算的,并且直到(如果)指令重新执行时才会获得新值。...Builder对象是一个帮助对象,可以轻松生成LLVM指令。IRBuilder类模板的实例跟踪当前插入指令的位置,并具有创建新指令的方法。 TheModule是包含函数和全局变量的LLVM结构。...请注意,在LLVM IR中,所有常量都是唯一的,并且都是共享的。为此,API使用了“foo::get(.)”习惯用法,而不是“new foo(..)”或“foo::create(..)”。...LLVM中的基本块是定义控制流Graph的函数的重要部分.因为我们没有任何控制流,所以我们的函数此时将只包含一个block。我们将在第5章中解决这个问题:)。...驱动程序更改和结束思路 目前,LLVM的代码生成并没有给我们带来多少好处,除了我们可以查看漂亮的IR调用之外。

    1.4K20

    Postgresql源码(128)深入分析JIT中的函数内联llvm_inline

    循环优化:LLVM可能进行了循环展开(loop unrolling)或循环融合(loop fusion)等优化,这些优化可以减少循环开销和提高迭代中数据的重用。...数据预取:LLVM可能插入了数据预取指令,这些指令可以在数据被访问之前就将其加载到缓存中,从而减少缓存未命中。...3 llvm_inline执行流程分析 上面给的用例函数的编译执行是在投影列中的(无JIT投影列执行可以参考这篇《Postgresql源码(127)投影ExecProject的表达式执行分析》)。...llvm_compile_expr中构造表达式计算函数,加到module里面: 注意这里通过LLVMAddFunction会把表达式计算用到的函数都加进去(只加用到的)。...(llvm::module 是 LLVM 中的一个类,它代表了一个完整的 LLVM IR模块,这个模块可以包含函数、全局变量、符号等。

    17010

    llvm入门教程-Kaleidoscope前端-5-控制流

    因为我们使用的主要是函数形式,所以我们将让它评估其条件,然后根据条件的解决方式返回‘THEN’或‘ELSE’值。这与C“?:”表达式非常相似。...还要注意的是,它正在创建一个指向“THEN”block和“ELSE”block的分支,尽管“ELSE”block还没有插入到函数中。这一切都没问题:这是LLVM支持正向引用的标准方式。...LLVM IR的一个有趣(也是非常重要的)方面是,它要求所有基本块都使用一个控制流指令(如return或分支)“终止”。这意味着所有控制流包括fall-through必须在LLVMIR中显式显示。...最后,CodeGen函数将phi节点作为IF/THEN/ELSE表达式计算的值返回。在上面的示例中,此返回值将提供给顶层函数的代码,该代码将创建返回指令。...我们的‘for’循环在符号表中引入了一个新变量。这意味着我们的符号表现在可以包含函数参数或循环变量。为了处理这个问题,在我们对循环体进行编码之前,我们添加循环变量作为其名称的当前值。

    1K30

    最强通用编译器优化工具!MIT三篇顶会论文打造,准确率是传统方法5倍

    这就是MIT耗时一年提出的研究成果,名为Ithemal,核心功能也非常简单: 能够分析数以百万计自动描述的基本块(计算指令的基本片段),来确切了解不同的芯片机构如何执行计算。 ? 效果也非常惊艳。...性能是传统方法的5倍,英特尔的2倍。 整个过程都是自动化的,不需要人为干预,就能够快速分析数十万或数百万个基本块。...MIT的方法中,一开始就绕开了“盲人摸象”的困境,而是建立神经网路,从“数据”中学习。 这个数据,就是芯片执行“基本块”所需的平均周期数,不需要手动添加任何特征。...在所有基准测试中,平均绝对百分误差(MAPE)降低了50%以上,同时仍然提供了较快的估计速度。 在生成高质量的预测时,Ithemal只需要训练数据和ISA的规范,包括指令规范及其显式和隐式操作数。...△基本块和它们的预测吞吐量 在他们的评估中,Ithemal预测英特尔芯片运行代码的速度,要比英特尔自己建立的性能模型还要快。

    94910
    领券