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
,成功!
之所以int8ty
、int16ty
、int32ty
更常用,是因為它們對應了byte
、word
、dword
等型別,可以直接通過彙編指令表示。為了**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
仍然是基於byte
、dword
等型別實現,並且仍然需要引入額外的開銷來進行組合。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建立模擬環境 分析之前,首先保留受害系統在可疑 執行前的快照 同時也需要執行乙個可對初始化時的系統狀態和 執行後的系統狀態進行比較的工具。執行前的準備 系統和網...