O-MVLL介绍

O-MVLL的开发灵感来自于另一个著名的基于LLVM的代码混淆项目ollvm,并在其基础上做了创新和改进。O-MVLL的混淆逻辑实现方式也是通过LLVM Pass,支持也仅会支持ARM64架构,根据作者所说,这是由于当初的设计选择。此外,作者还使用了pybind11,用户可以使用python脚本来对O-MVLL进行配置,从而灵活的运用作者封装好的各种代码混淆方式。

混淆后的可执行文件相比于正常编译的可执行文件来说,抵抗逆向工程的能力增强,但与源代码的功能相同,能够在一定程度上保护源代码和程序,增加逆向工程的分析成本。

作者的介绍文档: O-MVLL Documentation (obfuscator.re)

开源项目github地址: GitHub - open-obfuscator/o-mvll: O-MVLL is a LLVM-based obfuscator for native code (Android & iOS)

作者的工作邮箱: ping@obfuscator.re(可以向他提交bug和issues,也可以问他一些项目的问题,回复很快,赞)

目前项目包含了7种代码混淆方式,它们分别是:Anti-Hooking,Arithmetic Obfuscation,Control-Flow Breaking,Control-Flow Flattening,Opaque Constants,Opaque Fields Access Strings Encoding。它们的实现细节分析见下一篇随笔O-MVLL代码混淆方式 - Uiharu - 博客园 (cnblogs.com)

项目编译安装

编译方式可见作者的介绍文档中,Compilation一栏。作者提供了Linux、macOS两个平台的编译方式,并且提供了docker file。这里简单介绍下使用docker 的编译安装方式

拉取docker镜像并下载依赖

$ docker pull openobfuscator/omvll-ndk
$ git clone https://github.com/open-obfuscator/o-mvll.git $ curl -LO https://data.romainthomas.fr/omvll-deps-ndk-r25.tar
$ mkdir -p ./third-party
$ tar xvf omvll-deps-ndk-r25.tar -C ./third-party
$ docker run -it openobfuscator/omvll-ndk

进入docker容器内部,将下载的依赖和文件复制过来

$ docker cp ./third-party $你的容器id:/
$ docker cp ./o-mvll $你的容器id:/

之后给予文件运行权限并运行

$ chmod +x /o-mvll/scripts/docker/ndk_r25_compile.sh
$ sh /o-mvll/scripts/docker/ndk_r25_compile.sh

此时完成整个项目的构建。

下载Clang from NDK

项目构建完成后,需要使用ndk的clang来调用该项目作为编译过程中的插件,因此还需要安装ndk clang,可以在此处下载:NDK 下载  |  Android NDK  |  Android Developers (google.cn)

选择Linux64位的下载,解压后复制到docker容器中,解压后的文件夹中的toolchains/llvm/prebuilt/linux-x86_x64/bin中包含有ndk所使用的clang,为了方便调用,可以将该路径加入到环境变量当中,之后在命令行中使用clang,即表示使用该路径下的ndk的clang。

基本使用

现在我们编写了一个文件名为main.c的程序,将要使用O-MVLL对其进行混淆,可以使用如下指令得到一份混淆后的可执行文件main:

$ clang --target=aarch64-linux-android21 -fpass-plugin=libOMVLL.so main.c -o main

其中,-fpass-plugin指定的动态链接库即为O-MVLL项目编译出来的文件,其位置应该处于o-mvll/src/build_ndk_r25当中。由于O-MVLL仅支持aarch64,因此还需要使用--target指明目标架构。或者也可以直接使用

$ aarch64-linux-android21-clang -fpass-plugin=libOMVLL.so main.c -o main

这样就不用显式地使用target指明目标架构了

配置文件omvll_config.py

之前提到,O-MVLL做出的创新是使用pybind11提供了pythonAPI,以供用户配置代码混淆的方式,因此在执行上述指令之前,需要配置好omvll_config.py文件。

O-MVLL将会尝试在调用clang的目录下寻找该文件,如果找不到该文件,就会报错

...
error: ModuleNotFoundError: No module named 'omvll_config'
make: *** [Makefile:31: strings.bin] Error 1

可以通过环境变量来指明omvll_config.py的路径和文件名,像这样:

export OMVLL_CONFIG=~/project/obfu/config_test.py

这样O-MVLL就会去寻找~/project/obfu/config_test.py作为混淆的配置文件

配置文件中必须要实现一个名为omvll_get_config的函数,和一个继承自omvll.ObfuscationConfig的类,omvll_get_config的返回值必须是这个类才行。

这个函数由pass调用,从而访问用户定义的混淆方案,因为混淆的配置必须是唯一的,因此作者强烈建议使用@functools来包装这个函数:

import omvll
from functools import lru_cache class MyConfig(omvll.ObfuscationConfig):
def __init__(self):
super().__init__() @lru_cache(maxsize=1)
def omvll_get_config() -> omvll.ObfuscationConfig:
"""
Return an instance of `ObfuscationConfig` which
aims at describing the obfuscation scheme
"""
return MyConfig()

现在,我们可以在MyConfig中配置我们的混淆方案了。例如调用字符串混淆时,就需要重写obfuscate_string(self, module: omvll.Module, func: omvll.Function, string: bytes)这个函数。

该函数的输入为继承自llvm:Module的omvll:Modul,继承自llvm:Function的omvll:Fcuntion以及传入的字符串,它会遍历每个模块当中每个函数中调用的字符串。当函数的返回值为true或者某个字符串时,启动字符串混淆

class MyConfig(omvll.ObfuscationConfig):
def __init__(self):
super().__init__() def obfuscate_string(self, module: omvll.Module, func: omvll.Function,
string: bytes): if func.name == "hello":
return True if b"debug.cpp" in string:
return "<REMOVED>" return False

上述配置,就会将函数名为hello的函数中的字符串进行加密,并且将程序中包含debug.cpp的字符串替换为<REMOVED>

O-MVLL:支持ARM64的基于LLVM的代码混淆模块的更多相关文章

  1. 实战FFmpeg编译支持arm64(转)

    App store要求上架的app必须支持arm64.而手中的ffmpeg还不支持arm64, 百度下ffmpeg支持arm64方法,网上有很多资料.其中一篇是使用脚本自动编译实现的.本文就是使用它的 ...

  2. ios 编译openssl支持arm64(转)

    最近在编译支付宝 快捷支付(无线) ios 端的时候发现demo不支持arm64.在网上找了下,看到客服说是openssl的库文件不支持arm64,于是自己编译了支持arm64的库文件,发现还是不行, ...

  3. Android 开发:开源库Speex支持arm64的动态库文件

    随着处理器制造工艺的不断进步,和Android系统的不断发展,最近出了arm64-v8a的架构,由于项目中用到了speex的第三方语音编解码的动态库,其他架构的处理器暂不用说,一切正常,唯独到arm6 ...

  4. Ubuntu 18.04 使用apt-get 华为源支持 arm64 鲲鹏处理器

    网上搜的源,什么阿里云163等等的,都不支持arm64 执行以下代码,使用华为源 wget -O /etc/apt/sources.list https://repo.huaweicloud.com/ ...

  5. openerp模块收藏 基于Lodop的报表打印模块(转载)

    基于Lodop的报表打印模块 原文:http://shine-it.net/index.php/topic,7397.0.html 前段时间写了个小模块,来解决OE中报表打印不方便的问题.借鉴了 @b ...

  6. 基于ProGuard-Maven-Plugin的自定义代码混淆插件

    介绍 大家可能都会碰到一些代码比较敏感的项目场景,这个时候代码被反编译看到就不好了,这个时候就需要代码混淆插件来对代码进行混淆了. 基于Maven的项目一般会去考虑使用proguard-maven-p ...

  7. ANTS Performance Profiler 8:支持对Web请求、异步代码和WinRT的性能剖析

    下载与激活:http://download.csdn.net/detail/lone112/6734291 离线激活   位于英国的Red Gate Software有限公司最近发布了ANTS Per ...

  8. uiautomatorviewer 优化定位符生成,支持生成Java,Python自动化代码

    项目介绍 二次开发 uiautomatorviewer 优化定位符生成,支持生成Java,Python自动化代码,修复自带工具画面有动态加载时截图失败问题,优化自带工具截图速度 ,实现类似录制脚本功能 ...

  9. CodeMirror:基于JavaScript的代码编辑器

    官方网站定义: http://codemirror.net/ CodeMirror is a versatile text editor implemented in JavaScript for t ...

  10. 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.0.0版)

    TableGo v6.0.0 版震撼发布,此次版本更新如下: 1.UI界面大改版,组件大调整,提升界面功能的可扩展性. 2.新增BeautyEye主题,界面更加清新美观,也可以通过配置切换到原生Jav ...

随机推荐

  1. 使用docker-compose.yml安装rabbitmq集群

    1.拉取镜像 集群中每个节点都需要执行 docker pull rabbitmq:3.8.3-management 2.上传docker-compose文件,设置可执行权限 相关文地址:https:/ ...

  2. 2. 在 Kubernetes 上安装 Gitlab

    总结: 所需要的三个yaml文件的下载地址:https://files.cnblogs.com/files/sanduzxcvbnm/k8s-gitlab.zip Gitlab官方提供了 Helm 的 ...

  3. GitLab 之 Git LFS 大文件存储的配置

    转载自:https://cloud.tencent.com/developer/article/1010589 1.Git LFS 介绍 Git 大文件存储(Large File Storage,简称 ...

  4. 安装 Ubuntu 教程

    1.选择中文安装 2.****到了如下界面,我们点击继续: 3.然后点击,现在安装: 4.****到了这界面,点击继续: 5.如下,输入你的位置,随便输入就好: 6.****然后选择汉语,点击继续: ...

  5. 学习ASP.NET Core Blazor编程系列四——迁移

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  6. JavaScript基本语法(JavaScript代码嵌入方式与声明和使用变量)

    .JavaScript代码嵌入方式 #①HTML文档内 JavaScript代码要写在script标签内 script标签可以写在文档内的任意位置 为了能够方便查询或操作HTML标签(元素)scrip ...

  7. 4.RabbitMQ系列之发布/订阅模式

    我们把一个消息转发给多个消费者,这种模式称之为发布-订阅模式 1.交换器(Exchange) RabbitMq消息模式的核心思想是:一个生产者并不会直接往一个队列中发送消息,事实上,生产者根本不知道它 ...

  8. Vue学习之--------绑定样式、条件渲染、v-show和v-if的区别(2022/7/12)

    文章目录 1.绑定样式 1.1 基础知识 1.2 代码实例 1.3 测试效果 2.条件渲染 2.1 基本知识 2.2 代码实例 2.3 测试效果 1.绑定样式 没啥好说的.我觉得还没直接引入外部写好的 ...

  9. Apple Low Power DisplayPort(ALP_DP)学习随笔

    edp是PC内置显示接口的主流标准,主用于笔记本电脑或PAD上,普遍用于中大尺寸PANEL. 系统架构如下: apple 的ALP_DP 源于edp 1.4(edp1.4又是源于DP V1.2a版本) ...

  10. CVE-2021-44832 log4j_2.17.0 RCE复现与吐槽

    先说一句,这傻x洞能给cve就离谱,大半夜给人喊起来浪费时间看了一个小时. 先说利用条件: 需要加载"特定"的配置文件信息,或者说实际利用中需要能够修改配置文件(你都能替换配置文件 ...