首页
社区
课程
招聘
**魔术0.23 注册算法分析
2006-11-27 16:10 7028

**魔术0.23 注册算法分析

2006-11-27 16:10
7028
【文章标题】: 光影魔术手0.23 注册算法分析
【文章作者】: LuoXue
【作者邮箱】: player4343@163.com
【作者主页】: 无
【作者QQ号】: 45109326
【软件名称】: nEOiMAGING_v0.23光影魔术手
【软件大小】: 3.28M
【下载地址】: 自己搜索下载
【加壳方式】: aspack2.12
【保护方式】: aspack 2.12+key
【编写语言】: delphi
【使用工具】: od,peid
【操作平台】: winXP SP2
【软件介绍】: 一大堆的功能,自己看看吧
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  今日闲的很,于是便到网上逛了逛,发现一款软件,使用很是顺手!不过当我看见关于项中的注册时。。。嘿嘿。。于是就有了下面着篇破解文章,大虾们闪了!
  Peid侦测显示为aspack 2.12. too easy!三下五除二就搞定了,呵呵~~
  下面开始跟踪算法,常规思路:OD载入--》老罗的字符插件搜索字符串,呵呵!被我发现了端倪了哦~~共找到了2处如下的代码:
  0059510C  |.  >cmp     eax, 4
  0059510F  |.  >jge     short 0059514B
  00595111  |.  >push    0
  00595113  |.  >push    005952F0                         ;  错误:〖注册姓名〗\n
  00595118  |.  >push    dword ptr [ebx+32C]
  0059511E  |.  >push    0059530C                         ;  \n
  00595123  |.  >push    00595318                         ;  长度太短,无法注册!
  
  00595172  |.  >cmp     eax, 16
  00595175  |.  >je      short 005951B1
  00595177  |.  >push    0
  00595179  |.  >push    0059533C                         ;  错误:〖注册码〗\n
  0059517E  |.  >push    dword ptr [ebx+330]
  00595184  |.  >push    0059530C                         ;  \n
  00595189  |.  >push    00595358                         ;  长度不符,无法注册!
  这两处都是对注册名和注册码的长度检测,如果注册名<4位,注册码<16位,均不能注册成功!呵呵下面我门看见了"注册成功了"!但是我看这个跳转有些别扭,于是就往上找,就到了5951BA这个地方,看见了它是指向注册失败处的,可以猜测上面的call就是注册算法咯~~呵呵
  0059518E  |.  >lea     eax, dword ptr [ebp-14]
  00595191  |.  >mov     edx, 4
  00595196  |.  >call    00405108
  0059519B  |.  >mov     eax, dword ptr [ebp-14]         
  0059519E  |.  >mov     cx, word ptr [595330]            
  005951A5  |.  >mov     dl, 1                          
  005951A7  |.  >call    004379EC                        
  005951AC  |.  >jmp     00595292
  005951B1  |>  >mov     eax, ebx
  005951B3  |.  >call    00594EB4             关键call 需要f7跟入的关键算法  
  005951B8  |.  >test    al, al            通过测试eax的值确定程序走向
  005951BA  |.  >je      0059527D   ?------------------------------  关键跳转
  005951C0  |.  >mov     eax, ebx
  005951C2  |.  >call    00594DB0
  005951C7  |.  >xor     esi, esi
  005951C9  |>  >/lea     eax, dword ptr [ebp-11C] 此为写入.lic文件的计算部分,由于时间关系不再跟踪
  005951CF  |.  >|push    eax
  005951D0  |.  >|mov     edx, esi
  005951D2  |.  >|add     edx, edx
  005951D4  |.  >|mov     eax, dword ptr [5ED828]
  005951D9  |.  >|mov     eax, dword ptr [eax]
  005951DB  |.  >|mov     ecx, 4
  005951E0  |.  >|call    004052A8
  005951E5  |.  >|mov     eax, dword ptr [ebp-11C]
  005951EB  |.  >|push    eax
  005951EC  |.  >|lea     eax, dword ptr [ebp-120]
  005951F2  |.  >|push    eax
  005951F3  |.  >|mov     ecx, 8
  005951F8  |.  >|mov     edx, 0B
  005951FD  |.  >|mov     eax, dword ptr [ebx+330]
  00595203  |.  >|call    004052A8
  00595208  |.  >|mov     eax, dword ptr [ebp-120]
  0059520E  |.  >|lea     ecx, dword ptr [ebp-118]
  00595214  |.  >|pop     edx
  00595215  |.  >|call    00513EA8
  0059521A  |.  >|mov     edx, dword ptr [ebp-118]
  00595220  |.  >|lea     eax, dword ptr [ebp-114]
  00595226  |.  >|mov     ecx, 0FF
  0059522B  |.  >|call    00405024
  00595230  |.  >|lea     edx, dword ptr [ebp-114]
  00595236  |.  >|mov     eax, esi
  00595238  |.  >|shl     eax, 5
  0059523B  |.  >|sub     eax, esi
  0059523D  |.  >|mov     ecx, dword ptr [5ED1CC]         
  00595243  |.  >|mov     ecx, dword ptr [ecx]
  00595245  |.  >|lea     eax, dword ptr [ecx+eax+A89]
  0059524C  |.  >|mov     cl, 1E
  0059524E  |.  >|call    004032B8
  00595253  |.  >|inc     esi
  00595254  |.  >|cmp     esi, 3
  00595257  |.^ >\jnz     005951C9               循环写入文件
  0059525D  |.  >mov     dl, 1
  0059525F  |.  >mov     eax, ebx
  00595261  |.  >call    00594BA4
  00595266  |.  >push    0                             
  00595268  |.  >mov     cx, word ptr [595330]           
  0059526F  |.  >mov     dl, 2                           
  00595271  |.  >mov     eax, 00595378                   成功注册!感谢您的支持!
  00595276  |.  >call    004379EC                       
  0059527B  |.  >jmp     short 00595292
  0059527D  |>  >push    0                                ; /Arg1 = 00000000   注意这里是从上面的关键call之后跳过来的!
  0059527F  |.  >mov     cx, word ptr [595330]           
  00595286  |.  >mov     dl, 1                           
  00595288  |.  >mov     eax, 0059539C                   注册失败:注册码无效!
  0059528D  |.  >call    004379EC                        
  00595292  |>  >xor     eax, eax
  00595294  |.  >pop     edx
  00595295  |.  >pop     ecx
  00595296  |.  >pop     ecx
  00595297  |.  >mov     dword ptr fs:[eax], edx
  0059529A  |.  >push    005952DF
  0059529F  |>  >lea     eax, dword ptr [ebp-120]
  我们跟入关键call之后发现了如下算法,呵呵
  
  
  
  关键算法1:
  00594EC4  |.  >push    ebp
  00594EC5  |.  >push    00594FB6
  00594ECA  |.  >push    dword ptr fs:[eax]
  00594ECD  |.  >mov     dword ptr fs:[eax], esp
  00594ED0  |.  >mov     eax, dword ptr [ebx+32C]
  00594ED6  |.  >call    00405048
  00594EDB  |.  >cmp     eax, 4
  00594EDE  |.  >jl      short 00594EF0
  00594EE0  |.  >mov     eax, dword ptr [ebx+330]
  00594EE6  |.  >call    00405048
  00594EEB  |.  >cmp     eax, 16
  00594EEE  |.  >je      short 00594EF7
  00594EF0  |>  >xor     eax, eax
  00594EF2  |.  >jmp     00594F99
  00594EF7  |>  >lea     ecx, dword ptr [ebp-4]
  00594EFA  |.  >mov     edx, dword ptr [5ED828]        
  00594F00  |.  >mov     edx, dword ptr [edx]
  00594F02  |.  >mov     eax, dword ptr [ebx+32C]
  00594F08  |.  >call    00513EA8                   关键call f7 (算法关键 2)
  00594F0D  |.  >lea     eax, dword ptr [ebp-8]         申请堆栈空间存放数据
  00594F10  |.  >push    eax                        入栈
  00594F11  |.  >mov     eax, dword ptr [ebx+330]      eax=ebx+330="0123456….."
  00594F17  |.  >mov     ecx, 4                     ecx=4
  00594F1C  |.  >mov     edx, 13                    edx=13
  00594F21  |.  >call    004052A8                    取实验码后四位
  00594F26  |.  >mov     eax, dword ptr [ebp-4]        
  00594F29  |.  >call    00405048                   取循环结果长度
  00594F2E  |.  >mov     ecx, eax                   长度入ecx
  00594F30  |.  >xor     ebx, ebx                   ebx清零
  00594F32  |.  >mov     eax, ecx                   长度入eax
  00594F34  |.  >dec     eax                        eax=eax-1
  00594F35  |.  >test    eax, eax                     测试eax决定程序走向
  00594F37  |.  >jl      short 00594F4D               小于则跳走
  00594F39  |.  >inc     eax                           eax=eax+1
  00594F3A  |.  >xor     edx, edx                    edx清零
  00594F3C  |>  >/mov     esi, dword ptr [ebp-4]        esi初始化
  00594F3F  |.  >|movzx   esi, byte ptr [esi+edx-1]        依次取循环结果
  00594F44  |.  >|imul    esi, ecx                     每位均与长度相乘
  00594F47  |.  >|add     ebx, esi                    ebx=ebx+esi
  00594F49  |.  >|inc     edx                        
  00594F4A  |.  >|dec     eax
  00594F4B  |.^ >\jnz     short 00594F3C
  00594F4D  |>  >cmp     ebx, 270F               ebx与270f比较
  00594F53  |.  >jle     short 00594F63               小于等于则跳
  00594F55  |.  >mov     eax, ebx                 
  00594F57  |.  >mov     ecx, 2710
  00594F5C  |.  >cdq
  00594F5D  |.  >idiv    ecx
  00594F5F  |.  >mov     ebx, edx
  00594F61  |.  >jmp     short 00594F71
  00594F63  |>  >cmp     ebx, 2328              由4f53而来  ebx与2328比较
  00594F69      >jge     short 00594F71          小于等于则跳
  00594F6B  |.  >add     ebx, 3E8
  00594F71  |>  >lea     eax, dword ptr [ebp-C]            
  00594F74  |.  >push    eax                              ; /Arg1
  00594F75  |.  >mov     dword ptr [ebp-14], ebx          ; |
  00594F78  |.  >mov     byte ptr [ebp-10], 0             ; |
  00594F7C  |.  >lea     edx, dword ptr [ebp-14]          ; |
  00594F7F  |.  >xor     ecx, ecx                         ; |
  00594F81  |.  >mov     eax, 00594FD0                    ; |%4d
  00594F86  |.  >call    0040AEEC                        
  00594F8B  |.  >mov     eax, dword ptr [ebp-8]          试验码后4位
  00594F8E  |.  >mov     edx, dword ptr [ebp-C]          注册码后4位
  00594F91  |.  >call    00405194                    关键比较
  00594F96  |.  >sete    al     ?---------------------------注册标志
  
  关键算法 2:
  00513F03  |> /8B45 FC       /mov     eax, dword ptr [ebp-4]     ->取得用户名称
  00513F06  |. |8A4418 FF     |mov     al, byte ptr [eax+ebx-1]     '取用户名第一个字符
  00513F0A  |. |24 0F         |and     al, 0F                   与0f与运算结果送al
  00513F0C  |. |8B55 F8       |mov     edx, dword ptr [ebp-8]   取固定序列值 (注册表中关键值)                                
  00513F0F  |. |8A5432 FF     |mov     dl, byte ptr [edx+esi-1]   取序列第一位进dl
  00513F13  |. |80E2 0F       |and     dl, 0F                 与0f与运算
  00513F16  |. |32C2          |xor     al, dl                 两个结果进行异或结果入al
  00513F18  |. |8845 F3       |mov     byte ptr [ebp-D], al         eax '[ebp-d]=12ed7e
  00513F1B  |. |8D45 FC       |lea     eax, dword ptr [ebp-4]         eax'12ed88
  00513F1E  |. |E8 7D13EFFF   |call    004052A0                  再次取username
  00513F23  |. |8B55 FC       |mov     edx, dword ptr [ebp-4]       ebp-4值入edx=wopasi
  00513F26  |. |8A541A FF     |mov     dl, byte ptr [edx+ebx-1]       计算值入edx
  00513F2A  |. |80E2 F0       |and     dl, 0F0                    dl xor f0'dl
  00513F2D  |. |8A4D F3       |mov     cl, byte ptr [ebp-D]         ebp-d'cl=02
  00513F30  |. |02D1          |add     dl, cl                   dl=cl+dl  72(ascii:r)
  00513F32  |. |885418 FF     |mov     byte ptr [eax+ebx-1], dl    eax+ebp-1=dl (ascii:r)
  00513F36  |. |46            |inc     esi                      esi =esi+1
  00513F37  |. |8B45 F8    |mov     eax, dword ptr [ebp-8]     取固定序列
  00513F3A  |. |E8 0911EFFF   |call    00405048             取固定序列长度:23'hex:17
  00513F3F  |. |3BF0          |cmp     esi, eax             比较esi   eax
  00513F41  |. |7E 05         |jle     short 00513F48         小于或等于则跳走至513f48
  00513F43  |. |BE 01000000   |mov     esi, 1               esi=1
  00513F48  |> |43            |inc     ebx                  ebx=ebx+1
  00513F49  |. |4F            |dec     edi                   edi=edi-1
  00513F4A  |.^\75 B7         \jnz     short 00513F03         loop循环   ↑
  
--------------------------------------------------------------------------------
【经验总结】
  好了总结一下,算法比较简单,就是分别取用户名和固定序列的第一个字符的asc值分离出每位的低高位
  将固定序列的高位和注册名的高位异或,将结果与用户名的高位进行连接,然后将结果乘以名称长度-1再累加,结果作为注
  册码的后4位,好了,就这么简单!下面干什么?~~~呵呵~~当然是用vb实现咯~~
  代码我就不写了,是64位编程斑竹帮俺写的~~~我只是写了点框架而已~~再此多谢斑竹给我的帮助~~真的很感谢你!呵呵
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年11月27日 16:08:14

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

收藏
点赞7
打赏
分享
最新回复 (6)
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-11-27 21:17
2
0
支持一下。
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
冷血书生 28 2006-11-27 21:39
3
0
传说这个软件并没有功能限制,只是时不时弹点东西出来有点烦而已!
雪    币: 50
活跃值: (403)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jr21066 2006-11-28 19:32
4
0
如果只是后四位的话,用一会说不行了.还是有弹出窗口的
雪    币: 269
活跃值: (46)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
yunfeng 1 2006-11-28 21:59
5
0
好文章,学习收藏了。
雪    币: 184
活跃值: (47)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wopasi 1 2006-11-29 10:08
6
0
多谢个位大大们的鼓励!我会继续加油的,争取早日到达"小虾"的境界~~呵呵~~努力ing~~~
When something happen~,I will be back~ :)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kittenlu 2007-2-27 14:03
7
0
老大,光影魔术手的注册系统已经改了啊。新版的2.4的版本注册系统不一样的。
机器码的生成方式不同了,注册码的生成方式也不同了。
刚刚看了你的文,粗略的OD了一下。不过是上班时间,不能详细的分析。希望老大能先分析一下,哈,我刚学。
新版下载:光影魔术手2.4测试版
游客
登录 | 注册 方可回帖
返回