惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
T
Threat Research - Cisco Blogs
GbyAI
GbyAI
Y
Y Combinator Blog
美团技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 【当耐特】
S
SegmentFault 最新的问题
IT之家
IT之家
Recent Announcements
Recent Announcements
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
阮一峰的网络日志
阮一峰的网络日志
T
The Blog of Author Tim Ferriss
Martin Fowler
Martin Fowler
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
WordPress大学
WordPress大学
博客园 - Franky
L
LangChain Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
博客园 - 叶小钗
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
雷峰网
雷峰网
腾讯CDC
Google DeepMind News
Google DeepMind News
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Help Net Security
Help Net Security
C
Check Point Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
N
News and Events Feed by Topic
V2EX - 技术
V2EX - 技术
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Schneier on Security
Schneier on Security
博客园 - 聂微东
A
Arctic Wolf
H
Heimdal Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
The Exploit Database - CXSecurity.com
C
Cyber Attacks, Cyber Crime and Cyber Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Google DeepMind News
Google DeepMind News

博客园 - 至尊王者

使用 Android Lua Helper 在VSCODE中调试安卓Lua应用 lua语言特性及用途 Ollvm混淆与反混淆: goron框架字符串加密的实现原理 安卓使用OLLVM混淆.so reinterpret_cast和其它cast的区别 雷电9中使用Fiddler抓包 ubuntu 22.04离线安装cuda 11.7.1、cudnn 8.9.3.28、nccl 2.18.3、tensorrt 8.6.1 C/C++程序隐藏符号 配置ETH 2.0 同步节点 Nethermind & Prysm rust在windows上编译openssl mac 远程桌面 the user account did not work的解决办法 MacOS静态编译ffmpeg 4.4.1、x264、x265等编解码库的脚本 Linux、Windows静态编译ffmpeg 4.4.1、x264、x265等编解码库的脚本 Visual Studio 2022 Key 在Docker中安装宝塔面板 idea/clion行注释位置(不在首列,注释就靠近代码块) linux手动编译llvm/clang linux与windows双系统保持时间同步 Puppeteer: 等待打开一个新页面
Ollvm混淆与反混淆: Goron框架编译与使用
至尊王者 · 2024-05-22 · via 博客园 - 至尊王者

很多App实现的定制ollvm框架中都有goron框架的影子,或多或少的借鉴了它的功能,包括

间接跳转,并加密跳转目标(-mllvm -irobf-indbr)
间接函数调用,并加密目标函数地址(-mllvm -irobf-icall)
间接全局变量引用,并加密变量地址(-mllvm -irobf-indgv)
字符串(c string)加密功能(-mllvm -irobf-cse)
过程相关控制流平坦混淆(-mllvm -irobf-cff)
想要了解怎么针对这些混淆功能完成去混淆,势必要先对其混淆过程有所了解,那么第一步就是对goron框架的编译使用

一、环境配置

环境:MacBook Pro 16G
cmake:cmake version 3.26.3
Android Studio NDK:21.1.6352462

二、编译过程

2.1 工程选定

git clone https://github.com/amimo/goron.git
cd goron
git checkout llvm-9.0.0

2.2 编译

cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_PROJECTS=clang -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/You/Install/Dir/llvm-project-install -S llvm -B build
cmake -B build -- -j12 install

LLVM_ENABLE_PROJECTS:参数只需开启clang编译器一个工程即可 CMAKE_INSTALL_PREFIX:(可选参数)设置编译后可执行文件、动态库、静态库、头文件等等统一的放置路径

编译完成之后就可以在bin目录下看到这些可执行文件了

FileCheck                       llvm-cat                        llvm-opt-fuzzer
arcmt-test                      llvm-cfi-verify                 llvm-opt-report
bugpoint                        llvm-config                     llvm-pdbutil
c-arcmt-test                    llvm-cov                        llvm-profdata
c-index-test                    llvm-cvtres                     llvm-ranlib
clang                           llvm-cxxdump                    llvm-rc
clang++                         llvm-cxxfilt                    llvm-readelf
clang-9                         llvm-cxxmap                     llvm-readobj
clang-check                     llvm-diff                       llvm-rtdyld
clang-cl                        llvm-dis                        llvm-size

三、集成到NDK

替换原有的NDK目录下的clang文件即可,首先在local.properties中配置好ndk.dir,接着替换clang、clang++文件即可

cp /Path/You/Install/Dir/llvm-project-install/bin/clang-9 /Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang
cp /Path/You/Install/Dir/llvm-project-install/bin/clang-9 /Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++

配置完clang之后还需要在build.gradle中配置需要混淆组件,如下

defaultConfig {
    applicationId "com.example.myapplication"
    minSdk 24
    targetSdk 33
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    externalNativeBuild {
        cmake {
            cppFlags "-mllvm -irobf-cff"
        }
    }
}

配合so函数如下

#include <jni.h>
#include <string>

char text[256] = {0};
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */,
        jint val) {
    if (val == 0) {
        strcpy(text, "Hello from C++");
    }
    else if (val == 1) {
        strcpy(text, "value is 1");
    }
    else if (val == 2) {
        strcpy(text, "value is 2");
    }
    else if (val == 4) {
        strcpy(text, "value is 4");
    }
    else if (val == 8) {
        strcpy(text, "value is 8");
    }
    else if (val == 16) {
        strcpy(text, "value is 16");
    }
    else if (val == 32) {
        strcpy(text, "value is 32");
    }
    else if (val == 64) {
        strcpy(text, "value is 64");
    }
    else if (val == 3) {
        strcpy(text, "value is 3");
    }
    else if (val == 65535) {
        strcpy(text, "value is 65535");
    }
    else {
        strcpy(text, "value is default");
    }
    return env->NewStringUTF(text);
}

运行查看效果

四、混淆效果对比

  • fla混淆后的效果

  • cse混淆后的效果

    每个字符都对应一个加密函数

  • indgv混淆后的效果

    字符串都通过全局变量来获取

  • icall混淆后的效果

  • indbr混淆后的效果

    截断了函数流程