我一直在考虑如何保护我的C/C++代码免受反汇编和逆向工程的影响.通常情况下,我自己在代码中永远不会宽恕这种行为;然而,为了不同人群的安全,我正在制定的现行协议永远不能被判断或理解.

现在这对我来说是一个新的课题,互联网对prevention against reverse engineering人来说并不是真正的足智多谋,而是描述了关于how to reverse engineer的大量信息.

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

  • 代码注入(在实际函数调用之前和之后调用伪函数)
  • 代码混淆( destruct 二进制文件的反汇编)
  • 编写自己的启动 routine (调试器更难绑定)

    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);  
     }
    
  • 无意义的分配和解除分配(堆栈变化很大)

  • 无意义的虚拟呼叫和蹦床(分解输出中的大量 skip )
  • 数吨铸件(用于模糊拆卸)

我的意思是,这些都是我想过的事情,但是只要有合适的时间框架,代码分析师都可以解决和/或解决这些问题.我还有别的 Select 吗?

推荐答案

Amber说的完全正确.你可以让逆向工程变得更加困难,但你永远无法阻止它.你永远不应该相信"security" that relies on the prevention of reverse engineering.

也就是说,我所见过的最好的反逆向工程技术并不是专注于混淆代码,而是打破人们通常用来理解代码如何工作的工具.找到创造性的方法来破解反汇编程序、调试器等,不仅可能更有效,而且在智力上也比仅仅生成大量可怕的意大利面代码更令人满意.这并不能阻止一个意志坚定的攻击者,但它确实增加了J Random Cracker游荡并从事更简单工作的可能性.

C++相关问答推荐

在C、Linux中同步进程

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

无效使用未定义类型'structsquare'?

文件权限为0666,但即使以超级用户身份也无法打开

使用sscanf获取零个或多个长度的字符串

在基本OpenGL纹理四边形中的一个三角形中进行渲染

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

用gcc-msse 2编译的C程序包含AVX 1指令

如何计算打印二叉搜索树时每行所需的空间?

如何使用C++在控制台中以彩色打印被阻止的客户端

在C中访问数组中的特定值

这个空指针类型的转换是有效代码还是恶意代码?

无法识别C编程语言的语法,如书中所示

计算SIZE_MAX元素的长数组的大小

如何在C中计算包含递增和递减运算符的逻辑表达式?

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

'printf("%s", user_input)' 危险吗?

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648

C 语言中霍尔分区的快速排序算法