绕过 Enigma Protector 2.xx 注册保护

【文章标题】: 绕过 Enigma Protector 2.xx 注册保护
【文章作者】: CodeGame
【作者邮箱】: CodeGame@Yeah.Net
【作者主页】: http://blog.csdn.net/codegame
【作者QQ号】: 441673604
【软件名称】: windows 计算器
【软件大小】: 669kb
【下载地址】: windows xp 系统自带
【加壳方式】: The Enigma Protector 2.20 正版
【保护方式】: The Enigma Protector  2.20 正版
【编写语言】: VC
【使用工具】: OllyDBG
【操作平台】: Windows XP sp3
【软件介绍】: 1+1=2
【作者声明】: 文笔菜的很请谅解,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  参考了 http://unpack.cn/thread-59541-1-2.html 定位方式,迅速定位到了 Enigma 注册授权位置:
  010F2CBF    E8 CC76F3FF     call calc_em.0102A390
  010F2CC4    8B45 E8         mov eax,dword ptr ss:[ebp-0x18]
  010F2CC7    E8 FC78F3FF     call calc_em.0102A5C8
  010F2CCC    50              push eax
  010F2CCD    E8 DE90FFFF     call calc_em.010EBDB0     ; Check Registration Key Info
  010F2CD2    85C0            test eax,eax              ; Eax =1 Success!
  010F2CD4    0F95C0          setne al
  010F2CD7    8B15 98FE1001   mov edx,dword ptr ds:[0x110FE98]    
  010F2CDD    8B12            mov edx,dword ptr ds:[edx]
  010F2CDF    8842 50         mov byte ptr ds:[edx+0x50],al     ;<<<跟踪此处[edx+0x50]内存变量
  010F2CE2    A1 98FE1001     mov eax,dword ptr ds:[0x110FE98]

  
  这里010EBDB0 这个CALL负责检测注册码是否正确,正确返回1 否则返回0,并把检测结果直接写入:[edx+0x50]内,于是再继续跟踪:[edx+0x50]的地址发现是在这个地方进行检测:
01162B2D    8D049B          lea eax,dword ptr ds:[ebx+ebx*4]
01162B30    8B5486 10       mov edx,dword ptr ds:[esi+eax*4+0x10]
01162B34    8B45 FC         mov eax,dword ptr ss:[ebp-0x4]           ; HookIt eax=5 and edx=1 and ebx=1 and [ebp-0x4]=0
01162B37    E8 30F8FFFF     call calc_em.0116236C
01162B3C    8945 F4         mov dword ptr ss:[ebp-0xC],eax
01162B3F    E9 09010000     jmp calc_em.01162C4D
01162B44    8D049B          lea eax,dword ptr ds:[ebx+ebx*4]

0116236C的CALL负责读取检测上面写入的标志,但这个位置由于是公用函数N多代码进行调用直接补丁肯定行不通再加上Enigma有多线程内联补丁保护因此不能直接硬写此处代码,经过跟踪分析发现执行到01162B34  处并且eax=5 and edx=1 and ebx=1 and [ebp-0x4]=0此时做补丁是可行的,所以我们采用了硬件断点HOOK来判断实现。
  
  1:定位PatchAddress:
  
  先看此块内存信息:
   地址=01026000
   大小=002F4000 (3096576.)
   属主=calc_em  01000000
   区段=
   类型=Imag 01001002
   访问=R
   初始访问=RWE
  
  这块内存实际是Enigma的内置DLL授权模块,此块DLL是被加密压缩过,因此也无法直patch,通过对比加不同的程序发现这块区域解压后的代码都不变:
 $+13CB2D >  8D049B          lea eax,dword ptr ds:[ebx+ebx*4]
$+13CB30 >  8B5486 10       mov edx,dword ptr ds:[esi+eax*4+0x10]
$+13CB34 >  8B45 FC         mov eax,dword ptr ss:[ebp-0x4]           ; HookIt eax=5 and edx=1 and ebx=1 and [ebp-0x4]=0
$+13CB37 >  E8 30F8FFFF     call calc_em.0116236C
$+13CB3C >  8945 F4         mov dword ptr ss:[ebp-0xC],eax
$+13CB3F >  E9 09010000     jmp calc_em.01162C4D
$+13CB44 >  8D049B          lea eax,dword ptr ds:[ebx+ebx*4]

  
  因此PatchAddress = BaseAddress+PatchOffsetAddress,通过上面分析得到 Enigma Protector 2.20 的PatchOffsetAddress =  0x13CB34,不同版本的PatchOffsetAddress 有可能不一样,BaseAddress 的获取就更简单了,直接搜索区段判断VirtualSize为0x002F4000的VirtualAddress+GetModuleHandle(0)即为BaseAddress,整理公式PatchAddress = GetModuleHandle(0)+VirtualAddress+0x13CB34 定位完毕。
  
  2.硬件Hook:
  这里我们采用AddVectoredExceptionHandler向量化异常API来实现,具体细节请自己google,重点讲下Hook触发后的过程
由于我们Patch点为
$+13CB34 >  8B45 FC         mov eax,dword ptr ss:[ebp-0x4]           ; HookIt eax=5 and edx=1 and ebx=1 and [ebp-0x4]=0
$+13CB37 >  E8 30F8FFFF     call calc_em.0116236C
因此需要先判断eax,edx,ebx 和 [ebp-0x4]地址内的地址变量:

  if (pException^.ContextRecord^.Eax = 5) and (pException^.ContextRecord^.Ebx = 1)  and (pException^.ContextRecord^.Edx = 1) and (pdword(pdword(pException^.ContextRecord^.Ebp - 4)^)^ = 0) then
  begin
    pdword(pdword(pException^.ContextRecord^.Ebp - 4)^)^ := 1;
  end;
  pException^.ContextRecord^.Eax := pdword(pException^.ContextRecord^.Ebp - 4)^;
  PException^.ContextRecord^.Eip := PException^.ContextRecord^.Eip + 3; //Next


3.整体封装:
这里我们采用是把硬件HOOK和处理的过程都封装成DLL 然后导出一个GoPatch的函数供目标程序调用,那么如何使目标程序加载并执行我们的GoPatch函数呢, 办法很多比如注入,远线程等等。。这里我采用了劫持EIP的方式使目标程序加载我们的DLL并执行GoPatch函数。

到这里已经全部完成,运行程序直接拖拽需要Patch的exe到窗口即可直接绕过Enigma 的注册保护直接执行。
附件为跳保护程序和计算器DEMO,理论上使用2.xx版本加壳的程序都适用。

--------------------------------------------------------------------------------
【经验总结】
  该方法很明显的暴露了Enigma的不足,建议把这些代码都VM了并且加入硬件断点检测。
  此方法我已经通知了Enigma的作者相信他会在下个版本修正:)
 
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!

                                                       2010年12月10日 10:01:33

 

EnigmaPatch下载:http://download.csdn.net/source/2898088

【文章标题】: 绕过 Enigma Protector 2.xx 注册保护 【文章作者】: CodeGame 【作者邮箱】: CodeGame@Yeah.Net 【作者主页】: http://blog.csdn.net/codegame 【作者QQ号】: 441673604 【软件名称】: windows 计算器 【软件大小】: 669kb 【下载地址】: windows xp 系统自带 【加壳方式】: The Enigma Protector 2.20 正版 【保护方式】: The Enigma Protector 2.20 正版 【编写语言】: VC 【使用工具】: OllyDBG 【操作平台】: Windows XP sp3 【软件介绍】: 1+1=2 【作者声明】: 文笔菜的很请谅解,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教! -------------------------------------------------------------------------------- 【详细过程】 参考了 http://unpack.cn/thread-59541-1-2.html 定位方式,迅速定位到了 Enigma 注册授权位置: 010F2CBF E8 CC76F3FF call calc_em.0102A390 010F2CC4 8B45 E8 mov eax,dword ptr ss:[ebp-0x18] 010F2CC7 E8 FC78F3FF call calc_em.0102A5C8 010F2CCC 50 push eax 010F2CCD E8 DE90FFFF call calc_em.010EBDB0 ; Check Registration Key Info 010F2CD2 85C0 test eax,eax ; Eax =1 Success! 010F2CD4 0F95C0 setne al 这里010EBDB0 这个CALL负责检测注册码是否正确,正确返回1 否则返回0,由于 Enigma多线程内联补丁保护因此不能 直接硬写此处代码,所以我们采用了硬件断点HOOK来实现。 1:定位PatchAddress: 先看此块内存信息: 地址=01026000 大小=002F4000 (3096576.) 属主=calc_em 01000000 区段= 类型=Imag 01001002 访问=R 初始访问=RWE 这块内存实际是Enigma的内置DLL授权模块,此块DLL是被加密压缩过,因此也无法直接patch,通过对比加不同的程序 发现这块区域解压后的代码都不变: $+CCCBF > E8 CC76F3FF call calc_em.0102A390 $+CCCC4 > 8B45 E8 mov eax,dword ptr ss:[ebp-0x18] $+CCCC7 > E8 FC78F3FF call calc_em.0102A5C8 $+CCCCC > 50 push eax $+CCCCD > E8 DE90FFFF call calc_em.010EBDB0 ; Check Registration Key Info $+CCCD2 > 85C0 test eax,eax ; Eax =1 Success! $+CCCD4 > 0F95C0 setne al 因此PatchAddress = BaseAddress+PatchOffsetAddress,通过上面分析得到 Enigma Protector 2.20 的 PatchOffsetAddress = 0xCCCD2 ,不同版本的PatchOffsetAddress 有可能不一样,BaseAddress 的获取就更简单了, 直接搜索区段判断VirtualSize为0x002F4000的VirtualAddress+GetModuleHandle(0)即为BaseAddress,整理公式: PatchAddress = GetModuleHandle(0)+VirtualAddress+0xCCCD2 定完毕。 2.硬件Hook: 这里我们采用AddVectoredExceptionHandler向量化异常API来实现,具体细节请自己google,重点讲下Hook触发后的过程 由于我们Patch点为$+CCCD2 > 85C0 test eax,eax ,因此只需要模拟操作EFlags然后跳过此段指令即可: pException^.ContextRecord^.EFlags := $202; //TEST eax,eax pException^.ContextRecord^.Eax := 1; //TEST eax,eax PException^.ContextRecord^.Eip := PException^.ContextRecord^.Eip + 2; //Nex 3.整体封装: 这里我们采用是把硬件HOOK和处理的过程都封装成DLL 然后导出一个GoPatch的函数供目标程序调用,那么如何使目标程序 加载并执行我们的GoPatch函数呢,我想办法很多注入,远线程等等。。这里我采用了劫持EIP的方式使目标程序加载我们的 DLL并执行GoPatch函数。 到这里已经全部完成,执行GoPatch后任意输入或者不输入用户名、注册码都可以直接绕过Enigma注册保护直接执行。
### 回答1: "The Enigma Protector" 是一个专业的软件保护工具,可用于保护和加密软件应用程序。 注册标题修改是指在软件保护过程中修改注册表中的软件标题,使其在用户的计算机上显示不同的信息。这样做的目的是为了防止未经授权的使用及盗版行为,同时也可以增加软件的安全性。 在"The Enigma Protector"中进行注册标题修改非常简单。首先,打开软件的保护项目文件,然后选择“注册信息”选项卡。在这里,您可以查看和编辑软件的注册标题相关设置。 为了修改注册标题,您可以通过两种方式进行操作。第一种是手动更改注册标题文本框中的内容,然后保存更新后的项目文件。请确保所填写的注册标题能够准确反映您的软件名称或其他想要展示给用户的信息。 第二种方法是使用变量。通过使用变量,您可以动态地设置注册标题,以便根据需要对其进行更改。在软件保护项目文件中,您可以找到“常用变量”标签页,这里提供了一些常用的变量选项,可以在注册标题中使用。 总之,使用"The Enigma Protector"进行注册标题修改是一项重要的操作,可以为您的软件提供额外的保护,并防止未经授权的访问。无论是手动编辑还是使用变量,都可以根据您的需要和偏好来自定义软件的注册标题。 ### 回答2: the enigma protector 是一款强大的软件保护工具,用于保护软件著作权和防止非法复制。该工具不仅提供了程序保护功能,还支持对软件的注册信息进行修改。 当我们需要修改 the enigma protector 的注册标题时,我们可以通过以下步骤进行操作: 1. 打开 the enigma protector 软件,并选择需要修改注册标题的程序。 2. 在软件主界面左侧的菜单栏中,找到"注册及序列号"或类似的选项。 3. 点击该选项后,会出现一个编辑框,显示当前的注册信息,包括注册标题。 4. 在编辑框中,找到注册标题所在的位置,并将光标移动到该位置。 5. 删除或修改当前的注册标题,并输入新的注册标题。 6. 点击保存或应用按钮,使修改后的注册标题生效。 7. 关闭 the enigma protector 软件,并重新运行修改后的程序,验证注册标题是否修改成功。 需要注意的是,修改注册标题可能需要管理员权限或特殊密码,以确保修改的合法性和安全性。另外,修改注册标题可能会影响软件的授权和正常运行,建议在做出修改之前备份原始程序,以防止意外情况的发生。 总的来说,对于 the enigma protector 用户来说,修改注册标题是一个相对简单的操作,通过上述步骤可以轻松实现。这一功能使得用户可以根据具体需求自定义软件的注册信息,提供了灵活性和便利性。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值