在业余时间,我正在和一些朋友一起做一些逆向工程游戏,我想知道如何尽可能地防止
asm
可读性。我不想“阻止”逆向工程(毕竟它总是可能的),我只是想通过在汇编代码中混淆函数/变量来防止对它们的简单理解。
例如,如果我在 C++ 中声明了一个类似的函数:
void thisFunctionReverseAString(std::string& mystring);
我想确保不可能从程序集中获取名称
thisFunctionReverseAString
和 mystring
。是否有任何编译选项可以在 g++
或 clang++
中执行此操作?
混淆只会对源代码有帮助。 没有调试信息的可执行文件不包含变量名或函数名。
逆向工程的过程将涉及:
例如,采用 FORTRAN(或编译的 BASIC)中的可执行文件并将其逆向工程为 C++ 源代码。
正如其他人所说,有一些函数可以从可执行文件的调试版本中删除符号。 您可以从头开始构建一个不带符号的可执行文件,通常称为“发布”版本。
strip
从 Linux 中的可执行文件中删除符号。 在 Windows 上,只需删除
pdb
文件即可。等常用工具从可执行文件中提取 由于类和函数名称通常具有有意义的助记符,因此对于那些尝试对应用程序逻辑进行逆向工程的人来说,它们绝对是一个巨大的帮助。这就是为什么在这种情况下剥离符号是一个好主意,例如这是删除符号后函数列表在 Ghidra 中的样子:
将“strip”命令应用于可执行文件后,类名也可以观察到同样的情况。在下图中,您可以看到只有标准 C++ 类可见
总的来说,Ghidra 是一个很棒的工具,可用于对可执行文件进行逆向工程并回答许多类似 OP 的问题