<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: lich0</title>
    <description>The latest articles on DEV Community by lich0 (@lich0).</description>
    <link>https://dev.to/lich0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3754029%2Fdf0129d1-b008-432c-99ad-bbb8992d0d8b.png</url>
      <title>DEV Community: lich0</title>
      <link>https://dev.to/lich0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lich0"/>
    <language>en</language>
    <item>
      <title>SLLVM - A unique OLLVM-based obfuscator</title>
      <dc:creator>lich0</dc:creator>
      <pubDate>Mon, 16 Mar 2026 08:39:45 +0000</pubDate>
      <link>https://dev.to/lich0/sllvm-a-unique-ollvm-based-obfuscator-3k8c</link>
      <guid>https://dev.to/lich0/sllvm-a-unique-ollvm-based-obfuscator-3k8c</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/lich4/sllvm" rel="noopener noreferrer"&gt;https://github.com/lich4/sllvm&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported Systems and Architectures
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Host Systems&lt;/strong&gt;: Planned support for &lt;code&gt;macOS&lt;/code&gt;/&lt;code&gt;Linux&lt;/code&gt;; no current plans for &lt;code&gt;Windows&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Systems&lt;/strong&gt;: Planned support for &lt;code&gt;macOS&lt;/code&gt;/&lt;code&gt;iOS&lt;/code&gt;/&lt;code&gt;Android&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architectures&lt;/strong&gt;: Both Host and Target support &lt;code&gt;X64&lt;/code&gt; and &lt;code&gt;ARM64&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Languages&lt;/strong&gt;: Supports &lt;code&gt;C&lt;/code&gt;, &lt;code&gt;C++&lt;/code&gt;, &lt;code&gt;Objective-C&lt;/code&gt;, &lt;code&gt;Objective-C++&lt;/code&gt;, &lt;code&gt;Swift&lt;/code&gt;, &lt;code&gt;Rust&lt;/code&gt;, &lt;code&gt;Golang&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Obfuscation Capabilities
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Data Encryption

&lt;ul&gt;
&lt;li&gt;
CE                  Constant Encryption (String obfuscation).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Control Flow Obfuscation

&lt;ul&gt;
&lt;li&gt;
FLA           Control Flow Flattening.&lt;/li&gt;
&lt;li&gt;
BCF                Bogus Control Flow.&lt;/li&gt;
&lt;li&gt;
ECF                Novel Control Flow obfuscation.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Function-Level Obfuscation

&lt;ul&gt;
&lt;li&gt;
FW                   Function Wrapper (Function nesting).&lt;/li&gt;
&lt;li&gt;
FCC    Function Calling Convention obfuscation.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Instruction-Level Obfuscation

&lt;ul&gt;
&lt;li&gt;
IBR                   Indirect Branch.&lt;/li&gt;
&lt;li&gt;
ICALL                   Indirect Call.&lt;/li&gt;
&lt;li&gt;
IGV                       Indirect Global Variable reference.&lt;/li&gt;
&lt;li&gt;
SVC           Supervisor Call (System call) obfuscation.&lt;/li&gt;
&lt;li&gt;
SPLIT           Instruction Splitting.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;其他

&lt;ul&gt;
&lt;li&gt;
INLINE              Function Inlining.&lt;/li&gt;
&lt;li&gt;
SEC             Anti-debugging/Security protection.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  SLLVM Features
&lt;/h3&gt;

&lt;p&gt;SLLVM was developed to address limitations in the OLLVM lineage (Hikari, Hikari-LLVM15, Pluto, Polaris-Obfuscator, goron, Arkari, o-mvll, etc.):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Release Compatibility&lt;/strong&gt;: Obfuscation is not reverted by the compiler during &lt;code&gt;Release&lt;/code&gt; builds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anti-Analysis&lt;/strong&gt;: Resists "Read-Only Data Segment" attacks in IDA Pro; if data segments are marked read-only, obfuscation remains intact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardening&lt;/strong&gt;: Removes common OLLVM signatures to resist specialized scripts, symbolic execution (Angr), and AI-based deobfuscation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stability&lt;/strong&gt;: Avoids compilation hangs and memory exhaustion often seen in other variants when processing large &lt;code&gt;header-only&lt;/code&gt; libraries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;In many real-world projects, fully obfuscating the entire codebase is often impractical due to the following reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project Scale and Dependencies&lt;/strong&gt;: Large projects or those utilizing numerous &lt;code&gt;header-only&lt;/code&gt; libraries may end up obfuscating unnecessary code, resulting in excessively large binary sizes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compilation Overhead&lt;/strong&gt;: For massive projects with complex dependencies, applying flattening (or other methods) to unnecessary code can lead to extremely long compilation times or even system hangs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Impact&lt;/strong&gt;: Obfuscating complex algorithms can significantly increase runtime latency; typically, control flow flattening adds over 10% to execution time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance Issues&lt;/strong&gt;: Excessive obfuscation may violate the submission policies of platforms like the &lt;code&gt;AppStore&lt;/code&gt; or &lt;code&gt;GooglePlay&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, it is often necessary to apply different levels of obfuscation based on the importance of specific modules or functions. This requires a configuration strategy to specify which targets receive which type of obfuscation. Traditional open-source &lt;code&gt;OLLVM&lt;/code&gt; implementations usually manage strategies through the following methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Command-line Arguments&lt;/strong&gt;: Specifying parameters for specific modules (e.g., &lt;code&gt;-llvm -fla&lt;/code&gt;), which is compatible with all compiler front-ends supporting LLVM flags.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment Variables&lt;/strong&gt;: Defining obfuscation parameters via the system environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Function Annotations&lt;/strong&gt;: Using attributes like &lt;code&gt;__attribute((__annotate__(("fla"))))&lt;/code&gt; (or the modern syntax &lt;code&gt;[[clang::annotate("fla")]]&lt;/code&gt;); however, this is restricted to &lt;code&gt;C/C++&lt;/code&gt; and is not supported by &lt;code&gt;Objective-C or&lt;/code&gt; other languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marker Functions&lt;/strong&gt;: Designating specific functions as markers, as shown below; this method provides support for &lt;code&gt;Objective-C&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of the aforementioned methods have their limitations—they either require intrusive code changes, fail to provide control at the function level, or are restricted to specific languages. This project utilizes a configuration file (&lt;code&gt;sllvm.json&lt;/code&gt;) to define which functions and modules should be obfuscated, ensuring compatibility with the majority of compiler frontends and programming languages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Primary/Secondary Fields
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;log_level&lt;/code&gt;   Global logging level. String type, optional. Defaults to no logging. Possible values: &lt;code&gt;info&lt;/code&gt; | &lt;code&gt;debug&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src_root&lt;/code&gt;    Source file root path. String type, optional. Defaults to the current directory; typically does not need to be specified.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;policies&lt;/code&gt;    A list of strategies, divided into Module-level and Function-level policies. Module-level policies contain module and policy fields but no func field. Function-level policies include &lt;code&gt;module&lt;/code&gt;, &lt;code&gt;func&lt;/code&gt;, and &lt;code&gt;policy&lt;/code&gt; fields.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;module&lt;/code&gt;      A regular expression used to match module paths.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;func&lt;/code&gt;        regular expression used to match function names. &lt;code&gt;C++&lt;/code&gt; functions are demangled before matching.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;policy&lt;/code&gt;      String type; must correspond to a key defined in &lt;code&gt;policy_map&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;policy_map&lt;/code&gt;  A strategy index referenced by &lt;code&gt;policies&lt;/code&gt;. Each strategy name maps to a dictionary containing the following fields:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;base&lt;/code&gt;        The name of a base policy to inherit from (module or function level). String type, optional. Value must be a key in &lt;code&gt;policy_map&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dump&lt;/code&gt;        Types of intermediate code to output (saved in the &lt;code&gt;sllvm_dump&lt;/code&gt; directory). Applies to module or function levels. String array, defaults to empty. Possible values: &lt;code&gt;ir&lt;/code&gt;, &lt;code&gt;mmd&lt;/code&gt;, &lt;code&gt;asm&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;enable_std&lt;/code&gt;  Enables obfuscation for &lt;code&gt;C++&lt;/code&gt; standard library functions. Module-level policy. Boolean type, optional. Disabled by default to minimize compatibility issues.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Function-level Policy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;enable_ce&lt;/code&gt;       Enables &lt;code&gt;CE&lt;/code&gt; obfuscation.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ce_size_min&lt;/code&gt;     Minimum string length.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ce_size_max&lt;/code&gt;     Maximum string length.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ce_algo&lt;/code&gt;         Encryption/decryption algorithm.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ce_mode_stack&lt;/code&gt;   Enables stack-based string decryption.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;enable_fla&lt;/code&gt;      Enables &lt;code&gt;FLA&lt;/code&gt; obfuscation.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fla_prob&lt;/code&gt;        Obfuscation probability for BasicBlocks.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fla_force_reg&lt;/code&gt;   Increases obfuscation strength.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fla_use_igv&lt;/code&gt;     Increases obfuscation strength.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fla_use_dyn&lt;/code&gt;     Increases obfuscation strength.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fla_use_rcf&lt;/code&gt;     Increases obfuscation strength.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fla_blk_size&lt;/code&gt;    Increases obfuscation strength.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fla_invoke_op&lt;/code&gt;   Compatibility for exception handling.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;enable_bcf&lt;/code&gt;      Enables &lt;code&gt;BCF&lt;/code&gt; obfuscation.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bcf_prob&lt;/code&gt;        Obfuscation probability for BasicBlocks.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bcf_complex&lt;/code&gt;     Expression complexity.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bcf_use_var&lt;/code&gt;     Uses variables to construct expressions.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;enable_ecf&lt;/code&gt;      Enables &lt;code&gt;ECF&lt;/code&gt; obfuscation.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ecf_prob&lt;/code&gt;        Obfuscation probability for BasicBlocks.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;enable_fw&lt;/code&gt;       Enables &lt;code&gt;FW&lt;/code&gt; obfuscation.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fw_loop_min&lt;/code&gt;     Minimum number of function nesting layers.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fw_loop_max&lt;/code&gt;     Maximum number of function nesting layers.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fw_exclude&lt;/code&gt;      Sub-functions to exclude.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;enable_fcc&lt;/code&gt;      Enables &lt;code&gt;FCC&lt;/code&gt; obfuscation.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fcc_num&lt;/code&gt;         Number of randomized calling conventions (Module-level).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fcc_type&lt;/code&gt;        Type of customized calling convention (Module-level).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fcc_narg_reg&lt;/code&gt;    Maximum number of parameters passed via registers (Module-level).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;enable_ibr&lt;/code&gt;      Enables &lt;code&gt;IBR&lt;/code&gt; obfuscation.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ibr_prob&lt;/code&gt;        Obfuscation probability for BasicBlocks.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ibr_use_igv&lt;/code&gt;     Increases obfuscation strength.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ibr_use_dyn&lt;/code&gt;     Increases obfuscation strength.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;enable_icall&lt;/code&gt;    Enables &lt;code&gt;ICALL&lt;/code&gt; obfuscation.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;icall_use_igv&lt;/code&gt;   Increases obfuscation strength (Enabled by default).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;icall_use_dyn&lt;/code&gt;   Increases obfuscation strength.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;enable_igv&lt;/code&gt;      Enables &lt;code&gt;IGV&lt;/code&gt; obfuscation.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;igv_use_dyn&lt;/code&gt;     Increases obfuscation strength.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;enable_svc&lt;/code&gt;      Enables &lt;code&gt;SVC&lt;/code&gt; obfuscation.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;svc_usr_ir&lt;/code&gt;      Increases obfuscation strength.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;enable_split&lt;/code&gt;    Enables &lt;code&gt;SPLIT&lt;/code&gt; obfuscation.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;split_maxsize&lt;/code&gt;   Maximum number of instructions per split segment.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;enable_inline&lt;/code&gt;   Enables &lt;code&gt;INLINE&lt;/code&gt; obfuscation.&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;enable_sec&lt;/code&gt;      Enables &lt;code&gt;SEC&lt;/code&gt; obfuscation.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sec_ad_prob&lt;/code&gt;     Insertion probability for function anti-debugging logic.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sec_usr_ir&lt;/code&gt;      Increases obfuscation strength.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;A typical SLLVM configuration file sllvm.json is as follows::&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"log_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"info"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"policy_map"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"mod_pol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;               
            &lt;/span&gt;&lt;span class="nl"&gt;"dump"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ir"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"func_pol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;               
            &lt;/span&gt;&lt;span class="nl"&gt;"enable_ce"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"ce_size_min"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"ce_size_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"ce_algo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"policies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"desc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Module-level policy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"policy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mod_pol"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"desc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Function-level policy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"func"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"policy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"func_pol"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Supported Obfuscation Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  String Encryption
&lt;/h3&gt;

&lt;p&gt;Currently, &lt;code&gt;SLLVM&lt;/code&gt;'s &lt;code&gt;CE&lt;/code&gt; supports arm64/arm64e, &lt;code&gt;Objective-C&lt;/code&gt; constant strings, and stack-based decryption via &lt;code&gt;ce_mode_stack&lt;/code&gt;. Unlike &lt;code&gt;Hikari&lt;/code&gt;, which performs module-level obfuscation, &lt;code&gt;SLLVM&lt;/code&gt; operates at the function level. This allows users to obfuscate all strings within specific functions, which is particularly useful for handling &lt;code&gt;header-only&lt;/code&gt;libraries.&lt;/p&gt;

&lt;p&gt;Key differences from Hikari:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports encryption algorithms beyond simple XOR.&lt;/li&gt;
&lt;li&gt;Supports stack-based decryption(&lt;code&gt;ce_mode_stack&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;ce_algo&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Used to configure the encryption/decryption algorithm. SLLVM currently supports 30 algorithms with complexity ranging from XOR to AES-level. Setting this value to 100 will select a random algorithm.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;ce_mode_stack&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;This setting controls whether strings are decrypted on the stack. If &lt;code&gt;ce_mode_stack&lt;/code&gt; is disabled, &lt;code&gt;SLLVM&lt;/code&gt; utilizes the same approach as Hikari. The table below compares &lt;code&gt;Hikari&lt;/code&gt;'s method, &lt;code&gt;SLLVM&lt;/code&gt;'s S-mode (stack), and &lt;code&gt;C++&lt;/code&gt; template metaprogramming-based string obfuscation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;Hikari&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;SLLVM&lt;/code&gt;S-Mode&lt;/th&gt;
&lt;th&gt;C++ Template Metaprogramming&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Encryption Location&lt;/td&gt;
&lt;td&gt;Static Area&lt;/td&gt;
&lt;td&gt;Static Area&lt;/td&gt;
&lt;td&gt;Static Area / Immediate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decryption Timing&lt;/td&gt;
&lt;td&gt;Function Prologue&lt;/td&gt;
&lt;td&gt;Function Prologue&lt;/td&gt;
&lt;td&gt;Before Reference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decryption Location&lt;/td&gt;
&lt;td&gt;Static Area&lt;/td&gt;
&lt;td&gt;Stack Area&lt;/td&gt;
&lt;td&gt;Stack Area&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requires Source Change&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex Algorithms&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Not Suitable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decryption Timing: &lt;code&gt;Hikari&lt;/code&gt; decrypts once at the function prologue. While some other &lt;code&gt;OLLVM-based&lt;/code&gt; projects decrypt in an initialization function, that method has the disadvantage of plaintext appearing in the static area immediately after decryption.&lt;/li&gt;
&lt;li&gt;Language Support: &lt;code&gt;C++&lt;/code&gt; template methods are limited to &lt;code&gt;C++&lt;/code&gt;. While languages like &lt;code&gt;Rust&lt;/code&gt; have third-party libraries for similar results, all such methods require manual changes to the source code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Important: Most &lt;code&gt;OLLVM&lt;/code&gt; variants do not implement stack-based decryption because string constants are static data, making it difficult for the IR layer to determine if a string might "escape." In SLLVM, enabling &lt;code&gt;ce_mode_stack&lt;/code&gt; demotes strings from static data to stack data, which requires specific handling.&lt;/p&gt;

&lt;h4&gt;
  
  
  Showcase
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello sllvm&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CE Static Area&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftnfsce5c1ra9rtftijw7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftnfsce5c1ra9rtftijw7.png" alt="CE Static Area" width="600" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CE Stack Area&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtwleoedu76mnthplbvy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtwleoedu76mnthplbvy.png" alt="CE Stack Area" width="600" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Control Flow Flattening
&lt;/h3&gt;

&lt;p&gt;Transforms control flow from sequential execution into a switch-case loop structure. Key differences from &lt;code&gt;Hikari&lt;/code&gt; include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signature Weakening&lt;/strong&gt;: Significantly reduces common &lt;code&gt;FLA&lt;/code&gt; patterns, such as state variables, in-degrees, dispatcher blocks, and single-loop structures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exception Handling&lt;/strong&gt;: While Hikari cannot handle functions with exception handling, &lt;code&gt;SLLVM&lt;/code&gt; allows you to choose a specific handling method via the &lt;code&gt;fla_invoke_op&lt;/code&gt; parameter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  展示
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"not possible&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"no args&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d args&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FLA Full&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7n79q84oth5jrbvooip.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7n79q84oth5jrbvooip.png" alt="FLA Full" width="600" height="1518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bogus Control Flow
&lt;/h3&gt;

&lt;p&gt;Inserts "always-false" conditional branches into the sequential control flow. Key differences from &lt;code&gt;Hikari&lt;/code&gt; include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Release Stability&lt;/strong&gt;: The obfuscation is not reverted or optimized away by the compiler during &lt;code&gt;Release&lt;/code&gt; builds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilience to Static Analysis&lt;/strong&gt;: Resists "read-only data segment" attacks; the obfuscation remains intact even if the data segment is set to read-only in &lt;code&gt;IDA Pro&lt;/code&gt; (this feature relies on &lt;code&gt;bcf_use_var&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Showcase
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"not possible&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"no args&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d args&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BCF Constant&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8hbhz6xg6q9n6vq05re.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8hbhz6xg6q9n6vq05re.png" alt="BCF Constant" width="600" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BCF Variable&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn9rwyjy8xrmcfs8n2c09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn9rwyjy8xrmcfs8n2c09.png" alt="BCF Variable" width="600" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Novel Control Flow
&lt;/h3&gt;

&lt;p&gt;A brand-new obfuscation approach designed to counter tracing and symbolic execution by tools like Angr.&lt;/p&gt;

&lt;h3&gt;
  
  
  Function Wrapper
&lt;/h3&gt;

&lt;p&gt;Performs nesting on sub-functions directly called by the designated function. Key difference from &lt;code&gt;Hikari&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The obfuscation is not reverted or optimized away by the compiler during &lt;code&gt;Release&lt;/code&gt; builds.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Calling Convention Obfuscation
&lt;/h3&gt;

&lt;p&gt;Converts standard C calling conventions into randomized ones, altering the registers used for parameters and return values. Currently, this is partially implemented for ARM64.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fcc_num&lt;/code&gt;         Specifies the number of randomized calling conventions.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fcc_type&lt;/code&gt;        Specifies the type of customized calling convention, with the following values:

&lt;ul&gt;
&lt;li&gt;0 Uses only registers &lt;code&gt;X0~X8&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;1 Uses only integer registers.&lt;/li&gt;
&lt;li&gt;2 Uses only floating-point registers.&lt;/li&gt;
&lt;li&gt;10 Uses any available registers.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;fcc_narg_reg&lt;/code&gt;    Specifies the maximum number of parameters passed via registers; remaining parameters are passed via the stack.&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  Showcase
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a0=%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a1=%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a2=%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a3=%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a4=%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;a1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;a2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;a3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;a4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FCC using&lt;code&gt;X8(X8,X1,X6,...)&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsr6ivf54ec8t0xthtn9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsr6ivf54ec8t0xthtn9.png" alt="FCC_BASE" width="600" height="838"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FCC using&lt;code&gt;D26(D26,D2,X15,...)&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pwn02u4ej8xz1v655l4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pwn02u4ej8xz1v655l4.png" alt="FCC_FULL" width="600" height="860"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Indirect Branch
&lt;/h3&gt;

&lt;p&gt;Key differences from Hikari:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The obfuscation is not reverted by the compiler when compiling in &lt;code&gt;Release&lt;/code&gt; mode.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ibr_use_igv&lt;/code&gt; is similar to &lt;code&gt;Hikari&lt;/code&gt;'s &lt;code&gt;indibran-enc-jump-target&lt;/code&gt;. When combined with &lt;code&gt;ibr_use_dyn&lt;/code&gt;, it further enhances the obfuscation strength.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Showcase
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"not possible&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"no args&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d args&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;IBR Full&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyods24h56rv5d1523qvb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyods24h56rv5d1523qvb.png" alt="IBR Full" width="600" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  System Call Obfuscation
&lt;/h3&gt;

&lt;p&gt;Converts standard system call functions into direct &lt;code&gt;SVC&lt;/code&gt; (Supervisor Call) instructions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Showcase
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/tmp/1.txt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"r=%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SVC Base &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw56s6g8gwklwbqrgnofx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw56s6g8gwklwbqrgnofx.png" alt="SVC基础" width="600" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SVC Custom1&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwihcd2zwo7p8ynog77fi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwihcd2zwo7p8ynog77fi.png" alt="SVC Custom1" width="600" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Instruction Splitting
&lt;/h3&gt;

&lt;p&gt;Splits a function's instructions and scatters them across random addresses throughout the entire module.&lt;/p&gt;

&lt;h4&gt;
  
  
  Showcase
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"not possible&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"no arg&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d args&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"not possible&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"no arg&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"1 arg&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d args&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SPLIT Full&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ha8p6y43qwtn67n05p8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ha8p6y43qwtn67n05p8.png" alt="SPLIT Full" width="800" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Function Inlining
&lt;/h3&gt;

&lt;p&gt;Inlines all sub-functions called by a specified function into the current function's body.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security Protection
&lt;/h3&gt;

&lt;p&gt;Inserts anti-debugging logic directly into the specified functions.&lt;/p&gt;

</description>
      <category>llvm</category>
      <category>ollvm</category>
    </item>
    <item>
      <title>Implement ollvm with llvm pass</title>
      <dc:creator>lich0</dc:creator>
      <pubDate>Sat, 14 Feb 2026 04:14:57 +0000</pubDate>
      <link>https://dev.to/lich0/why-lich4ollvm-pass-deserves-attention-17ho</link>
      <guid>https://dev.to/lich0/why-lich4ollvm-pass-deserves-attention-17ho</guid>
      <description>&lt;h2&gt;
  
  
  Why &lt;code&gt;lich4/ollvm-pass&lt;/code&gt; is worth attention among “hundreds of OLLVM open-source projects”
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/lich4/ollvm-pass" rel="noopener noreferrer"&gt;GitHub - lich4/ollvm-pass: Independent hikari&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’ve been looking for OLLVM (Obfuscator-LLVM) related projects recently, you’ve probably run into a reality: &lt;strong&gt;there are tons of open-source repos, but not many that actually bring something new&lt;/strong&gt;. Many projects mainly port classic implementations to newer LLVM/Clang versions—useful, but limited when it comes to real-world engineering adoption and &lt;em&gt;controllable obfuscation&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;lich4/ollvm-pass&lt;/code&gt;&lt;/strong&gt;, however, has a very clear positioning: &lt;strong&gt;based on LLVM NewPassManager, it turns original OLLVM + Hikari-style implementations into standalone “passes,” and fills in what production use most often lacks— a policy system and Xcode integration.&lt;/strong&gt; &lt;/p&gt;




&lt;h2&gt;
  
  
  1) Most mainstream OLLVM projects focus on “version compatibility,” not “engineering enhancements”
&lt;/h2&gt;

&lt;p&gt;Common open-source OLLVM projects include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;obfuscator-llvm/obfuscator&lt;/strong&gt;: the earliest public Obfuscator-LLVM, implementing classic features such as substitution / bogus control flow / flattening.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HikariObfuscator/Hikari&lt;/strong&gt;: extends Obfuscator with string encryption, split basic blocks, function wrapping / call obfuscation, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KomiMoe/Arkari&lt;/strong&gt; (goron family): more focused on indirect calls/branches and adapts to newer LLVM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;za233/Polaris-Obfuscator&lt;/strong&gt;: adds some MIR-level obfuscation beyond IR (e.g., dirty bytes, MIR instruction substitution).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;open-obfuscator/o-mvll&lt;/strong&gt;: emphasizes “Python-driven + pass manager,” with broad feature coverage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The issue is: &lt;strong&gt;many derivative repos mainly add “compatibility with newer LLVM versions.”&lt;/strong&gt; But in real engineering scenarios—“obfuscate only key modules/functions,” “don’t explode build time,” “don’t increase app store release risk”—they often don’t provide a systematic solution. &lt;/p&gt;




&lt;h2&gt;
  
  
  2) From “patching LLVM source” to “dynamic passes”: the modern way to do OLLVM
&lt;/h2&gt;

&lt;p&gt;In the early days (LLVM 3.x era), OLLVM often meant &lt;strong&gt;directly modifying LLVM’s source&lt;/strong&gt;, largely because the ecosystem and mechanisms weren’t mature. Today, &lt;strong&gt;most IR-level obfuscation can be done via pass plugins.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A simplified evolution of LLVM’s pass mechanism:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LLVM 5–12: primarily &lt;strong&gt;LegacyPassManager&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;LLVM 13–14: Legacy by default, also supports &lt;strong&gt;NewPassManager&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;LLVM 15–present: &lt;strong&gt;NewPassManager&lt;/strong&gt; by default&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Engineering advantages of dynamic passes (pass plugins)
&lt;/h3&gt;

&lt;p&gt;This is one of the core values emphasized by &lt;code&gt;lich4/ollvm-pass&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Avoid the massive cost of building LLVM/Clang&lt;/strong&gt;: you can use the LLVM already installed on your system (Homebrew/apt, etc.) as long as the &lt;strong&gt;major Clang version matches&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast build and iteration&lt;/strong&gt;: the output is typically just a few-MB dynamic library, not a hundreds-of-MB clang binary or multi-GB toolchain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better developer experience&lt;/strong&gt;: writing passes, running them, validating IR output—iteration is faster and the barrier is lower.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That said, it’s important to acknowledge the boundaries: &lt;strong&gt;passes are hard to cover MIR/MC-level obfuscation&lt;/strong&gt; (which is why projects like Polaris add MIR-level enhancements). &lt;/p&gt;




&lt;h2&gt;
  
  
  3) What &lt;code&gt;lich4/ollvm-pass&lt;/code&gt; does: not “yet another port,” but a production-usable pass-based solution
&lt;/h2&gt;

&lt;p&gt;The project description is straightforward: based on &lt;strong&gt;LLVM NewPassManager&lt;/strong&gt;, it turns &lt;strong&gt;original OLLVM + Hikari&lt;/strong&gt; into independent passes, verifying that “IR-level obfuscation can be implemented as standalone passes,” and it’s tested on &lt;strong&gt;macOS 15 + LLVM 15–19&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;More importantly, it completes two capabilities that matter a lot for real adoption:&lt;/p&gt;




&lt;h3&gt;
  
  
  a) A “policy syntax”: precisely control obfuscation down to module/function via &lt;code&gt;policy.json&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;In real projects, many teams aren’t unwilling to obfuscate everything—they &lt;strong&gt;can’t&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The project/dependencies are huge; obfuscating irrelevant code bloats artifacts&lt;/li&gt;
&lt;li&gt;Heavy obfuscation (like flattening) slows builds drastically or even causes stalls&lt;/li&gt;
&lt;li&gt;After obfuscation, runtime overhead can become obvious for complex algorithms (flattening often causes ~10% level overhead)&lt;/li&gt;
&lt;li&gt;Over-obfuscation may increase compliance/review risk for App Store / Google Play (these points are explicitly mentioned in the README)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So in practice, &lt;strong&gt;“controllable obfuscation” matters more than “obfuscation exists.”&lt;/strong&gt; Traditional open-source OLLVM controls are often either too coarse (module-only), too intrusive (requires code changes), or limited by language (e.g., annotations that mainly work for C/C++).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;ollvm-pass&lt;/code&gt;’s approach:&lt;/strong&gt; use a &lt;code&gt;policy.json&lt;/code&gt; in the working directory to declare rules—compatible with most frontends and languages—distinguishing module-level and function-level strategies; also supports “forward override,” optional field comments, IR dump, and other engineering features.&lt;/p&gt;

&lt;p&gt;You can think of it as: &lt;strong&gt;upgrading obfuscation switches from compiler flags / code intrusion to an auditable, reusable, version-controllable policy configuration&lt;/strong&gt;—critical for large, multi-module, multi-language builds (especially on mobile). &lt;/p&gt;




&lt;h3&gt;
  
  
  b) Xcode integration: a realistic integration path for iOS/macOS projects
&lt;/h3&gt;

&lt;p&gt;Many people hit the same pitfall: &lt;strong&gt;open-source clang ≠ Apple clang shipped with Xcode&lt;/strong&gt;; pass plugins don’t always “just work” inside Xcode. &lt;code&gt;ollvm-pass&lt;/code&gt; provides three practical routes in its README:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Xcode, set &lt;code&gt;CC&lt;/code&gt; to open-source clang and add &lt;code&gt;-fpass-plugin&lt;/code&gt; in &lt;code&gt;Other C Flags&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In Xcode, set &lt;code&gt;CC&lt;/code&gt; to a script: first &lt;code&gt;clang -emit-llvm&lt;/code&gt; to produce bitcode, then run passes with &lt;code&gt;opt&lt;/code&gt;, then &lt;code&gt;clang -c&lt;/code&gt; to output an object file (the repo provides the author’s script &lt;code&gt;xcode_cc.sh&lt;/code&gt;), and notes this is more friendly for &lt;strong&gt;arm64e&lt;/strong&gt; compatibility&lt;/li&gt;
&lt;li&gt;Build a dynamic pass specifically for Apple clang (hard: must handle symbol conflicts; better for LLVM experts)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The value here is: it doesn’t just say “it’s theoretically possible”—it lays out &lt;strong&gt;real, workable engineering integration paths&lt;/strong&gt;, including ready-to-use scaffolding (scripts). &lt;/p&gt;




&lt;h2&gt;
  
  
  Who is this for?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You don’t want to build a multi-GB toolchain just for one OLLVM setup, and you want &lt;strong&gt;“compile the pass in minutes, validate immediately.”&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You need &lt;strong&gt;“obfuscate only key modules/functions”&lt;/strong&gt; in a real production codebase, and you want policies that are versioned and auditable&lt;/li&gt;
&lt;li&gt;You target iOS/macOS (Xcode / Apple clang ecosystem) and want a practical integration path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If OLLVM is “just for running a demo,” then many porting repos are enough. But if you want it &lt;strong&gt;in production—controllable and maintainable—&lt;/strong&gt;then the direction of &lt;strong&gt;pass-based + policy-based + Xcode-adapted&lt;/strong&gt; like &lt;strong&gt;&lt;code&gt;lich4/ollvm-pass&lt;/code&gt;&lt;/strong&gt; is much closer to an engineering-grade answer. &lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/lich4/ollvm-pass" rel="noopener noreferrer"&gt;GitHub - lich4/ollvm-pass: Independent hikari&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lich4/awesome-ollvm" rel="noopener noreferrer"&gt;GitHub - lich4/awesome-ollvm: List of (truly) awesome Obfuscator-LLVMs and IDA deobfuscation plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lich4.github.io/cpp_posts/20240826_ollvm/" rel="noopener noreferrer"&gt;OLLVM learning | Chao’s blog&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>security</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
