飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3733|回复: 3

[原创] 金锋贺卡制作 标准版 v5.0 注册算法简单分析

[复制链接]

该用户从未签到

发表于 2007-11-10 16:11:31 | 显示全部楼层 |阅读模式
金锋贺卡制作 标准版 v5.0 注册算法简单分析

下断点:BP RegQueryValueExA 后,逐步分析到这里:

》》》》》》
(省略...)
004EC5E1   .  BA B8C84E00             mov     edx, jfcard.004EC8B8      ;  ASCII "Serial"
004EC5E6   .  8BC3                    mov     eax, ebx
004EC5E8   .  E8 A3FCF8FF             call    jfcard.0047C290           ;  //得到注册表中Serial的数据
004EC5ED   .  8B55 F0                 mov     edx, dword ptr [ebp-10]   ;  -> edx
004EC5F0   .  B8 E4C24F00             mov     eax, jfcard.004FC2E4
004EC5F5   .  E8 AA77F1FF             call    jfcard.00403DA4
004EC5FA   .  8D45 EC                 lea     eax, dword ptr [ebp-14]
004EC5FD   .  E8 BEFEFDFF             call    jfcard.004CC4C0
004EC602   .  BA E4C24F00             mov     edx, jfcard.004FC2E4      ;  04
004EC607   .  B8 14C34F00             mov     eax, jfcard.004FC314      ;  A8
004EC60C   .  E8 97FFFDFF             call    jfcard.004CC5A8
004EC611   .  A1 E4C24F00             mov     eax, dword ptr [4FC2E4]   ;  Serial中的数据 -> eax
004EC616   .  8B15 14C34F00           mov     edx, dword ptr [4FC314]   ;  计算出的机器码 -> edx
004EC61C   .  E8 BF7AF1FF             call    jfcard.004040E0           ;  比较上面两数据是否相等 eax=0?
004EC621      74 10                   je      short jfcard.004EC633     ;  相等,跳走(必须跳)
004EC623   .  8B45 FC                 mov     eax, dword ptr [ebp-4]
004EC626   .  8B80 4C080000           mov     eax, dword ptr [eax+84C]
004EC62C   .  B2 01                   mov     dl, 1
004EC62E   .  E8 FD88F6FF             call    jfcard.00454F30
004EC633   >  8D4D E8                 lea     ecx, dword ptr [ebp-18]
004EC636   .  BA C8C84E00             mov     edx, jfcard.004EC8C8      ;  ASCII "Reg"
004EC63B   .  8BC3                    mov     eax, ebx
004EC63D   .  E8 4EFCF8FF             call    jfcard.0047C290           ;  //得到注册表中Reg的数据(注册码)
004EC642   .  8B55 E8                 mov     edx, dword ptr [ebp-18]   ;  -> edx
004EC645   .  8BC7                    mov     eax, edi
004EC647   .  E8 5877F1FF             call    jfcard.00403DA4
004EC64C   .  8B07                    mov     eax, dword ptr [edi]
004EC64E   .  E8 7D79F1FF             call    jfcard.00403FD0           ;  得到注册码长度 -> eax
004EC653   .  83F8 03                 cmp     eax, 3                    ;  与3比较
004EC656   .  7D 10                   jge     short jfcard.004EC668     ;  大于等于,跳走(必须跳)
004EC658   .  8B45 FC                 mov     eax, dword ptr [ebp-4]
004EC65B   .  8B80 4C080000           mov     eax, dword ptr [eax+84C]
004EC661   .  B2 01                   mov     dl, 1
004EC663   .  E8 C888F6FF             call    jfcard.00454F30
004EC668   >  8BC3                    mov     eax, ebx
004EC66A   .  E8 05F7F8FF             call    jfcard.0047BD74
004EC66F   .  8BC3                    mov     eax, ebx
004EC671   .  E8 8E69F1FF             call    jfcard.00403004
004EC676   .  8D45 F4                 lea     eax, dword ptr [ebp-C]
004EC679   .  E8 D276F1FF             call    jfcard.00403D50
004EC67E   .  8B07                    mov     eax, dword ptr [edi]
004EC680   .  E8 4B79F1FF             call    jfcard.00403FD0           ;  得到注册码长度 -> eax
004EC685   .  8BD8                    mov     ebx, eax                  ;  -> ebx
004EC687   .  D1FB                    sar     ebx, 1                    ;  ebx := ebx sar 1;
004EC689   .  79 03                   jns     short jfcard.004EC68E
004EC68B   .  83D3 00                 adc     ebx, 0
004EC68E   >  83EB 01                 sub     ebx, 1                    ;  ebx := ebx -1;
004EC691   .  71 05                   jno     short jfcard.004EC698
004EC693   .  E8 AC68F1FF             call    jfcard.00402F44
004EC698   >  85DB                    test    ebx, ebx                  ;  是否为0
004EC69A   .  7E 5D                   jle     short jfcard.004EC6F9     ;  为零,跳走
004EC69C   .  BE 01000000             mov     esi, 1                    ;  esi := 1; //初始化
004EC6A1   >  8D45 F8                 lea     eax, dword ptr [ebp-8]    ;  循环运算开始
004EC6A4   .  50                      push    eax
004EC6A5   .  6BD6 02                 imul    edx, esi, 2               ;  edx := edx * 2;
004EC6A8   .  71 05                   jno     short jfcard.004EC6AF     ;  不益出,跳
004EC6AA   .  E8 9568F1FF             call    jfcard.00402F44
004EC6AF   >  83EA 01                 sub     edx, 1                    ;  edx := edx - 1;
004EC6B2   .  71 05                   jno     short jfcard.004EC6B9     ;  不益出,跳
004EC6B4   .  E8 8B68F1FF             call    jfcard.00402F44
004EC6B9   >  B9 02000000             mov     ecx, 2                    ;  ecx := 2;
004EC6BE   .  8B07                    mov     eax, dword ptr [edi]      ;  注册码 -> eax
004EC6C0   .  E8 137BF1FF             call    jfcard.004041D8           ;  取注册码的2位字符
004EC6C5   .  8D45 E0                 lea     eax, dword ptr [ebp-20]
004EC6C8   .  8B4D F8                 mov     ecx, dword ptr [ebp-8]    ;  -> ecx
004EC6CB   .  BA D4C84E00             mov     edx, jfcard.004EC8D4      ;  内存窗口中 Ctrl + G 键,输入 004EC8D4
004EC6D0   .  E8 4779F1FF             call    jfcard.0040401C           ;  前面加上$符号后,转换位16进制的数
004EC6D5   .  8B45 E0                 mov     eax, dword ptr [ebp-20]   ;  -> eax
004EC6D8   .  E8 2FC2F1FF             call    jfcard.0040890C           ;  再换成eax中的数据
004EC6DD   .  8BD0                    mov     edx, eax                  ;  edx := eax;
004EC6DF   .  83F2 3A                 xor     edx, 3A                   ;  edx := edx xor 3A;
004EC6E2   .  8D45 E4                 lea     eax, dword ptr [ebp-1C]
004EC6E5   .  E8 0E78F1FF             call    jfcard.00403EF8
004EC6EA   .  8B55 E4                 mov     edx, dword ptr [ebp-1C]
004EC6ED   .  8D45 F4                 lea     eax, dword ptr [ebp-C]    ;  [ebp-C]存放结果
004EC6F0   .  E8 E378F1FF             call    jfcard.00403FD8           ;  edx的结果写入[ebp-C]中
004EC6F5   .  46                      inc     esi
004EC6F6   .  4B                      dec     ebx
004EC6F7   .^ 75 A8                   jnz     short jfcard.004EC6A1     ;  不为0,继续循环运算
004EC6F9   >  8B45 F4                 mov     eax, dword ptr [ebp-C]    ;  上面循环运算后的结果连接 -> [ebp-C]中的数据 -> eax
004EC6FC   .  8B15 14C34F00           mov     edx, dword ptr [4FC314]   ;  读取的注册名 -> edx
004EC702   .  E8 D979F1FF             call    jfcard.004040E0           ;  比较上面两数据是否相等 eax=0?
004EC707      74 10                   je      short jfcard.004EC719     ;  相等,跳走(必须跳)
004EC709   .  8B45 FC                 mov     eax, dword ptr [ebp-4]
004EC70C   .  8B80 4C080000           mov     eax, dword ptr [eax+84C]
004EC712   .  B2 01                   mov     dl, 1
004EC714   .  E8 1788F6FF             call    jfcard.00454F30
004EC719   >  C605 F0C24F00 9E        mov     byte ptr [4FC2F0], 9E
(省略...)
》》》》》》

通过分析后,知道其注册验证为:读取注册表[HKEY_CURRENT_USER\Software\金锋贺卡制作]中的:Serial内的数据,与机器码比较是否相同;Reg内的数据,每2个字符一组,转换为16进制的ASCII码,然后异或58后的结果,与机器码的ASCII码比较,相同,便注册成功了!
PYG19周年生日快乐!

该用户从未签到

发表于 2007-11-19 17:06:55 | 显示全部楼层
学习逆向工程ing...
PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2017-9-24 22:49
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2007-11-21 17:08:08 | 显示全部楼层
    好东西,谢谢楼主
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2017-9-24 22:49
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2007-11-22 09:41:11 | 显示全部楼层
    学习逆向工程…………
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表