LLVM程式分析日記之getIntNTy

2022-07-06 22:18:13 字數 1627 閱讀 8017

llvm ir中慣用的integertype主要是:

但是,今天注意到了乙個有意思的api:

static integertype * 	getintnty (llvmcontext &c, unsigned n)
從而,我們可以定義任意長度的integertype,能夠更加靈活地使用llvm玩出花樣。以下給出乙個例子,在這個例子中,我們希望提取字串的前n位元組(n <= 8)。

原始程式demo.c:

unsigned long long str2hex(char *buf) 

int main()

我們的目標是插樁democ.c的str2hex()函式,使該函式返回char *buf的前n = 6個位元組的hex形式。

為了實現該目標,我們需要編寫乙個llvm pass,其中主要邏輯如下:

for (llvm::function &f : m) 

}}

插樁後的demo.ll如下:

define i64 @str2hex(i8*) #3
執行lli demo_instrumented.bc,輸入abcdefghijk,輸出666564636261,成功!

之所以int8tyint16tyint32ty更常用,是因為它們對應了byteworddword等型別,可以直接通過彙編指令表示。為了**intnty,即任意長度的整型在x86彙編中的實現,我們將上一小節中的demo.c編譯成可執行檔案,並通過gdb反彙編來檢視插樁**的實現:

push   rbp

mov rbp,rsp

mov eax,dword ptr [rdi]

mov ecx,eax

movzx eax,word ptr [rdi+0x4]

mov edx,eax

shl rdx,0x20

or rcx,rdx

mov qword ptr [rbp-0x8],rdi

mov rax,rcx

pop rbp

ret

可以看到,對於6位元組的intnty,彙編中首先讀取乙個4位元組的dword,接著讀取乙個2位元組的word,然後通過「移位」與「或」操作組合成乙個6位元組的值。

顯然,intnty提供了更方便的方式,讓我們可以在插樁時使用乙個任意長度的整型值。但是,從彙編角度,當llvm ir最終編譯成彙編**時,intnty仍然是基於bytedword等型別實現,並且仍然需要引入額外的開銷來進行組合。llvm ir只不過是將基礎型別「組合」的部分進行了封裝,提供了便捷但並不會提公升效率。

日記之php程式除錯

2014年7月22號 涼風習習 感覺涼爽 心情不錯 記錄一 80埠被占用。關掉80埠方法一 cmd 想不起來,有空補上。方法二 控制面板 管理工具 服務,找到wordld wide web publishing service,關掉。記錄二 安裝memcache 原始碼包準備 1,memcached...

2440裸機程式分析之led

今天 用心 把 led 顯示 的原理弄懂了一下。注釋如下 首先,對照著tq 2440 v2原理圖觀察到了4個led燈的管腳分別為gpb5,gpb6,gpb7,gpb8.有詳細觀察 發現gpb共有11個管腳 其中gpb0到gpb3為高電平有效,gpb4到gpb10為低電平有效,這不是用0 x 就可以控...

linux取證之可疑程式分析

對可疑惡意 的取證需要在安全和可靠的環境中進行,應將可疑檔案放置在隔離環境或者沙箱系統網路中。檢查惡意程式的準則 建立環境基準 vmware建立模擬環境 分析之前,首先保留受害系統在可疑 執行前的快照 同時也需要執行乙個可對初始化時的系統狀態和 執行後的系統狀態進行比較的工具。執行前的準備 系統和網...