第一個 LLVM Pass 體驗 (小白筆錄)

小白筆錄、大佬跳過。

這種技術、盡然遇到了,最好作一個筆錄,畢竟在開發中不經常使用,說不許明天就忘記了。也並不是無端造輪子,而是由於在研究的過程當中發現經過官方文檔以及網上不少大佬的步驟有所懸殊,因此想從新記錄一下。html

0x00 準備

記得更新 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 的插件開發。學習

0x01 Hello World

從第一小節生成的 Xcode 項目中就已經有 Hello 的 Pass 實現了,以下所示:測試


其中 LLVMHello.dylib 就是 Build 後生成的。在這裏還須要說明一下,選中 Hello.cpp 而後 Show In Finder 一下,會發現這個文件是在這裏的:


如上圖所示,自定義 Pass 區域中有一個目錄 Obfuscation 就是 Hikari 的核心實現。
關於 LLVMHello.dylib 的更多細節,參考官方文檔 WritingAnLLVMPass,我艹,盡然有官方文檔,我還在這裏寫個毛啊! 小哥哥不要着急,我不是那種寫個博客都要 copy 官方文檔的屌絲,很是討厭那樣的屌絲,純粹的浪費別人的時間。總之,我在看完官方文檔以後,我蒙圈了,多是文檔過久了,也有多是個人理解有偏差。具體我遇到的問題,請看下節介紹。

0x10 遇到的問題

一、在官方文檔中,提到一個 .so 文件,我是一直沒有找見,我看到的是 LLVMHello.dylib
二、opt 是什麼,是命令?個人終端爲何沒有,難道是過期了?網上其它大佬的博客中也有提到,可是不知道是怎麼來的?後來才發現,這個 opt 也是 LLVM 的一部分。ui

0x11 運行步驟

一、Build Hello

Build Hello Pass,生成 LLVMHello.dylibspa

二、測試代碼

建立一個 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.cmain.bc 放到這個目錄中吧:

三、運行 opt

在 Xcode 中切換到 opt 的 Scheme,而後編輯其 Scheme 的配置,以下:


OK、運行 opt 吧,具體運行多長時間,聽天由命吧,下圖是個人運行時長:


可是最終倒是是成功了:


好了,你們能夠鼓掌了...👏...👏...👏...
以上是屬於 Xcode 的實時調試,仍是很方便的。經過對 Scheme 的配置,咱們也能看出來,咱們運行 opt 的目的就是觸發 Pass 的功能,因此在 opt 運行成功以後,在 bin 目錄中就有 opt 應用文件了:


因此能夠直接 cd 到 bin 目錄中這麼執行:

> ./opt -load ../lib/LLVMHello.dylib -hello -disable-output ../main.bc
複製代碼

打印結果是這樣的:


厲害了,不少大佬在博客中,就直接這麼介紹的,因此我懵逼了整整一個早上。

總結

至此,一個簡單的 Pass 流程就走完了,很神奇吧,自始至終我沒寫過一句代碼。可是在過程當中也學習到很多的東西、萬丈高樓平地起,關於 Pass 的實現以及運用還需更多的時間去研究。Hikari 纔是個人核心。

相關文章
相關標籤/搜索