- UID
- 3526
注册时间2005-10-6
阅读权限40
最后登录1970-1-1
独步武林
该用户从未签到
|
金锋贺卡制作 标准版 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码比较,相同,便注册成功了! |
|