首頁
社區(qū)
課程
招聘
逃逸變量的判斷為什么是這樣的I.isUsedOutsideOfBlock(&BB)

為什么當(dāng)前指令在其他基本塊中使用了,就算是逃逸變量了呢?

收藏
2條回答
34r7hm4n 2023-6-1

注意看fixstack函數(shù)的源碼,只有在判斷指令類型是AllocaInst的情況下才會修復(fù):https://github.com/bluesadi/Pluto-Obfuscator/blob/3c332857429162015aef94d875eafc95a60112f8/llvm/lib/Transforms/Obfuscation/Utils.cpp#L30

回復(fù) 已采納
ashLL: 那是不是應(yīng)該這樣寫啊
  if  (!(isa<AllocaInst>(&I)  &&  I.getParent()  ==  &entryBB)  &&
                                        isa<AllocaInst>(&I)&&I.isUsedOutsideOfBlock(&BB))
回復(fù) 2023-6-2
34r7hm4n: @AshCrimson 抱歉,這里說錯了。不是只處理AllocaInst指令,是除了在入口塊的AllocaInst指令都要處理,包括Add指令,Load指令之類的。
回復(fù) 2023-6-3
34r7hm4n: @AshCrimson 就比如說`x  =  add  y,  z`指令在別的基本塊被使用了,就說明那個基本塊使用了x變量,這時候把x稱為逃逸變量。
回復(fù) 2023-6-3
34r7hm4n 2023-6-1 2023-6-1編輯

在fixStack里只會處理AllocaInst指令,所以這里的I的類型是AllocaInst,可以看作是C語言里的定義變量操作。I.isUsedOutsideOfBlock(&BB)也就是判斷AllocaInst對應(yīng)的變量有沒有在當(dāng)前基本塊以外被使用。

 

假設(shè)原程序在一個基本塊中定義了變量a,在這個基本塊的下一個基本塊中使用了變量a。這時候編譯這個程序不會出問題,因為編譯器知道變量a在被使用之前一定在前一個基本塊被定義了。

 

然而平坦化之后基本塊之間的順序被打亂了,編譯器也無法知道變量a在使用之前會不會被定義,所以會在編譯時直接報錯。解決這個問題的方法是把所有a變量的定義提前到函數(shù)的入口塊,這個過程就叫做修復(fù)逃逸變量。更具體的解釋可以看我在看雪上發(fā)的文章:https://bbs.kanxue.com/thread-268789.htm

回復(fù)
LLVM與代碼混淆技術(shù)
  參與學(xué)習(xí)     326 人
  提問次數(shù)     12 個
《LLVM與代碼混淆技術(shù)》詳解3種經(jīng)典代碼混淆方式+2種變體
0
我的提問
0
我的回答
0
學(xué)習(xí)收益