【文章标题】: Falco Icon Studio V2.2注册算法分析
【文章作者】: CRP
【作者邮箱】: cccttt@126.com
【作者主页】: No
【作者QQ号】: 249810097
【软件名称】: Falco Icon Studio V2.2
【软件大小】: 2051 KB
【下载地址】: http://www.skycn.com/soft/34687.html
【加壳方式】: 无
【保护方式】: 注册码,14天试用期
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: PEID, OD
【操作平台】: xp sp2
【软件介绍】: 一个制作、编辑和导出图标的国外软工具。
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
这次分析的是国外软件,但愿这篇破文能做为我在看雪论坛的第一篇精华,希望各路高手批评指正。
闲话不说了,直接说正题。首先安装后,运行软件,出现提示注册对话框。Serial为2089251785,key输入随意填1234567890,点OK,程序弹出“you have entered the wrong info!”看来有出错提示,应该容易下手。用PEID侦完发现无壳,于是直接用OD载入。右键“查找”->“所有字符串参考”,找到错误信息处“you have entered the wrong info!”。向上看,发现
004D3B34 |. 8BD0 mov edx, eax
004D3B36 |. 8BC6 mov eax, esi
004D3B38 |. E8 97FBFFFF call 004D36D4 ;关键CALL
004D3B3D |. 84C0 test al, al
004D3B3F |. 75 18 jnz short 004D3B59 ;跳走则注册不成功。
004D3B41 |> 6A 10 push 10
004D3B43 |. 6A 00 push 0
004D3B45 |. 68 903B4D00 push 004D3B90 ; you have entered the wrong info!
004D3B4A |. 8BC3 mov eax, ebx
004D3B4C |. E8 77B7F8FF call 0045F2C8
004D3B51 |. 50 push eax ; |hOwner
004D3B52 |. E8 BD39F3FF call <jmp.&user32.MessageBoxA> ; \MessageBoxA
向上看,经过简单分析,基本确定004D3B38处的call 004D36D4为关键CALL,于是F2下断。
F9运行程序,仍输入假KEY:1234567890,程序停在004D3B34。继续小心F8,跟进关键CALL,运行到004D36D4。
===========================================
注册码关键CALL
004D36D4 /$ 55 push ebp
004D36D5 |. 8BEC mov ebp, esp
004D36D7 |. 81C4 B8FCFFFF add esp, -348
004D36DD |. 53 push ebx
004D36DE |. 56 push esi
004D36DF |. 33C9 xor ecx, ecx
004D36E1 |. 898D B8FCFFFF mov dword ptr [ebp-348], ecx
004D36E7 |. 8BF2 mov esi, edx
004D36E9 |. 8BD8 mov ebx, eax
004D36EB |. 33C0 xor eax, eax
004D36ED |. 55 push ebp
004D36EE |. 68 F6374D00 push 004D37F6
004D36F3 |. 64:FF30 push dword ptr fs:[eax]
004D36F6 |. 64:8920 mov dword ptr fs:[eax], esp
004D36F9 |. A1 54525000 mov eax, dword ptr [505254] ; 机器码(7C8773C9)存入eax。可用内存断点的办法找到机器码来自于004D3876;
004D36FE |. B9 80841E00 mov ecx, 1E8480 ; ecx =1E8480 "2000000(十进制)"
004D3703 |. 33D2 xor edx, edx ; edx清零
004D3705 |. F7F1 div ecx ; 做无符号除法
004D3707 |. 8995 BCFCFFFF mov dword ptr [ebp-344], edx ; 结果为1319C9存入edx
004D370D |. 33C0 xor eax, eax ; eax清零
004D370F |. 8985 C0FCFFFF mov dword ptr [ebp-340], eax
004D3715 |. DFAD BCFCFFFF fild qword ptr [ebp-344] ; 装入整数1319C9到st0 ,即十进制1251785
004D371B |. DB2D 08384D00 fld tbyte ptr [4D3808] ; 装入实数ds:[004D3808]=56.452418513541498880到st0
004D3721 |. DEC9 fmulp st(1), st ; st1 <- st0 * st1,然后结果出栈
004D3723 |. E8 B4F4F2FF call 00402BDC ; 这个call在后面做解释
004D3728 |. 52 push edx
004D3729 |. 50 push eax ; 真码(十进制)入栈
004D372A |. 8BC6 mov eax, esi
004D372C |. 99 cdq ; 把EAX中的字的符号扩展到EDX中去
004D372D |. 3B5424 04 cmp edx, dword ptr [esp+4]
004D3731 |. 75 03 jnz short 004D3736
004D3733 |. 3B0424 cmp eax, dword ptr [esp] ; 经典比较
004D3736 |> 5A pop edx
004D3737 |. 58 pop eax
004D3738 |. 0F85 9D000000 jnz 004D37DB
004D373E |. C643 04 01 mov byte ptr [ebx+4], 1
004D3742 |. 8B05 28065000 mov eax, dword ptr [500628]
004D3748 |. 8945 98 mov dword ptr [ebp-68], eax
004D374B |. 8B05 2C065000 mov eax, dword ptr [50062C]
004D3751 |. 8945 9C mov dword ptr [ebp-64], eax
004D3754 |. 68 04010000 push 104 ; /BufSize = 104 (260.)
004D3759 |. 8D85 13FEFFFF lea eax, dword ptr [ebp-1ED] ; |
004D375F |. 50 push eax ; |Buffer
004D3760 |. E8 F734F3FF call <jmp.&kernel32.GetSystemDirectoryA> ; \GetSystemDirectoryA
004D3765 |. 8D85 B8FCFFFF lea eax, dword ptr [ebp-348]
004D376B |. 8D95 13FEFFFF lea edx, dword ptr [ebp-1ED]
004D3771 |. B9 05010000 mov ecx, 105
004D3776 |. E8 C911F3FF call 00404944
004D377B |. 8D85 B8FCFFFF lea eax, dword ptr [ebp-348]
004D3781 |. BA 1C384D00 mov edx, 004D381C ; \winf.pkg 如果注册成功,则将注册信息写进文件winf.pkg,存入在系统目录(我的是XP,为c:\windows\system32\)
===================================
下面,简单分析下004D3723 |. E8 B4F4F2FF call 00402BDC
00402BDC /$ 83EC 0C sub esp, 0C
00402BDF |. D93C24 fstcw word ptr [esp] ; 将FPU的控制字保存到esp,esp=0157ED64,0457
00402BE2 |. D97C24 02 fstcw word ptr [esp+2] ; 将FPU的控制字保存到esp+2,esp=015ED66,77D4
00402BE6 |. 9B wait
00402BE7 |. 66:814C24 02 >or word ptr [esp+2], 0F00 ; 或运算
00402BEE |. D96C24 02 fldcw word ptr [esp+2] ; 从esp+2装入FPU的控制字
00402BF2 |. DF7C24 04 fistp qword ptr [esp+4] ; esp+4 <- st;然后再执行一次出栈操作ss中的整数部分即为注册码
00402BF6 |. 9B wait
00402BF7 |. D92C24 fldcw word ptr [esp] ; 从esp装入FPU的控制字
00402BFA |. 59 pop ecx ; 1F721272
00402BFB |. 58 pop eax ; 正确注册码出栈,此处eax为十六制注册码
00402BFC |. 5A pop edx
00402BFD \. C3 retn ; 返回
经过以上分析,其注册码算法是:
1、取硬盘序列号,并转换成十进制,即为注册框里的serial;硬盘序列号存EAX;
2、将硬盘序列号(十六进制)与1E8480做无符号除法,结果存入EDX;
3、将edx以整数形式装入st0,再实数ds:[004D3808]=56.452418513541498880装入到st0;此时原st0装入st1;
5、进行st1 = st0 * st1运算;其结果整数部分即为正确注册码;成功后在系统目录下生成文件名为winf.pkg的注册息文件。
我的电脑上具体运行是这样的:
1、取硬盘序列号7C8773C9,转换成十进制2089251785;--->2、7C8773C9与1E8480取余数=001319C9;--->001319C9转换成十进制1251785装入st0;实数ds:[004D3808]=56.452418513541498880装入到st0;装入后st1=1251785;--->进行运算st1 = st0 * st1=56.452418513541498880 * 1251785 = 70666290.7089735451755008;--->取st1的整数部分70666290即为正确注册码。
适于本人电脑的注册信息是:serial:2089251785 key:70666290
--------------------------------------------------------------------------------
【经验总结】
这个软件的破解思路应该算是比较常规的,序列号找到注册码,根据错误提示找出关键算法CALL分析就行了。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年03月01日 下午 10:55:59
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)