我一直在考虑如何保护我的C/C++代码免于反汇编和逆向工程.通常我永远不会在我的代码中宽恕这种行为; 然而,为了各种人的安全,我一直在努力的现行协议绝不能被检查或理解.
现在这对我来说是一个新的主题,互联网并不是真正有效防范逆向工程,而是描绘了大量有关如何逆向工程的信息
到目前为止我想到的一些事情是:
编写我自己的启动例程(调试器更难绑定)
void startup();
int _start()
{
startup( );
exit (0)
}
void startup()
{
/* code here */
}
Run Code Online (Sandbox Code Playgroud)运行时检查调试器(如果检测到则强制退出)
功能蹦床
void trampoline(void (*fnptr)(), bool ping = false)
{
if(ping)
fnptr();
else
trampoline(fnptr, true);
}
Run Code Online (Sandbox Code Playgroud)无意义的分配和解除分配(堆栈变化很多)
我的意思是这些是我所想到的一些事情,但是在适当的时间范围内,它们都可以被代码分析师解决或者解决.我还有其他选择吗?
为什么以下工作?
void foo() {
cout << "Foo to you too!\n";
};
int main() {
void (*p1_foo)() = foo;
void (*p2_foo)() = *foo;
void (*p3_foo)() = &foo;
void (*p4_foo)() = *&foo;
void (*p5_foo)() = &*foo;
void (*p6_foo)() = **foo;
void (*p7_foo)() = **********************foo;
(*p1_foo)();
(*p2_foo)();
(*p3_foo)();
(*p4_foo)();
(*p5_foo)();
(*p6_foo)();
(*p7_foo)();
}
Run Code Online (Sandbox Code Playgroud) 在收听StackOverflow播客时,jab不断出现"真正的程序员"用C语言编写,而C语言更快,因为它"靠近机器".将前一个断言留给另一个帖子,C的特殊之处在于它是否比其他语言更快?或者换一种方式:什么阻止其他语言能够编译成二进制文件,它运行速度和C一样快?
比方说,我有许多预处理指令源文件.是否有可能看到它的外观预处理器是用它做之后?
您是否有任何理由(语法除外)
FILE *fdopen(int fd, const char *mode);
Run Code Online (Sandbox Code Playgroud)
要么
FILE *fopen(const char *path, const char *mode);
Run Code Online (Sandbox Code Playgroud)
代替
int open(const char *pathname, int flags, mode_t mode);
Run Code Online (Sandbox Code Playgroud)
在Linux环境中使用C时?
什么是更好的:void foo()或void foo(void)?随着虚空,它看起来丑陋和不一致,但我被告知它是好的.这是真的?
编辑:我知道一些旧的编译器做了奇怪的事情,但如果我只使用GCC,那void foo()好吗?将foo(bar);随后被接受?
使用static constvars比#define预处理器更好吗?或者也许取决于背景?
每种方法的优点/缺点是什么?
在Visual C++中,可以使用#pragma warning (disable: ...).我还发现在GCC中你可以覆盖每个文件的编译器标志.我怎样才能为"下一行"做这个,或者使用GCC围绕代码区域推送/弹出语义?