我感兴趣的是,您可以采取哪些预防措施来使C共享库的逆向工程变得更加困难
似乎完全预防是不可能的,但你可以采取一些措施,使其花费更长的时间,从而降低吸引力/成本更高。
例如代码混淆、编译器优化选项、编译器调试标志等(我对gcc编译器特别感兴趣)
我也对逆向工程的相对难度感兴趣,~5KLOC C共享库(~200KB的.so大小),从成本或工时等角度来看。
发布于 2012-11-21 23:48:54
以下是我所知道的一些技巧:
libc
strip和--strip-unneeded选项删除除重定位所需的符号之外的所有符号(因为我们讨论的是与标准libc静态共享的库,这将导致更大的库/二进制文件,这意味着要处理更多的代码,同时也会造成混淆,因为将函数与库函数分离将更加困难:gcc -static ...
话虽如此,我必须补充说,我有一个使用上述措施的二进制文件,我能够在几个小时内对其进行逆向工程。如果你感兴趣,我从重建symtab开始,我不是逆向工程专家。
发布于 2012-11-21 23:51:28
-不需要代码混淆(就像在C#或Java中一样)。
目标代码中不存在内部变量和函数的名称。
但是,您导出的函数的名称在共享目标文件中仍将以明文显示。这听起来很合理。
-更好地使用-O2 -O3**.**或的优化标志
使用编译器优化,目标代码可以与源代码有很大的不同。实际上,要回到原来的C源代码是非常困难的。
但是,始终可以在装配级别还原工程师。通常,并不是所有的程序都是有价值的。在汇编语言中对有趣的部分进行逆向工程比在C中对整个程序进行逆向工程更容易。
发布于 2012-11-22 21:50:44
最常见的反逆转技术的问题是,它们是众所周知的,并且有克服它们的工具。当然,剥离符号和混淆,是必须的,但这只是关于隐藏名称/符号。
如果你想让反向器的工作变得更加困难,你可以自己发明一些代码操作。它可以是非常简单的东西,比如使用自定义的调用约定,但这将使所有的反汇编程序无法识别函数的开始和结束。
这些简单的技巧将是非常有效的,因为不会有一个已经制作的工具来将代码还原到原始代码。你看,对于几乎每个商业包装器或加密器,已经有一个一键解包程序。
https://stackoverflow.com/questions/13496735
复制相似问题