作者EdisonX (卡卡兽)
看板C_and_CPP
标题[讨论] 部份隐藏 dll functions
时间Sun Dec 1 14:22:13 2013
环境主要有两种情况,不过我想应该大同小异
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
1F:推 soheadsome:推程式设计师的自我修养 中国真的不少这样有水准的书 12/01 15:09
2F:推 cobrasgo:老实说还是走license吧,不然你maintain会很痛苦 12/01 15:11
3F:→ cobrasgo:没有license,用了就告你,这是我工作几年得到的最佳解 12/01 15:12
5F:→ purpose:面的 IS_INTERNAL 就可以产生不同版本的 dll 供内外部使用 12/01 19:28
6F:→ EdisonX:谢谢 purpose , 用 macro 控制也是一方法. 12/01 20:05
7F:→ EdisonX:@cobrasgo: 简单的说,我是供应商,不是客户端,是要防破的. 12/01 20:06
8F:推 Bencrie:c 是在说供应商没错啊 12/01 22:04
9F:→ Bencrie: ^大 12/01 22:04
10F:→ EdisonX:了解. 12/01 22:14
11F:→ azureblaze:破解vs防破解 防破解的那方付出的成本永远比较高 12/01 23:22
12F:→ EdisonX:@azureblaze , 我知道您说的, 只是有时候决策不是我能定的 12/01 23:35
13F:→ EdisonX:可以的话我也希望用几支 keyfile 就过去了 Orz 12/01 23:35
14F:→ hichcock:若要只能在公司内部用的话, API 内键连结 server 最简单 12/02 10:27
15F:→ hichcock:连不到 server 自动回传 false就好 12/02 10:28
16F:→ hichcock:server 找公司内的一台电脑架就可以了 12/02 10:28
17F:推 loveflames:用RPC做? 12/02 12:29
18F:→ EdisonX:h 大和 l 大说的意见不错,之前没想过可以这样搞 12/03 23:45