跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

admin 2022年2月8日23:16:11评论77 views字数 3681阅读12分16秒阅读模式






跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

         因为相信   所以看见       






00
前言和环境相关




写这篇文章之前,我在ubuntu20.04编译了一波ollvm4.0,中间遇到了很多坑爹问题。然后几乎看完了网上所有的相关文章。

还把ollvm git上面的几乎所有编译报错的反馈都看了。

终于解决了遇到的大部分问题,然后有了这篇文章。

没说解决所有问题,就是因为其实编译的时候,过程其实有点翻车。

虽然成功生成了混淆用的clang文件,并不影响混淆。但是,编译到99%的时候失败了,一些文件并没有正确生成。(编译4次,1次成功,3次99%失败)

大佬们如果知道更好的方法,也可直接私信跟我说,不胜感激。

公号不能留言,害。坑爹。


初始环境:

ubuntu20.04 
gcc 9.3.0
g++ 9.3.0
cmake 3.16.3

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0


ubuntu20.04 编译ollvm4.0 分为5步

  1. 下载ollvm 4.0源码 (啥,觉得老?初学者的话 4.0跟12.0对你来说区别不大)

  2. 配置编译工具

  3. 修改ollvm源码(改一个类型就可)

  4. 编译 ollvm

  5. 配置 ndk

01
下载ollvm 4.0源码



ollvm git地址:https://github.com/obfuscator-llvm/obfuscator

下载 ollvm 4.0代码

git clone -b llvm-4.0 --depth=1 https://github.com/obfuscator-llvm/obfuscator.git

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

这里  -b  llvm-4.0是选择 llvm-4.0的分支  

--depth=1 表示只下载最后一次提交的版本

这样的话,项目文件就不会太大。毕竟github连接速度感人。


02
配置编译工具



编译ollvm要用到的工具是

cmake
gcc
g++

1) 安装cmake



这里 cmake 直接安装最新版就可以了

sudo apt-get install cmake -y

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0


2) 安装 gcc-8 g++-8 降低版本


这里有坑的是 gcc g++

大佬们 gcc 和 g++的版本如果就是 8.x.x

这里就可以直接下一步了

如果是gcc-9 g++-9 那你就有的玩

铁头实测, gcc-9 g++-9 编译一定会失败。

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

会有这样的报错信息:

make: *** [Makefile:152:all] Error 2

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

所以,这里安装编译工具的时候,要安装gcc-8 g++-8

sudo apt-get install gcc-8 g++-8 -y

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

安装完之后,配置一下优先级,好让我们调用gcc g++的时候,默认调用的是 gcc8 g++8

下面的命令可以配置软件的优先级,后面可以根据需要,去选择默认的版本

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 9

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0


3) gcc切换版本 默认gcc 8





sudo update-alternatives --config gcc  

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

4) g++切换版本 默认g++ 8


sudo update-alternatives --config g++

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

成功切换版本

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0



03
修改ollvm源码



不修改的话,会有这样的报错信息

bfuscator/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h:696:26: error: could not convert ‘((llvm::orc::remote::OrcRemoteTargetClient*)this)->callBllvm::orc::remote::OrcRemoteTargetRPCAPI::ReadMem(Src, Size)’ from ‘Expected<vector<unsigned char,allocator>>’ to ‘Expected<vector<char,allocator>>’ return callB(Src, Size);

进入   你的ollvm目录/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h

定位到第690行 把char 改成 uint_8

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0


04
编译 ollvm



好的 ,到这里前期环境就配置好了 可以直接编译了

mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/
make -j7


跟着铁头干混淆2 ubuntu20.04编译ollvm4.0


跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

编译快慢看配置  2-3个小时正常的

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

编译到后面,即使没有到 100%全部成功, 只要4个关键文件clang clang++ clang-4.0 clang-format 是在的

照样进行混淆 不用慌,小场面

05
配置 ndk



配置ndk分为以下几步。

1) 下载ndk


根据自己需要去选版本,我这里选的是 ndk-16b

ndk下载网址:https://developer.android.google.cn/ndk/downloads/

这个网址只有最新版的ndk,想下载之前的版本,可以手动点击下面的链接,去找自己想要的版本


跟着铁头干混淆2 ubuntu20.04编译ollvm4.0


跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

这里多说一句,如果嫌下载速度慢,除了花钱升级宽带,还可以复制链接去迅雷下。

这里我已经下载并解压到了本地  

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

2) 配置ndk环境变量


执行命令,打开配置文件

gedit ~/.bashrc

把下面这两行粘贴到文件末尾, 注意,替换路径成自己下载的ndk路径

export NDK_HOME=/home/wtt/env/android/ndk/android-ndk-r16b/
export PATH=$NDK_HOME:$PATH

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

最后执行命令,使配置文件生效

source ~/.bashrc

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0


3) 复制编译好的4个 clang 文件到ndk目录



好,这里大佬们已经下载完ndk了。这一步是把之前 ollvm编译好的文件复制到ndk目录

这一步比较简单, 直接复制粘贴就可。cv工程师的看家本领。

把olvm刚编译好的 clang clang-4.0 clang++ clang-format 文件

粘贴到ndk目录  

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

粘贴到  

 你自己的ndk目录/toolchains/llvm/prebuilt/linux-x86_64/bin

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

粘贴4个文件

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0


4) 复制build目录的 3个头文件到ndk目录


同时,为了避免后续的编译错误

就像下图,会报错找不到头文件

fatal error 'Stddef.h' file not found
fatal error 'Stdarg.h' file not found
fatal error '__stddef_max_align_t.h' file not found

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

在build目录搜索3个文件 然后继续发挥大佬们的cv神功。

粘贴到 上面报错的路径 就ok了

这个路径是你ndk目录下的

sources/cxx-stl/system/include/

找到刚刚的build目录 也就是编译好文件的输出路径

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

搜索stdarg stddef  

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

至此,环境部分,基本完成,

06
大吉大利 晚上吃鸡



这个时候,大佬们可以尝试编译一波了

新建jni目录  目录下新建3个文件

Android.mk  

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := wtt
LOCAL_SRC_FILES := test.cpp
include $(BUILD_EXECUTABLE)

Application.mk  

APP_ABI := armeabi armeabi-v7a arm64-v8a
APP_PIE:= true
APP_CPPFLAGS := -frtti -std=c++11 -mllvm -fla -mllvm -bcf -mllvm -sub

test.cpp

#include <cstdio>

int main(int n_argc, char** argv)
{
int n_num = n_argc * 2;
//scanf("%2d", &n_num);

if (20 == n_num)
{
puts("20");
}
if(10 == n_num)
{
puts("10");
}
if(2 == n_num)
{
puts("2");
}

puts("error");

return -1;
}

在jni同级目录 打开命令行 执行

ndk-build

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0


06
混淆效果



未混淆前流程图:

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

混淆后流程图:

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

成功混淆


关于作者:


一个乙方安全公司搬砖的菜鸡,移动安全从业者。最近忙着找女票,忙着在b站当扑街up主。


b站/公众号 :  移动安全王铁头  


希望和大佬们一起学习,一起成长




跟着铁头干混淆2 ubuntu20.04编译ollvm4.0
跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

点个

跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

在看

你最好看

本文始发于微信公众号(移动安全王铁头):跟着铁头干混淆2 ubuntu20.04编译ollvm4.0

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月8日23:16:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   跟着铁头干混淆2 ubuntu20.04编译ollvm4.0https://cn-sec.com/archives/481643.html

发表评论

匿名网友 填写信息