首页
社区
课程
招聘
[原创]Falco Icon Studio V2.2注册算法分析
发表于: 2008-3-1 22:50 8506

[原创]Falco Icon Studio V2.2注册算法分析

CRP 活跃值
2
2008-3-1 22:50
8506

【文章标题】: 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


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
呵呵,支持一下。
并祝贺目标顺利实现。
2008-3-1 22:55
0
雪    币: 248
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
很感谢petnt兄弟哈。不知道要学习多久才能赶上你们哪。不过我会努力的。也希望得到你们更多的帮助哈。
2008-3-1 23:00
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
4
分析得不错,顶
2008-3-1 23:03
0
雪    币: 248
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
感谢各位支持!终于完成一个心愿了,呵呵。以后继续努力!!!
2008-3-1 23:10
0
雪    币: 259
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
恭喜恭喜,学习了
2008-3-2 10:18
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
7
支持一下,顶了!
2008-3-2 12:43
0
雪    币: 228
活跃值: (75)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
004D36F9  |.  A1 54525000   mov     eax, dword ptr [505254]                   ;  机器码(7C8773C9)存入eax。可用内存断点的办法找到机器码来自于004D3876;

请问LZ。。怎样用内存断点来确定机器码来自何处啊?
2008-3-2 13:08
0
雪    币: 248
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=ioukenzo;423126]004D36F9  |.  A1 54525000   mov     eax, dword ptr [505254]                   ;  机器码(7C8773C9)存入eax。可用内存断点的办法找到机器码来自于004D3876;

请问LZ。。怎样用内存断点来确定机器码来...[/QUOTE]

先D 505254,然后下内存写入断点,重新运行即可知道。不知我说清楚没有哈。
2008-3-2 13:46
0
雪    币: 200
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
厉害啊。。。。。。。。。。。。。。
2008-3-2 16:27
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
老外的软件就是厚道,换了个国产的,呵呵,机关重重
2008-3-2 18:07
0
游客
登录 | 注册 方可回帖
返回
//