我想混淆 C 程式二進制檔案中的特定字串,使其更難分析。我知道如果在除錯器中運行它,這不會阻止某人看到字串。是的,這只是混淆視聽。
每一個混淆的實體都會引發一場討論,說它沒有任何價值。這個也是!我知道一個有能力和堅定的攻擊者將能夠恢復字串。為了論證起見,假設我正在為 X 歲兒童撰寫游戲,要隱藏的字串是一個 URL,只有在他們擊敗游戲后才會呼叫,并且他們的名字將被添加到名人堂。可以合理地假設,除了在十六進制編輯器中打開二進制檔案之外,大多數 X 歲的孩子都沒有其他技能。謝謝!
是否有一些優雅的方法可以在編譯時進行隱藏,也許使用 C 前處理器和宏?
到目前為止,我看到的是Yuri Slobodyanyuk 提出的建議,結果如下:
#define HIDE_LETTER(a) (a) 0x50
#define UNHIDE_STRING(str) do { char * ptr = str ; while (*ptr) *ptr -= 0x50; } while(0)
...
char str1[] = { HIDE_LETTER('s'), HIDE_LETTER('e'), HIDE_LETTER('c'), HIDE_LETTER('r'), HIDE_LETTER('e'),
HIDE_LETTER('t'), '\0' };
UNHIDE_STRING(str1); // unmangle the string in-place
它有效,但有點難看。?? 也許有人知道更好的解決方案?
我對 gcc 特定的東西很好。
PS:對于 C ,Adam Yaxley 在 github 上有一個解決方案,但我正在尋找 C,而不是 C 。在https://github.com/TwizzyIndy/hkteam_obfuscator有一個帶有小助手程式的解決方案
uj5u.com熱心網友回復:
這個怎么樣:
#define STRING "Obfuscated"
#define Makestr(i) string[i] = STRING[i]
char string[11];
Makestr(6); Makestr(5);
Makestr(9); Makestr(7);
Makestr(0); Makestr(3);
Makestr(2); Makestr(4);
Makestr(1); Makestr(8);
Makestr(10);
這通常會編譯為等價于
string[6] = 97; string[5] = 99;
string[9] = 100; string[7] = 116;
string[0] = 79; string[3] = 117;
string[2] = 102; string[4] = 115;
string[1] = 98; string[8] = 101;
string[10] = 0;
如果您使用strings或 十六進制編輯器查看目標檔案,則根本不會有明顯的字串。(但是,如果您在除錯器中單步除錯代碼,您很快就能弄清楚它在做什么。真的沒有辦法解決這個問題。)
您還可以擾亂單個字符,如您原來的問題:
#define Makestr(i) string[i] = STRING[i] 0x50
我,我會擔心溢位,所以我可能會這樣做
#define Makestr(i) string[i] = STRING[i] ^ 0x55
現在你得到相當于
string[6] = 177;
或者
string[6] = 52;
, 等等。
顯然,在這些情況下,您當然必須在運行時另外取消隱藏構造的字串。
我不得不使用 clang-O強制它折疊常量而不是在目標檔案中發出原始字串;使用 gcc 它立即起作用。
但是,如果您的字串更長,隨機打亂的Makestr呼叫序列可能會變得非常笨拙。
uj5u.com熱心網友回復:
首先,請注意,與技術手段相比,某些法律方法(由付費律師審查的合同)可能更好地解決您的問題。
您的方法類似于Caesar cypher(數千年前已被破解:洞察力:計算字母的頻率;在人類英語中,e是最常見的一種)。即使是德國的Enigma 機器在二戰中也做得更好。閱讀Alan Turing在 WW2 期間的作品(他的團隊破解了 Enigma 機器加密)。
是否有一些優雅的方法可以在編譯時做到這一點,也許使用 C 前處理器和宏?
不,那里沒有
(以及文獻中存在的數學證明,由與Frama-C或網路安全或Coq證明助手相關的書籍涵蓋;注意賴斯定理;另請閱讀關于互動式定理證明和軟體開發的Berto-Caseran 書籍ISBN 3-540- 20854-2)
這種證明的論證是基于基數的。您還可以使用概率方法:在您的程式中存盤一些神秘的哈希碼(例如,在構建時由crypt(3)計算)并從用戶輸入中詢問密鑰等...
任何專業黑客都可以在技術上(可能在作業數周后)找到您的“秘密”字串。或者在BinSec上作業或使用BinSec 的同事。
但是,您可以撰寫一些元程式,將您的混淆字串生成為 C 代碼(#include在編譯時為-d),并在您的程式中添加一些反混淆例程。
我對 gcc 特定的東西很好。
在大型程式上,考慮開發你的GCC 插件(也許從Bismon開始)。另請參閱解碼器專案。
但是要注意賴斯定理。閱讀P vs NP 問題。
還可以考慮#include使用GPP 之類的工具生成一些 C 代碼(可能是一些-d 標頭)。
代碼混淆是一個有會議的話題。你參加過其中任何一個嗎?許多論文存在于 ACM 會議中。
也可能存在法律問題(可能與GDPR相關)。你應該聯系你的律師。在法國,請參閱《刑法典》第323條。
如果您的代碼在連接到 Internet 的計算機上運行并與用戶互動,請考慮采用SaaS方法:您可以在每次運行時(或每月一次)使用VISA卡要一些錢……您的銀行會適當地向您出售軟體和權限。
我正在為 8 歲的孩子撰寫游戲,要隱藏的字串是一個 URL,只有在他們擊敗游戲后才能呼叫,并且他們的名字將被添加到名人堂。可以合理地假設大多數 8 歲的孩子除了在十六進制編輯器中打開二進制檔案之外沒有其他技能。
我現在沒有一個 8 歲的孩子能夠做到這一點,而那些做到這一點的人應該被添加到您的名人堂中。如果您確實在撰寫游戲,我建議將 URL 設為明文。
注意。舊的XPM程式可能是鼓舞人心的,RefPerSys和 Jacques Pitrat 的最后一本書人造人,有意識機器的良心(ISBN-13: 978-1848211018) 也是如此。請隨時通過電子郵件[email protected](家庭)或[email protected](辦公室,在CEA LIST)與我聯系以獲取更多資訊。
附注。當然考慮在該主題上開始攻讀博士學位!在法國,在ENS或Ecole Polytechnique。法蘭西學院有一些有趣的相關講座。在德國,Frauhaufer Cyber??Security 實驗室。可能,聯邦國防軍會資助你在德國的研究(但我在那里沒有關系),還有ITEA4。當然,您將花費三到四年的全職時間來找到足夠好的解決方案。請在arxiv上發表論文。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/356325.html
