zaas 发表于 2010-3-3 16:27

TTFtoDXF v43算法分析及算法注册机--纪念版

破文标题】TTFtoDXF v43算法分析及算法注册机--纪念版
【破文作者】zaas
【破解工具】OllyICE,PEiD v0.94
【破解平台】WinXP
【软件名称】TTFtoDXF v43
【更新时间】2010-2-21
【软件类别】英文软件/矢量化
【软件语言】英文
【应用平台】WinXP/2000/2003/Vista
【软件性质】共享(收费)软件
【软件大小】511KB
【原版下载】http://home.roadrunner.com/~gcodemcode/ttftodxf.htm
【保护方式】注册码
【软件简介】该软件可将TTF字体转换为DXF文件格式。
你可以编辑单个的字符、句子或整个段落。
你可更改字符的字体及文字高度。
你可更改字符间的间隔。
你可指定行距。
你可以将文本复制到该程序的对话框中进行转换,也可以自己输入文字。
该软件只支持英文字体,不支持中文字体。
共享版本可试用30天。有时间限制(30天,不过可调系统时间)、使用次数限制(30次)。到期 File和Edit菜单会灰掉。

【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
【写在前面】年过完了。年后又忙碌起来,不能像过年期间那么多时间调试软件了。
昨天整理了一下自己的东西,发现自己第一次破解的软件TTFtoDXF,距离现在整整7个月了。
当时写下了自己的第一篇破文:TTFtoDXF v42追码 【我的第一次Crack,极度初级】
名曰追码,实际上没有在追码,只是爆破而已。现在把追码补上,也算是一篇年后总结,兼纪念自己的第一次。

--------------------------------------------------------------
【破解内容】
--------------------------------------------------------------

**************************************************************
用PEiD查壳,Borland Delphi 4.0 - 5.0
**************************************************************
输入错误的注册码,软件无提示,要求重启验证。
观察到假码写入了reg.ini,so,下GetPrivateProfileStringA断点
来到:
0047BB2C/$55            push    ebp
0047BB2D|.8BEC          mov   ebp, esp
0047BB2F|.B9 2E000000   mov   ecx, 2E
0047BB34|>6A 00         /push    0
0047BB36|.6A 00         |push    0
0047BB38|.49            |dec   ecx
0047BB39|.^ 75 F9         \jnz   short 0047BB34
0047BB3B|.53            push    ebx
0047BB3C|.56            push    esi
0047BB3D|.57            push    edi
0047BB3E|.8BD8          mov   ebx, eax
0047BB40|.33C0          xor   eax, eax
0047BB42|.55            push    ebp
0047BB43|.68 8BBF4700   push    0047BF8B
0047BB48|.64:FF30       push    dword ptr fs:
0047BB4B|.64:8920       mov   dword ptr fs:, esp
0047BB4E|.C685 00FFFFFF>mov   byte ptr , 0
0047BB55|.8D95 F8FEFFFF lea   edx, dword ptr
0047BB5B|.33C0          xor   eax, eax
0047BB5D|.E8 DA6DF8FF   call    0040293C
0047BB62|.8B85 F8FEFFFF mov   eax, dword ptr
0047BB68|.8D95 FCFEFFFF lea   edx, dword ptr
0047BB6E|.E8 65D0F8FF   call    00408BD8
0047BB73|.8D85 FCFEFFFF lea   eax, dword ptr
0047BB79|.BA A4BF4700   mov   edx, 0047BFA4                  ;ASCII "Reg.ini"
0047BB7E|.E8 4982F8FF   call    00403DCC

以上代码取出假码。shift F9返回:
0047B38C/.55            push    ebp
0047B38D|.8BEC          mov   ebp, esp
0047B38F|.B9 0B000000   mov   ecx, 0B
0047B394|>6A 00         /push    0
0047B396|.6A 00         |push    0
0047B398|.49            |dec   ecx
0047B399|.^ 75 F9         \jnz   short 0047B394
0047B39B|.53            push    ebx
0047B39C|.56            push    esi
0047B39D|.57            push    edi
0047B39E|.8BD8          mov   ebx, eax
0047B3A0|.33C0          xor   eax, eax
0047B3A2|.55            push    ebp
0047B3A3|.68 BDB64700   push    0047B6BD
0047B3A8|.64:FF30       push    dword ptr fs:
0047B3AB|.64:8920       mov   dword ptr fs:, esp
0047B3AE|.8BC3          mov   eax, ebx
0047B3B0|.E8 77070000   call    0047BB2C                         ;读取reg.ini
0047B3B5|.33C0          xor   eax, eax
0047B3B7|.E8 74D9F8FF   call    00408D30
0047B3BC|.8945 F0       mov   dword ptr , eax
0047B3BF|.8955 F4       mov   dword ptr , edx
0047B3C2|.6A 00         push    0
0047B3C4|.68 CC100000   push    10CC
0047B3C9|.8B45 F0       mov   eax, dword ptr
0047B3CC|.8B55 F4       mov   edx, dword ptr
0047B3CF|.E8 5AB1F8FF   call    0040652E                         ;机器码
0047B3D4|.85D2          test    edx, edx
0047B3D6|.7D 07         jge   short 0047B3DF
0047B3D8|.F7D8          neg   eax
0047B3DA|.83D2 00       adc   edx, 0
0047B3DD|.F7DA          neg   edx
0047B3DF|>8945 F0       mov   dword ptr , eax
。。。。。。
0047B506|.E8 5D88F8FF   call    00403D68
0047B50B|.8B45 C4       mov   eax, dword ptr           ;假码
0047B50E|.8D55 FC       lea   edx, dword ptr
0047B511|.E8 4676F8FF   call    00402B5C                         ;假码转换为数字Sn1
0047B516|.8BF0          mov   esi, eax
0047B518|.68 D4B64700   push    0047B6D4                         ;ASCII "ID NUMBER = "
0047B51D|.FF75 F4       push    dword ptr
0047B520|.FF75 F0       push    dword ptr
0047B523|.8D45 BC       lea   eax, dword ptr
0047B526|.E8 5DD4F8FF   call    00408988                         ;ID number
0047B52B|.FF75 BC       push    dword ptr
0047B52E|.68 ECB64700   push    0047B6EC                         ;ASCII "017151."
0047B533|.8D55 B8       lea   edx, dword ptr
0047B536|.B8 CC100000   mov   eax, 10CC                        ;10cc=4300
0047B53B|.E8 18D4F8FF   call    00408958
0047B540|.FF75 B8       push    dword ptr
0047B543|.68 FCB64700   push    0047B6FC                         ;ASCII "ttz"
0047B548|.8D45 C0       lea   eax, dword ptr
0047B54B|.BA 05000000   mov   edx, 5
0047B550|.E8 2F89F8FF   call    00403E84                         ;合并ID number
0047B555|.8B55 C0       mov   edx, dword ptr
0047B558|.8B83 EC020000 mov   eax, dword ptr
0047B55E|.E8 B934FBFF   call    0042EA1C
0047B563|.D1FE          sar   esi, 1                           ;Sn1除以2
0047B565|.79 03         jns   short 0047B56A
0047B567|.83D6 00       adc   esi, 0
0047B56A|>56            push    esi
0047B56B|.68 CC100000   push    10CC                           ;4300
0047B570|.E8 A3FDFFFF   call    <jmp.&GCDL.Registered>
0047B575|.84C0          test    al, al
0047B577|.0F84 97000000 je      0047B614
0047B57D|.A1 A41C4800   mov   eax, dword ptr
0047B582|.C600 01       mov   byte ptr , 1                ;写入全局变量
0047B585|.BA 08B74700   mov   edx, 0047B708                  ;ASCII "Registered Thank you"
0047B58A|.8BC3          mov   eax, ebx
0047B58C|.E8 8B34FBFF   call    0042EA1C
0047B591|.BA 28B74700   mov   edx, 0047B728                  ;ASCII " Reg Ok "
0047B596|.8B83 EC020000 mov   eax, dword ptr              ;invalidate license info!

由此可知,0047B570|.E8 A3FDFFFF   call    <jmp.&GCDL.Registered>为关键call。跟进关键call,发现注册码的验证不是在exe而是在GCDL.dll。

0003993C4 >/$55            push    ebp
003993C5|.8BEC          mov   ebp, esp
003993C7|.83C4 E8       add   esp, -18
003993CA|.53            push    ebx
003993CB|.33DB          xor   ebx, ebx
003993CD|.33C0          xor   eax, eax
003993CF|.E8 F0CEFFFF   call    003962C4                         ;GetDiskFreeSpaceEXa
003993D4|.8945 F8       mov   dword ptr , eax         ;C盘容量低位
003993D7|.8955 FC       mov   dword ptr , edx         ;C盘容量高位
003993DA|.8B45 08       mov   eax, dword ptr          ;ID的部分
003993DD|.99            cdq
003993DE|.52            push    edx
003993DF|.50            push    eax
003993E0|.8B45 F8       mov   eax, dword ptr
003993E3|.8B55 FC       mov   edx, dword ptr
003993E6|.E8 2BB8FFFF   call    00394C16                         ;C盘容量除以4300,取整
003993EB|.85D2          test    edx, edx
003993ED|.7D 07         jge   short 003993F6
003993EF|.F7D8          neg   eax
003993F1|.83D2 00       adc   edx, 0
003993F4|.F7DA          neg   edx
003993F6|>8945 F8       mov   dword ptr , eax         ;=机器码部分
003993F9|.8955 FC       mov   dword ptr , edx
003993FC|.DF6D F8       fild    qword ptr                 ;浮点加载
003993FF|.DB7D E8       fstp    tbyte ptr
00399402|.9B            wait
00399403|.DB6D E8       fld   tbyte ptr
00399406|.D9E1          fabs                                     ;绝对值
00399408|.D9FA          fsqrt                                    ;平方根
0039940A|.DB7D E8       fstp    tbyte ptr
0039940D|.9B            wait
0039940E|.8B45 0C       mov   eax, dword ptr
00399411|.99            cdq
00399412|.52            push    edx
00399413|.50            push    eax
00399414|.DB6D E8       fld   tbyte ptr
00399417|.DB2D 54943900 fld   tbyte ptr                ;3.141
0039941D|.DEC9          fmulp   st(1), st                        ;相乘
0039941F|.E8 4093FFFF   call    00392764                         ;浮点保存整数出栈-》Sn2
00399424|.290424      sub   dword ptr , eax             ;(Sn1)/2-Sn2
00399427|.195424 04   sbb   dword ptr , edx
0039942B|.58            pop   eax                              ;取出
0039942C|.5A            pop   edx
0039942D|.85D2          test    edx, edx
0039942F|.7D 07         jge   short 00399438
00399431|.F7D8          neg   eax
00399433|.83D2 00       adc   edx, 0
00399436|.F7DA          neg   edx
00399438|>83FA 00       cmp   edx, 0
0039943B|.75 07         jnz   short 00399444
0039943D|.83F8 64       cmp   eax, 64                        ;eax<=64注册成功
00399440|.73 06         jnb   short 00399448
00399442|.EB 02         jmp   short 00399446
00399444|>7D 02         jge   short 00399448
00399446|>B3 01         mov   bl, 1                            ;标志位
00399448|>8BC3          mov   eax, ebx
0039944A|.5B            pop   ebx
0039944B|.8BE5          mov   esp, ebp
0039944D|.5D            pop   ebp
0039944E\.C2 0800       retn    8

其中需要说明的是64除法的分析:
003993E6|.E8 2BB8FFFF   call    00394C16                         ;C盘容量除以4300,取整
感谢前辈们的辛勤工作,实在看不懂的同学参考下:http://www.pediy.com/bbshtml/bbs7/pediy7-180.htm

00394C16/$55            push    ebp
00394C17|.53            push    ebx
00394C18|.56            push    esi
00394C19|.57            push    edi
00394C1A|.33FF          xor   edi, edi
00394C1C|.8B5C24 14   mov   ebx, dword ptr           ;机器码部分
00394C20|.8B4C24 18   mov   ecx, dword ptr
00394C24|.0BC9          or      ecx, ecx
00394C26|.75 08         jnz   short 00394C30
00394C28|.0BD2          or      edx, edx                         ;容量小的时候
00394C2A|.74 5C         je      short 00394C88
00394C2C|.0BDB          or      ebx, ebx
00394C2E|.74 58         je      short 00394C88
00394C30|>0BD2          or      edx, edx
00394C32|.79 0A         jns   short 00394C3E                   ;非负跳转
00394C34|.F7DA          neg   edx
00394C36|.F7D8          neg   eax
00394C38|.83DA 00       sbb   edx, 0
00394C3B|.83CF 01       or      edi, 1
00394C3E|>0BC9          or      ecx, ecx
00394C40|.79 0A         jns   short 00394C4C
00394C42|.F7D9          neg   ecx
00394C44|.F7DB          neg   ebx
00394C46|.83D9 00       sbb   ecx, 0
00394C49|.83F7 01       xor   edi, 1
00394C4C|>8BE9          mov   ebp, ecx
00394C4E|.B9 40000000   mov   ecx, 40                        ;ecx=40
00394C53|.57            push    edi
00394C54|.33FF          xor   edi, edi
00394C56|.33F6          xor   esi, esi
00394C58|>D1E0          /shl   eax, 1                        ;eax*2
00394C5A|.D1D2          |rcl   edx, 1                        ;edx*2
00394C5C|.D1D6          |rcl   esi, 1
00394C5E|.D1D7          |rcl   edi, 1
00394C60|.3BFD          |cmp   edi, ebp
00394C62|.72 0B         |jb      short 00394C6F
00394C64|.77 04         |ja      short 00394C6A
00394C66|.3BF3          |cmp   esi, ebx
00394C68|.72 05         |jb      short 00394C6F
00394C6A|>2BF3          |sub   esi, ebx
00394C6C|.1BFD          |sbb   edi, ebp
00394C6E|.40            |inc   eax
00394C6F|>^ E2 E7         \loopd   short 00394C58                  ;循环40H次
00394C71|.5B            pop   ebx
00394C72|.F7C3 01000000 test    ebx, 1
00394C78|.74 07         je      short 00394C81
00394C7A|.F7DA          neg   edx
00394C7C|.F7D8          neg   eax
00394C7E|.83DA 00       sbb   edx, 0
00394C81|>5F            pop   edi
00394C82|.5E            pop   esi
00394C83|.5B            pop   ebx
00394C84|.5D            pop   ebp
00394C85|.C2 0800       retn    8
00394C88|>F7F3          div   ebx
00394C8A|.33D2          xor   edx, edx
00394C8C\.^ EB F3         jmp   short 00394C81
00394C8E   .56            push    esi
00394C8F   .8B7424 0C   mov   esi, dword ptr
00394C93   .237424 08   and   esi, dword ptr
00394C97   .83FE FF       cmp   esi, -1
00394C9A   .75 11         jnz   short 00394CAD
00394C9C   .8BF0          mov   esi, eax
00394C9E   .0BF2          or      esi, edx
00394CA0   .81FE 00000080 cmp   esi, 80000000
00394CA6   .75 05         jnz   short 00394CAD
00394CA8   .8BC6          mov   eax, esi
00394CAA   .5E            pop   esi
00394CAB   .48            dec   eax
00394CAC   .C3            retn

【算法总结】
1.取得C:的容量,除以4300得到机器码unique ID
2.机器码开放后乘以3.141得到K
2.k减去注册码的一半,如果结果小于等于100,注册成功,否则失败
【破解总结】
爆破极度简单,属于秒杀型。
【算法注册机】
VB取硬盘容量稍显麻烦,既然有unique ID显示,不妨采用一个偷懒的方法

Private Sub Command1_Click()

    Dim MachineCode As String
    Dim Serial As Single
   
    MachineCode = Trim(Text1.Text)
    If InStr(MachineCode, "017151.4300ttz") > 0 Then
      MachineCode = Replace(MachineCode, "017151.4300ttz", "")
      MachineCode = Replace(MachineCode, "ID NUMBER = ", "")
      Serial = Int(Sqr(Val(Trim(MachineCode))) * 3.141) * 2 + 100
      Text2.Text = Serial
    Else
      Text1.Text = "Please Check Your Unique ID"
    End If
End Sub



【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

疯子韩 发表于 2010-3-3 17:36

楼主的第一次啊!呵呵,支持原创作品

落日余晖 发表于 2010-3-21 11:16

感谢楼主分享,饮水思源谢谢啦:handshake

hanqingv21 发表于 2010-3-22 15:21

这个收藏了

落雪飞花 发表于 2011-2-11 14:06

不错 支持!收藏了
页: [1]
查看完整版本: TTFtoDXF v43算法分析及算法注册机--纪念版