這種技術、盡然遇到了,最好作一個筆錄,畢竟在開發中不經常使用,說不許明天就忘記了。也並不是無端造輪子,而是由於在研究的過程當中發現經過官方文檔以及網上不少大佬的步驟有所懸殊,因此想從新記錄一下。html
記得更新 cmake:brew upgrade CMake
接下來直接使用 Hikari
做爲引子,clone 其相關代碼:git
> git clone --recursive -b release_80 https://github.com/HikariObfuscator/Hikari.git Hikari
> cd Hikari
> git submodule update --remote --recursive
> cd ../
> mkdir BuildXcode
> cd BuildXcode
> cmake -G Xcode ../Hikari
複製代碼
以上的命令能夠經過
&&
進行鏈接一次性執行的。github
其中、最後一個 cmake 的操做大概半個小時。結束以後的目錄是這樣的:bash
在這裏多說一嘴,本節這些操做是對 LLVM 編譯都須要作的。只是每次編譯 LLVM 的目的不一樣罷了。咱們都清楚 LLVM 的功能是不少、很強大的,當前文檔主要是介紹 Pass
, 可是除了 Pass
, 還有其它:ClangPlugins: LLVM 的插件開發。學習
從第一小節生成的 Xcode 項目中就已經有 Hello 的 Pass 實現了,以下所示:測試
LLVMHello.dylib
就是
Build
後生成的。在這裏還須要說明一下,選中
Hello.cpp
而後 Show In Finder 一下,會發現這個文件是在這裏的:
Obfuscation
就是
Hikari
的核心實現。
LLVMHello.dylib
的更多細節,參考官方文檔
WritingAnLLVMPass,我艹,盡然有官方文檔,我還在這裏寫個毛啊! 小哥哥不要着急,我不是那種寫個博客都要 copy 官方文檔的屌絲,很是討厭那樣的屌絲,純粹的浪費別人的時間。總之,我在看完官方文檔以後,我蒙圈了,多是文檔過久了,也有多是個人理解有偏差。具體我遇到的問題,請看下節介紹。
一、在官方文檔中,提到一個 .so
文件,我是一直沒有找見,我看到的是 LLVMHello.dylib
。
二、opt 是什麼,是命令?個人終端爲何沒有,難道是過期了?網上其它大佬的博客中也有提到,可是不知道是怎麼來的?後來才發現,這個 opt
也是 LLVM 的一部分。ui
Build Hello
Pass,生成 LLVMHello.dylib
。spa
建立一個 Coder.c
文件,代碼詳情以下:插件
#include <stdio.h>
void funcTest() {
printf("funcTest\n");
}
int main() {
funcTest();
printf("CoderHG\n");
return 1;
}
複製代碼
史上最乾淨的代碼,沒有半行註釋。生成 .bc 文件以供備用:3d
> clang -emit-llvm -c Coder.c -o main.bc
複製代碼
注意,也像我同樣,將 Coder.c
與 main.bc
放到這個目錄中吧:
在 Xcode 中切換到 opt 的 Scheme,而後編輯其 Scheme 的配置,以下:
opt
吧,具體運行多長時間,聽天由命吧,下圖是個人運行時長:
opt
運行成功以後,在 bin 目錄中就有 opt 應用文件了:
> ./opt -load ../lib/LLVMHello.dylib -hello -disable-output ../main.bc
複製代碼
打印結果是這樣的:
至此,一個簡單的 Pass 流程就走完了,很神奇吧,自始至終我沒寫過一句代碼。可是在過程當中也學習到很多的東西、萬丈高樓平地起,關於 Pass 的實現以及運用還需更多的時間去研究。Hikari
纔是個人核心。