1 回答

TA貢獻1856條經(jīng)驗 獲得超11個贊
問題是faketime
使用LD_PRELOAD
環(huán)境變量來指示程序的動態(tài)加載器libfaketime
在啟動時加載。libfaketime
將執(zhí)行所謂的“插入” - 用這些例程的自己的副本替換正常的動態(tài)庫例程 - 這樣當將來進行動態(tài)庫調(diào)用時,libfaketime
可以影響發(fā)生的事情。特別是,libfaketime
插入與時間相關(guān)的調(diào)用,因此它能夠向程序返回假值。
這適用于大多數(shù)程序的原因是它們用于libc
進行系統(tǒng)調(diào)用。libc
提供與系統(tǒng)調(diào)用交互的高級函數(shù),使系統(tǒng)編程更容易。在大多數(shù)使用 的語言中libc
,二進制文件是動態(tài)鏈接的,這意味著它libc
實際上并不包含在二進制文件中,而是預(yù)期libc
在運行二進制文件時系統(tǒng)上將存在(稱為“目標文件”)的編譯版本,然后就可以加載動態(tài)庫了。這種動態(tài)加載是faketime
通過LD_PRELOAD
指令實現(xiàn)的,它改變了加載器的行為。
然而,Go 有兩個不同之處。首先,它是靜態(tài)鏈接的,因此沒有加載器可以關(guān)注LD_PRELOAD
. 其次,它不使用libc
,因此即使它是動態(tài)鏈接的,并且該LD_PRELOAD
技巧有效,libc
也永遠不會被調(diào)用,因此它實際上仍然無法實現(xiàn)欺騙程序使用假時間函數(shù)的預(yù)期目標。
- 1 回答
- 0 關(guān)注
- 404 瀏覽
添加回答
舉報