我想用各種信息位「水印」一個C++二進制文件。在構建時包含這些信息很困難,因爲我不控制構建過程。到目前爲止,我唯一的想法是從here得到的,它是一個腳本,當它給出一個C++二進制文件時,會產生一個Bash腳本,如下所示。用位信息註釋一個C++二進制
簡而言之,它在原始二進制文件中附加了一個bash if-else,用於檢查第一個參數是否爲「--version」(在這種情況下是回聲信息)或不是(在這種情況下,它簡單地解碼爲文件「originalBinary」然後運行./originalBinary)。
這顯然是不理想的:
- 我現在有二進制文件(這對於大型二進制文件可能會有問題)2份和
- 過程運行由
./originalBinary
這是混淆了有人開始誰也不知道發生了什麼事情
什麼我不知道是我是否會能夠做到像有某種特殊exec $0
更換./originalBinary
電話,我可以人所以告訴exec不要從頭開始讀取文件,而是用100個字符的偏移量(或者開頭的Bash位的長度)。
另一個想法是讓Bash腳本自己編輯,即用sed刪除它的前21行,調用./$0
來調用它自己,然後在./$0
命令返回時附加if-else後面。然而,這看起來很脆弱(如果機器在通話返回之前崩潰,該怎麼辦?)。
最後,我得到的印象是,作爲連接器將通過在beginnig bash的東西被搞糊塗了,當它試圖加載庫:(
或者這將當二進制是一個共享資源失敗, ,你可以建議任何其他方式註釋一個C++二進制後構建?
我認爲準備一個具有所需信息的對象文件,而不是鏈接到給定的二進制文件,但這需要我以某種方式將ELF轉換回進入它的目標文件,將我的目標文件添加到列表中,然後重新鏈接(我從here得到印象,這可以用objcopy
,但我還沒有設法得到這個工作)。此外,這種方法的問題在於,沒有好的方法來獲取信息,例如用「--version」調用二進制文件。
我試圖做什麼不可能?我希望我解釋清楚。
謝謝。
#!/bin/bash
function PrintInformation()
{
echo "various bits of information"
}
if [[ $# -eq 1 && "$1" == "--version" ]]; then
PrintInformation
exit 0
else
uudecode $0
./originalBinary
exit 0
fi
begin 755 originalBinary
M?T5,[email protected](!`0````````````(`/@`!````X`9```````!``````````'`1````
M`````````$``.``)`$``'@`;``8````%````0`````````!``$```````$``
M0```````^`$```````#X`0````````@``````````P````0````X`@``````
M`#@"0```````.`)````````<`````````!P``````````0`````````!````
M!0````````````````!``````````$```````*0*````````I`H`````````
M`"````````$````&````\`T```````#P#6```````/`-8```````6`(`````
M``"8`P``````````(````````@````8````@#@```````"`.8```````(`[email protected]
M``````#``0```````,`!````````"``````````$````!````%0"````````
M5`)```````!4`D```````$0`````````1``````````$`````````%#E=&0$
M````L`D```````"P"4```````+`)0```````-``````````T``````````0`
M````````4>5T9`8`````````````````````````````````````````````
M````````````"`````````!2Y71D!````/`-````````\`[email protected]``````#P#6``
...............// my uuencode'd binary here
end
你想對你的程序接受命令行參數? – andre
這裏「註釋」是什麼意思?添加原始應用程序中不存在的cmd行參數?運送一個調用foo.bin的包裝腳本foo的問題在哪裏(如firefox et。al。這樣做)? – PlasmaHH
命令行參數僅用於從二進制文件中獲取信息的便捷方式。通過「註釋」,我的意思是一個簡單的數據塊,比如生成日期和版本號。不幸的是,包裝腳本不是一個選項 - 它太侵入(必須堅持現狀) –