看板 C_and_CPP 關於我們 聯絡資訊
環境主要有兩種情況,不過我想應該大同小異 VC6.0 / Win XP VS2010 / Win 7 , Win 8 問題敘述 手邊的 dll source code 準備要 release 出去,然後部份 functions, global variable 必須隱藏起來 (假設叫 HideFunc 及 HideVar ), 不讓收到 release 版 source code 知道,但必須還要達成一個需求 簡單的說,公司內部的人必須可以自由調用 HideFunc 及 HideVar, 而 release 給公司以外之客戶不能調用 HideFunc 及 HideVar, 目前專案是將 HideFunc 及 HideVar 直接寫死在 dll 裡面,希望能有 最小幅度修改,達成以上需求。 我的解法 查過、試過一些方式,目前我是從 VS 的 def 檔做下手,用下面手法完成 HideFunc @1 NONAME 這樣下來,從 DumpBin.exe 或從 DepenceWalker 沒辦法取得其 func name , 而 HideVar 就算不特別動手腳,試過 DumpBin.exe 及 DepenceWalker 似乎沒辦法取得 HideVar ? 不用特別針對 dll 裡之 variable 動手腳? (這點想問是不是我測試結果有問題) 接下來的測試結果如下 (1) release 出去的版本只附 .h , .dll ,不對 HideFunc 及 HideVar 做 import , 即使使用 LoadLibrary , GetProcAddress 還是抓不到 HideFunc 與 HideVar , 這樣收到 dll 之 client 其實在使用上也麻煩,一般的 dll 函式要抓進來就要 走 LoadLibrary ,沒有 lib 做入口。 (2) 內部使用的版本會再附 .lib , HideFunc , HideVar 就不走 LoadLibrary, GetProcAddress 取出,直接走 #pragma comment(lib, "my.lib") 去引入。 接下來我有二個問題 (1) MSDN 上其實有記載, 用 def 去做 NONAME 隱藏,其實還是可以由 dumpbin 得到的 order 及 address 去把 function 調用出來,但這部份我不知道實際上 是怎麼實現的?是直接去分析 PE header ? 還是一般會有更簡便或通用的方式? 如果只由 order 及 address 把 func 調用出來很麻煩,或其實這技術還不 普及,我想可能還是考濾走這方法 (前提是若我沒找到比這方法更快速維護的) (2) 想請問版上先進,是否有不同的方式去達到相同之效果?由於目前只是在評估 階段,想多了解一下其他實現方式,像是安全性更高、或是更容易維護之類的, 這些我都想多了解。 參考書籍 程式設計師的自我修養 - CH 9 msdn : exporting from a dll using def files http://msdn.microsoft.com/en-us/library/d91k01sh.aspx 謝謝各位不吝賜教,感激不盡。 -- If there is no tomorrow, I want to see u last time. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.74.188
soheadsome:推程式設計師的自我修養 中國真的不少這樣有水準的書 12/01 15:09
cobrasgo:老實說還是走license吧,不然你maintain會很痛苦 12/01 15:11
cobrasgo:沒有license,用了就告你,這是我工作幾年得到的最佳解 12/01 15:12
purpose:http://dll_hide_part.codepad.org/ 修改標頭檔 my.h 裡 12/01 19:27
purpose:面的 IS_INTERNAL 就可以產生不同版本的 dll 供內外部使用 12/01 19:28
EdisonX:謝謝 purpose , 用 macro 控制也是一方法. 12/01 20:05
EdisonX:@cobrasgo: 簡單的說,我是供應商,不是客戶端,是要防破的. 12/01 20:06
Bencrie:c 是在說供應商沒錯啊 12/01 22:04
Bencrie: ^大 12/01 22:04
EdisonX:了解. 12/01 22:14
azureblaze:破解vs防破解 防破解的那方付出的成本永遠比較高 12/01 23:22
EdisonX:@azureblaze , 我知道您說的, 只是有時候決策不是我能定的 12/01 23:35
EdisonX:可以的話我也希望用幾支 keyfile 就過去了 Orz 12/01 23:35
hichcock:若要只能在公司內部用的話, API 內鍵連結 server 最簡單 12/02 10:27
hichcock:連不到 server 自動回傳 false就好 12/02 10:28
hichcock:server 找公司內的一台電腦架就可以了 12/02 10:28
loveflames:用RPC做? 12/02 12:29
EdisonX:h 大和 l 大說的意見不錯,之前沒想過可以這樣搞 12/03 23:45