首页
社区
课程
招聘
[原创]过Enigma Protector 2.xx 注册保护
发表于: 2010-12-10 15:37 16818

[原创]过Enigma Protector 2.xx 注册保护

2010-12-10 15:37
16818

【文章标题】: 绕过 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版本加壳的程序都适用。



计算器DEMO: calc_em.rar

EnigmaPatch: PatchEnigma.rar


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 1485
活跃值: (884)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
那东西完全可以一个字节直接patch掉,不用写其他代码hook了,他写那文章也是参考别人的,那个赋值的地方可以直接跟踪下原始的地方,是不加密的.
2010-12-11 15:33
1
雪    币: 59
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
老大有多线校验也可以?
2010-12-11 20:06
0
雪    币: 59
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
楼上的是吾爱管理吧?:D
2010-12-11 20:18
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
你这个如果需要解码的话没戏,还有不用搞得那么麻烦,分解一下入口的解码算法,

直接 patch 了那个字节就可以了
2010-12-11 21:02
0
雪    币: 59
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
的确是那么回事
2010-12-12 09:59
0
雪    币: 3852
活跃值: (2367)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
来看看了啊 呵呵
2010-12-12 13:45
0
雪    币: 1485
活跃值: (884)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我记得他DLL是裸的,都不加密,可以直接patch文件,不用hook的好像.
2010-12-13 18:32
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
用了常量加密的也可以直接Patch?
2010-12-21 08:55
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我拿到的加壳程序 可以手动在od里patch  想按你说的方法搞  好像是加密了两层~~
2011-4-7 16:59
0
雪    币: 2882
活跃值: (1272)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yjd
11
上次试过了对新版无效。
2011-4-7 17:07
0
游客
登录 | 注册 方可回帖
返回
//