金锋贺卡制作 标准版 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码比较,相同,便注册成功了! 学习逆向工程ing... 好东西,谢谢楼主 学习逆向工程…………
页:
[1]