65.9K
CodeProject 正在变化。 阅读更多。
Home

一种新的软件保护方法(Objantihack)

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.61/5 (19投票s)

2006年11月29日

4分钟阅读

viewsIcon

33424

downloadIcon

443

本文介绍一种新的软件加密方法。

下载加密演示文件 - 151.2 Kb

引言

ObjAntiHack 简介



1. 设计目标


    为了防止软件被破解或被逆向工程,作者在软件加密方面做了很多工作。
    但到目前为止,软件加密方法非常有限。通用方法是打包软件,
    其限制在于原始代码必须在运行时恢复,因此破解者可以编写内存补丁工具来修改
    代码或转储整个代码,甚至完全解包。为了解决这个问题,我们开发了 Obj 文件
    加密软件 ObjAntiHack,它可以加密 .obj 文件。您可以将加密的 obj 文件链接到您的项目,
    指令代码被完全扭曲,指令代码无法区分,也无法
    分析。它具有反静态分析能力,并且很难通过动态分析轻易获得程序原理。
    面对这种代码,大多数破解者会彻底放弃。
   
   

2. 应用范围


    支持 X86 平台,32 位 coff 格式的 obj 文件。我们计划将来支持 Delphi、JAVA 和 .Net。
   
   

3. 工作原理


    A. 用栈变量替换寄存器
       用栈变量替换一个或多个寄存器,这种转换是不可逆的。
    B. 用随机化过程替换通用指令代码
    C. 在栈中运行真实代码
       将加密的指令代码推入栈,解密,然后调用它!
    D. 删除 JMP 指令
       JMP 指令对破解者非常重要,因此 ObjAntiHack 将 JMP 代码转换为其他格式。
    E. 删除 ret 指令
       通常 ret 指令表示函数结束。如果 ret 被转换,反汇编器将无法
       正确识别函数。
    F. 添加 JMP 指令
       将函数分成小块,将这些代码重新放置到随机位置,并用 JMP 指令链接它们。

高级功能这些方法可以重复使用!



    示例
    1、
    call sub1

    更改为

     mov eax, offset sub1 + 3
     push offset @1
     sub eax, 3
     jmp eax
     @1:

    2.
    ret

    更改为

     push ecx
     mov ecx, [esp+4]
     add esp,8
     jmp ecx


    3.
     cmp reg1, reg2
     jge L_DST    
     L_NEXT

    更改为
        
     push eax
     mov eax, reg1
     sub eax, reg2
     shr eax, 1fh
     neg eax
     and eax, L2 - L1
     add eax, L1
     jmp eax
     L1
     pop eax
     jmp L_DST
     L2
     pop eax
     L_NEXT


    4.
    MOV     EAX, DWORD PTR [ECX+0AD8h]
    PUSH    EAX
    MOV     ECX, DWORD PTR [EAX]

    更改为

    PUSH    EAX
    PUSH    ECX
    MOV     EAX, DWORD PTR [ESP]
    ADD     EAX, 0AD8h
    MOV     EAX, DWORD PTR [EAX]
    MOV     DWORD PTR [ESP+04h], EAX
    PUSH    DWORD PTR [ESP+04h]
    MOV     EAX, DWORD PTR [ESP]
    MOV     DWORD PTR [ESP+08h], EAX
    MOV     EAX, DWORD PTR [ESP]
    MOV     EAX, DWORD PTR [EAX]
    MOV     DWORD PTR [ESP+04h], EAX
    MOV     EAX, DWORD PTR [ESP]
    MOV     ECX, DWORD PTR [ESP+04h]
    ADD     ESP, 08h


4. 使用宏


   A. 在您的 C++ 源代码中使用下面的宏来标识关键加密部分

   #pragma code_seg(".code$curve_Max")
  
   /* 您的关键加密部分 C++ 代码 */
  
   #pragma code_seg()

   示例
   #pragma code_seg(".code$curve_Max")
   Void func1()
   {

   }
   DWORD func2(DWORD dw1,DWORD dw2)
   {

   }
   #pragma code_seg()
  
   B. 在您的 C++ 源代码中使用下面的宏来标识非加密部分
      #pragma code_seg(".code$curve_NoChange")
      #pragma code_seg()
     
     

5. 其他


   A. 性能
      性能损失是不可避免的。加密强度越高,性能损失越大。
      如果您的某些函数要求尽可能高速运行,则不要加密这些函数,
      或者进行轻度加密。那些不经常使用、速度要求不苛刻的地方都可以
      进行高强度加密。加密强度和加密方法可以根据用户的请求进行
      设置。
   B. 文件大小
      由于膨胀扭曲算法,加密会增加目标文件的大小。文件大小
      的增加量因加密强度而异,可以根据具体要求进行
      调整。此外,您可以在源程序中插入标记,告诉 ObjAntiHack 关键加密区域。
      关键加密区域可以设置为高强度加密,对于非关键
      加密区域,可以使用轻度加密。您将同时获得安全保障和更小的文件。
      
    

      有任何建议吗?请发邮件给我,
      邮箱:me(at)liutaotao.com
      网页:http://liutaotao.com/objantihack/objantihack.html

© . All rights reserved.