- 已关闭**。此问题为opinion-based。当前不接受答案。
- 想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。
四年前关闭了。
Improve this question
我写了一个C库,它包含一些. h文件和. c文件。我把它编译成一个. a静态库。
我想只向用户公开某些函数,而其余的函数尽可能地"模糊",以使逆向工程变得相当困难。
理想情况下,我的库将包括:
1-一个. h文件,其中仅包含向用户公开的函数
2-我的资料库a:尽可能不可逆向工程
这方面的最佳实践是什么?我应该在哪里找,哪里有好的教程/书吗?
更具体地说:
用于-1
我已经有了我所有的. h和. c工作,我想避免改变他们左右,移动函数声明从. h到. c和进入循环引用潜在的pbs.这可能吗?
例如,创建一个新的. h文件,只用于和我的. a一起分发,这是一个好主意吗?. h将包含我想要公开的函数的副本,并转发我使用的类型的声明。这是一个好主意吗?
用于-2
a)我应该知道什么gcc标志(或xcode)(用于剥离,没有调试符号等)b)学习如何进行代码模糊的好指针?
任何想法都会有帮助,
谢谢,爸爸
3条答案
按热度按时间zfciruhq1#
通常的做法是确保每个只在某个模块内部使用的函数和全局变量在该模块中声明为
static
,这样可以限制单个模块内部实现细节的暴露。如果您需要跨模块的内部实现细节,但不公开使用,则声明一个或多个
.h
文件,这些文件保持私有,不提供给最终用户。以这种方式定义的对象的名称对链接器(以及objdump
和nm
等工具)仍然可见,但其详细签名不可见。如果您有一些数据结构要交付给最终用户,但它们是不透明的,那么请考虑让API将它们作为指向
struct
的指针来交付,该struct
由公共API.h
文件中的not defined声明。这将保留类型安全,同时隐藏实现细节。当然,完整的struct
定义位于私有.h
文件中。你可以小心地保留一个公开的
struct
,它是真实的定义的一个类型双关语,但是它只公开了public成员,这很难保持最新,如果你这样做,我会确保有一些强有力的测试用例来验证public版本在所有重要的方面实际上等价于private版本。当然,使用
strip
删除调试段,这样内部细节就不会泄漏。有一些工具可以混淆所有只供内部使用的名称。如果作为构建过程的一部分运行,您可以使用一个内部调试构建,它对所有内容都有合理的名称,并提供一个构建,它用只有链接器才喜欢的名称命名所有内部函数和全局变量。
最后,要习惯这样一个事实,任何可以使用你的库的人都可以在一定程度上对你的库进行反向工程。有一些反调试器的措施可以采取,但恕我直言,这种方式会带来疯狂和沮丧。
xpcnnkqh2#
我没有一个快速的答案,除了探索使用“静态”函数。我会推荐阅读米罗Samek的工作,他称之为“C+"。基本上是面向对象的ANSI C。伟大的阅读。他拥有量子飞跃软件。
bnlyeluc3#
删除这个函数的头,在导出表中做一些模糊处理,打包你的代码并应用一些反调试器算法。
http://upx.sourceforge.net/
http://www.oreans.com/