acafeel 发表于 2007-11-10 16:11:31

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

金锋贺卡制作 标准版 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    ;-> edx
004EC5F0   .B8 E4C24F00             mov   eax, jfcard.004FC2E4
004EC5F5   .E8 AA77F1FF             call    jfcard.00403DA4
004EC5FA   .8D45 EC               lea   eax, dword ptr
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    ;Serial中的数据 -> eax
004EC616   .8B15 14C34F00         mov   edx, dword ptr    ;计算出的机器码 -> edx
004EC61C   .E8 BF7AF1FF             call    jfcard.004040E0         ;比较上面两数据是否相等 eax=0?
004EC621      74 10                   je      short jfcard.004EC633   ;相等,跳走(必须跳)
004EC623   .8B45 FC               mov   eax, dword ptr
004EC626   .8B80 4C080000         mov   eax, dword ptr
004EC62C   .B2 01                   mov   dl, 1
004EC62E   .E8 FD88F6FF             call    jfcard.00454F30
004EC633   >8D4D E8               lea   ecx, dword ptr
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    ;-> edx
004EC645   .8BC7                  mov   eax, edi
004EC647   .E8 5877F1FF             call    jfcard.00403DA4
004EC64C   .8B07                  mov   eax, dword ptr
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
004EC65B   .8B80 4C080000         mov   eax, dword ptr
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
004EC679   .E8 D276F1FF             call    jfcard.00403D50
004EC67E   .8B07                  mov   eax, dword ptr
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     ;循环运算开始
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       ;注册码 -> eax
004EC6C0   .E8 137BF1FF             call    jfcard.004041D8         ;取注册码的2位字符
004EC6C5   .8D45 E0               lea   eax, dword ptr
004EC6C8   .8B4D F8               mov   ecx, dword ptr     ;-> 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    ;-> 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
004EC6E5   .E8 0E78F1FF             call    jfcard.00403EF8
004EC6EA   .8B55 E4               mov   edx, dword ptr
004EC6ED   .8D45 F4               lea   eax, dword ptr     ;存放结果
004EC6F0   .E8 E378F1FF             call    jfcard.00403FD8         ;edx的结果写入中
004EC6F5   .46                      inc   esi
004EC6F6   .4B                      dec   ebx
004EC6F7   .^ 75 A8                   jnz   short jfcard.004EC6A1   ;不为0,继续循环运算
004EC6F9   >8B45 F4               mov   eax, dword ptr     ;上面循环运算后的结果连接 -> 中的数据 -> eax
004EC6FC   .8B15 14C34F00         mov   edx, dword ptr    ;读取的注册名 -> edx
004EC702   .E8 D979F1FF             call    jfcard.004040E0         ;比较上面两数据是否相等 eax=0?
004EC707      74 10                   je      short jfcard.004EC719   ;相等,跳走(必须跳)
004EC709   .8B45 FC               mov   eax, dword ptr
004EC70C   .8B80 4C080000         mov   eax, dword ptr
004EC712   .B2 01                   mov   dl, 1
004EC714   .E8 1788F6FF             call    jfcard.00454F30
004EC719   >C605 F0C24F00 9E      mov   byte ptr , 9E
(省略...)
》》》》》》

通过分析后,知道其注册验证为:读取注册表中的:Serial内的数据,与机器码比较是否相同;Reg内的数据,每2个字符一组,转换为16进制的ASCII码,然后异或58后的结果,与机器码的ASCII码比较,相同,便注册成功了!

fengasdf 发表于 2007-11-19 17:06:55

学习逆向工程ing...

sdprtf 发表于 2007-11-21 17:08:08

好东西,谢谢楼主

sdprtf 发表于 2007-11-22 09:41:11

学习逆向工程…………
页: [1]
查看完整版本: 金锋贺卡制作 标准版 v5.0 注册算法简单分析