2010-09-10 111 views
5

我已經編寫了一個包含幾個.h文件和.c文件的C庫。我將它編譯爲一個.a靜態庫。提供隱藏內部函數的C API的最佳實踐

我想僅向用戶公開某些功能,並儘可能使其餘部分保持「不明顯」,以使逆向工程非常困難。

理想的情況下我的圖書館將包括:

-1-酮.h文件中只向用戶公開

2- myLibrary.a功能:作爲聯合國reversengineerable儘可能

什麼這是最佳做法嗎?我應該在哪裏看,有沒有好的教程/書籍?

更具體地說:

爲 - 1

我已經有我所有的.h和.c的工作,我想避免周圍改變它們,從.H移動函數聲明以.c和去轉化爲循環參考電位pbs。那可能嗎?

例如,創建一個新的.h文件是一個好主意,我只用它來分發我的.a文件?該.h將包含我想要公開的函數的副本,並轉發我使用的類型的聲明。這是一個好主意嗎?

爲 - 2

一)什麼GCC標誌(或Xcode中)應我知道(用於剝皮,沒有調試符號等) B)一個很好的指針,以瞭解如何做代碼混淆?

任何想法會有所幫助,

感謝,巴巴

+0

請顯示您已經編寫的一些代碼。我們不是您的個人代碼服務 – 2018-02-14 11:17:46

回答

7

通常的做法是確保每個函數和全局變量僅在某個模塊內部使用,並在該模塊中聲明爲static。這限制了來自單個模塊的內部實現細節的暴露。

如果您需要在模塊間進行交叉但不爲公共使用的內部實現細節,則聲明一個或多個.h文件,這些文件保持私密狀態並且不會傳遞給最終用戶。以這種方式定義的對象的名稱對鏈接器(以及諸如objdumpnm之類的工具)仍然可見,但其詳細簽名將不會顯示。

如果您有傳遞給最終用戶但不透明的數據結構,那麼可以考慮讓API將它們作爲指向struct的指針,該指針由公共API .h文件中未定義的來聲明。這將保護類型安全,同時隱藏實現細節。自然,完整的struct定義在私人文件.h中。

小心謹慎,您可以保留一個部分記錄的公開已知的struct這是一個真正定義的類型雙關語,但只公開成員。這更難以保持最新,如果你這樣做了,我會確保有一些強大的測試用例來驗證公共版本在所有重要方面實際上等同於私有版本。

當然,使用strip刪除調試段,以便內部細節不會以這種方式泄漏。

有一些工具可以混淆所有僅用於內部使用的名稱。如果作爲構建過程的一部分運行,則可以使用內部調試版本,其中包含所有內容的明智名稱,併發佈一個命名所有內部函數和全局變量的構建,其名稱只有鏈接器可以喜歡。

最後,習慣於任何可以使用的人使用您的圖書館將能夠在某種程度上對您的圖書館進行逆向工程。有可以採取反調試措施,但恕我直言,這就是瘋狂和挫折。

+0

我有疑問。如何將標誌__attribute __((visibility(「default」)))僅用於他希望在整個lib的編譯標誌中公開和傳遞-fvisibility = hidden的函數。我不確定這裏的逆向工程過程。 – 2010-09-11 07:10:25

+0

即使沒有符號,只要代碼可以運行並且物理硬件可用於檢查,也可以進行逆向工程。它可能不是微不足道的,但它仍然是可能的。圖書館的情況稍差,因爲您確實需要允許合法用戶引用* some *符號。 – RBerteig 2010-09-13 07:33:02

1

我沒有其他的快速解答,而不是探索使用的「靜態」的功能。我會推薦閱讀Miro Samek關於他所謂的「C +」的工作。基本上面向對象的ANSI C.非常棒的閱讀。他擁有Quantum跳躍軟件。