我一直在考虑如何保护我的C/C++代码免于反汇编和逆向工程。通常,我永远不会在自己的代码中宽恕这种行为。但是,为了所有人的安全,我目前正在研究的当前协议(protocol)绝不能被检查或理解。

现在,这对我来说是一个新主题,互联网对于预防逆向工程并不是真正有用的资源,而是描述了大量有关如何进行逆向工程的信息

到目前为止,我想到的一些事情是:

  • 代码注入(inject)(在实际函数调用之前和之后调用伪函数)
  • 代码混淆(破坏二进制文件的反汇编)
  • 编写我自己的启动例程(调试器很难绑定(bind)到)
    void startup();
    int _start()
    {
        startup( );
        exit   (0)
    }
    void startup()
    {
        /* code here */
    }
    
  • 运行时检查调试器(如果检测到,则强制退出)
  • 功能蹦床
     void trampoline(void (*fnptr)(), bool ping = false)
     {
       if(ping)
         fnptr();
       else
         trampoline(fnptr, true);
     }
    
  • 无意义的分配和释放(堆栈变化很多)
  • 无意义的虚拟 call 和蹦床(反汇编输出中的大量跳跃)
  • 大量类型转换(用于模糊拆卸)

  • 我的意思是,这是我想到的一些事情,但是在适当的时间范围内,代码分析人员可以解决所有这些问题,或者可以由代码分析师找出。我还有别的选择吗?

    最佳答案

    琥珀所说的完全正确。您可以使逆向工程更加困难,但是您永远无法避免。您永远不要相信"security" that relies on the prevention of reverse engineering

    也就是说,我所见过的最好的反逆向工程技术不是集中在混淆代码上,而是集中在破坏人们通常用来理解代码工作原理的工具上。与打破大量的意大利面条式代码相比,寻找创造性的方法来破坏反汇编程序,调试器等不仅可能更有效,而且在智力上也更令人满意。这无济于事,无法阻止坚定的攻击者,但确实增加了J Random Cracker徘徊而从事更轻松工作的可能性。

    10-08 03:37