llvm學(xué)習(xí)日記十四:Xcode 調(diào)試開發(fā) Pass

參考:https://mayuyu.io/2017/06/01/LLVMHacking-0x1/

一、目的:

使用xcode更方便的調(diào)試和開發(fā)pass

二洒敏、創(chuàng)建llvm的xcode工程:

cmake指定生成xcode工程之前龄恋,先創(chuàng)建一個(gè)新的空的pass,然后在cmake生成xcode工程凶伙,在xcode項(xiàng)目中可以看到新模塊郭毕,我使用的版本是llvm9.0.0

  1. 創(chuàng)建空文件:
  • 頭文件:
    include/llvm/Transforms/Obfuscation/SymbolObfuscation.h
  • cpp文件:
    lib/Transforms/SymbolObfuscation/SymbolObfuscation.cpp
  • 相關(guān) CMakeLists 的配置不在贅述,看過前幾小節(jié)的應(yīng)該知道
  1. cmake指定xcode工程:
mkdir build_xcode
cd build_xcode
cmake -G Xcode CMAKE_BUILD_TYPE="Debug" ../llvm
  1. 打開xcode工程:
  • 首次打開時(shí)函荣,時(shí)間充足時(shí)可以全部構(gòu)建一遍显押,選擇ALL BUILD扳肛,時(shí)間略長(zhǎng);
  • 也可以在 manage scheme 選擇時(shí)選擇手動(dòng)管理乘碑,添加 opt 模塊 挖息、clang模塊和 LLVMSymbolObfuscation 模塊,這樣節(jié)省時(shí)間兽肤,也只需要編譯這倆模塊套腹;
  • 可以看到新創(chuàng)建的pass模塊:loadabl modules --> LLVMSymbolObfuscation


    image.png

三、pass的調(diào)試與開發(fā):

  1. 完善頭文件與cpp文件內(nèi)容资铡,我這里參考張總的教程电禀,創(chuàng)建一個(gè)簡(jiǎn)單符號(hào)混淆的pass
  • 頭文件內(nèi)容:

#include "llvm/Pass.h"

#define DEBUG_TYPE "symbolobf"

namespace llvm {
    ModulePass* createSymbolObfuscationPass();
//    void initializeSymbolObfuscationPass(PassRegistry &Registry);
}

  • cpp文件代碼:

#include "llvm/IR/Instructions.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Transforms/Obfuscation/SymbolObfuscation.h"
#include <string>
#include <iostream>
#include <cstdlib>

using namespace llvm;
using namespace std;
static string obfcharacters="qwertyuiopasdfghjklzxcvbnm1234567890";
namespace llvm{
    struct SymbolObfuscation : public ModulePass {
        static char ID;
        int seed = 0;
        SymbolObfuscation() : ModulePass(ID) {}
        string randomString(int length){
            string name;
            name.resize(length);
            srand(seed);
            seed++;
            for(int i=0;i<length;i++){
                name[i]=obfcharacters[rand()%(obfcharacters.length())];
            }
            return name;
        }
        bool runOnModule(Module &M) override {
            //F.setName(randomString(16));
            errs()<<"Start Symbol Rewrite!\n";
            for(Module::iterator Fun=M.begin();Fun!=M.end();Fun++){
                Function &F=*Fun;
                if (F.getName().str().compare("main")==0){
                    errs()<<"Skipping main\n";
                }
                else if(F.empty()==false){
                    //Rename
                    string newname = randomString(16);
                    errs()<<"Renaming Function: "<<F.getName()<<" --> New Name: "<<newname<<"\n";
                    F.setName(newname);
                }
                else{
                    errs()<<"Skipping External Function: "<<F.getName()<<"\n";
                }
            }
            
            return true;
        }
    };
    ModulePass * createSymbolObfuscationPass() {return new SymbolObfuscation();}
}

char SymbolObfuscation::ID = 0;
//INITIALIZE_PASS(SymbolObfuscation, "symbolobf", "Rewrite Symbols",
//                false, false)
static RegisterPass<SymbolObfuscation> X("symbolobf", "Rewrite Symbols", false, false);

  1. 單獨(dú)調(diào)試這一個(gè)pass需要使用opt模塊調(diào)用:
  • 構(gòu)建庫LLVMSymbolObfuscation:
    選擇 模塊 LLVMSymbolObfuscation 構(gòu)建,command + B 編譯笤休;


    image.png
  • 構(gòu)建opt模塊:
    選擇 模塊 opt 構(gòu)建尖飞,command + B 編譯,時(shí)間略長(zhǎng)店雅;


    image.png
  • 設(shè)置opt調(diào)用參數(shù):
    opt的用法不再贅述政基,文檔:https://llvm.org/docs/CommandGuide/opt.html

    image.png

輸入的 .ll 文件時(shí)自己寫的一個(gè)測(cè)試代碼,如下:

#include <stdio.h>

static int add(int x, int y) {
    return x + y;
}

int sub(int x, int y) {
    return x - y;
}

int main(){
    printf("%d",add(3,4));
    printf("%d",sub(5,4));
    return 0;
}

生成 .ll 文件:
clang -c test_symbolobf.c -o test_symbolobf.ll -emit-llvm -S

  • 斷點(diǎn)調(diào)試:
    上述全部OK后闹啦,可以直接在源文件打斷點(diǎn)調(diào)試:
    如圖沮明,斷點(diǎn)調(diào)試查看設(shè)置前的隨機(jī)字符串。


    image.png
  1. 查看符號(hào)替換的結(jié)果:
  • 可以直接調(diào)試打印IR查看:


    image.png
  • 直接查看生成的文件:
    opt生成的bitcode亥揖,需要先轉(zhuǎn)換為文本IR:
    llvm-dis /Users/qinyao/LLVM/test_symbolobf/test_symbolobf.ll.bc
    查看 llvm-dis 生成的IR:
    image.png

四珊擂、擴(kuò)展:

符號(hào)混淆是一個(gè)比較難處理的點(diǎn),涉及系統(tǒng)函數(shù)以及導(dǎo)出函數(shù)费变,所以 hikari 也并沒有開放這個(gè)功能摧扇,作為學(xué)習(xí)還不錯(cuò);
現(xiàn)在 llvm 在utils目錄下有自帶的 SymbolRewriter.cpp Pass挚歧,下一節(jié)章節(jié)分析一下扛稽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市滑负,隨后出現(xiàn)的幾起案子在张,更是在濱河造成了極大的恐慌,老刑警劉巖矮慕,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帮匾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痴鳄,警方通過查閱死者的電腦和手機(jī)瘟斜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人螺句,你說我怎么就攤上這事虽惭■眨” “怎么了汁汗?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵喊衫,是天一觀的道長(zhǎng)惭等。 經(jīng)常有香客問我,道長(zhǎng)祈坠,這世上最難降的妖魔是什么纷跛? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任扫夜,我火速辦了婚禮谱邪,結(jié)果婚禮上疚膊,老公的妹妹穿的比我還像新娘。我一直安慰自己虾标,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布灌砖。 她就那樣靜靜地躺著璧函,像睡著了一般。 火紅的嫁衣襯著肌膚如雪基显。 梳的紋絲不亂的頭發(fā)上蘸吓,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音撩幽,去河邊找鬼库继。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窜醉,可吹牛的內(nèi)容都是我干的宪萄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼榨惰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼拜英!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起琅催,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤居凶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后藤抡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侠碧,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年缠黍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弄兜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挨队,靈堂內(nèi)的尸體忽然破棺而出谷暮,到底是詐尸還是另有隱情,我是刑警寧澤盛垦,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布湿弦,位于F島的核電站,受9級(jí)特大地震影響腾夯,放射性物質(zhì)發(fā)生泄漏颊埃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一蝶俱、第九天 我趴在偏房一處隱蔽的房頂上張望班利。 院中可真熱鬧,春花似錦榨呆、人聲如沸罗标。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闯割。三九已至,卻和暖如春竿拆,著一層夾襖步出監(jiān)牢的瞬間宙拉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工丙笋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谢澈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓御板,卻偏偏與公主長(zhǎng)得像锥忿,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稳吮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容