zaas 发表于 2010-8-29 22:31

Ez-Architect 5.0算法分析及算法注册机【初级】

【破文标题】Ez-Architect 5.0算法分析及算法注册机【初级】
【破文作者】zaas
【破解工具】OllyICE,PEiD v0.94
【破解平台】WinXP
【更新时间】2010-8-29
【软件类别】国外软件/CAD
【软件语言】英文
【应用平台】WinXP/2000/2003/Vista
【软件性质】共享(收费)软件
【软件大小】13.88MB
【保护方式】注册码
【软件简介】家居设计软件已趋于复杂,有时候我们只是想设计平面。这个二维的家居设计和平面布置图软件,可以很方便的设计住宅、室内平面图。
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享
【破解说明】算法很简单,初级。。
--------------------------------------------------------------
【破解内容】
--------------------------------------------------------------
**************************************************************
查壳:peid查不出。但OD载入发现其实就是VC++的程序
**************************************************************
很久没分析算法了。手有点生。这是一个相对专业的软件。国内基本没有人使用。。
把注意力防在算法上吧。运行软件,点注册。需要输入5组注册码。输入假码1234-1234-1234-1234-1234。
下断不必说了,搜字符串就可以。直接来到关键call。
004A4B40/> \55            push    ebp
004A4B41|.8BEC          mov   ebp, esp
004A4B43|.81EC 3C020000 sub   esp, 23C
004A4B49|.56            push    esi
004A4B4A|.57            push    edi
004A4B4B|.51            push    ecx
004A4B4C|.8DBD C4FDFFFF lea   edi, dword ptr
004A4B52|.B9 8F000000   mov   ecx, 8F
004A4B57|.B8 CCCCCCCC   mov   eax, CCCCCCCC
004A4B5C|.F3:AB         rep   stos dword ptr es:
004A4B5E|.59            pop   ecx
004A4B5F|.A1 C8115300   mov   eax, dword ptr
004A4B64|.33C5          xor   eax, ebp
004A4B66|.8945 FC       mov   dword ptr , eax
004A4B69|.894D F8       mov   dword ptr , ecx
004A4B6C|.6A 01         push    1
004A4B6E|.8B4D F8       mov   ecx, dword ptr
004A4B71|.E8 487F0100   call    <jmp.&MFC80UD.#8622>
004A4B76|.8B45 F8       mov   eax, dword ptr
004A4B79|.83C0 74       add   eax, 74
004A4B7C|.8BF4          mov   esi, esp
004A4B7E|.50            push    eax
004A4B7F|.FF15 4C825300 call    dword ptr [<&MSVCR80D._wtoi>]    ;MSVCR80D._wtoi
004A4B85|.83C4 04       add   esp, 4                           ;第一组
004A4B88|.3BF4          cmp   esi, esp
004A4B8A|.E8 E18F0100   call    004BDB70
004A4B8F|.8985 ECFDFFFF mov   dword ptr , eax
004A4B95|.8B4D F8       mov   ecx, dword ptr
004A4B98|.83C1 7C       add   ecx, 7C
004A4B9B|.8BF4          mov   esi, esp
004A4B9D|.51            push    ecx
004A4B9E|.FF15 4C825300 call    dword ptr [<&MSVCR80D._wtoi>]    ;MSVCR80D._wtoi
004A4BA4|.83C4 04       add   esp, 4                           ;第二组
004A4BA7|.3BF4          cmp   esi, esp
004A4BA9|.E8 C28F0100   call    004BDB70
004A4BAE|.8985 E8FDFFFF mov   dword ptr , eax
004A4BB4|.8B55 F8       mov   edx, dword ptr
004A4BB7|.81C2 84000000 add   edx, 84
004A4BBD|.8BF4          mov   esi, esp
004A4BBF|.52            push    edx
004A4BC0|.FF15 4C825300 call    dword ptr [<&MSVCR80D._wtoi>]    ;MSVCR80D._wtoi
004A4BC6|.83C4 04       add   esp, 4                           ;第三组
004A4BC9|.3BF4          cmp   esi, esp
004A4BCB|.E8 A08F0100   call    004BDB70
004A4BD0|.8985 E4FDFFFF mov   dword ptr , eax
004A4BD6|.8B45 F8       mov   eax, dword ptr
004A4BD9|.05 8C000000   add   eax, 8C
004A4BDE|.8BF4          mov   esi, esp
004A4BE0|.50            push    eax
004A4BE1|.FF15 4C825300 call    dword ptr [<&MSVCR80D._wtoi>]    ;MSVCR80D._wtoi
004A4BE7|.83C4 04       add   esp, 4                           ;第四组
004A4BEA|.3BF4          cmp   esi, esp
004A4BEC|.E8 7F8F0100   call    004BDB70
004A4BF1|.8985 E0FDFFFF mov   dword ptr , eax
004A4BF7|.8B4D F8       mov   ecx, dword ptr
004A4BFA|.81C1 94000000 add   ecx, 94
004A4C00|.8BF4          mov   esi, esp
004A4C02|.51            push    ecx
004A4C03|.FF15 4C825300 call    dword ptr [<&MSVCR80D._wtoi>]    ;MSVCR80D._wtoi
004A4C09|.83C4 04       add   esp, 4                           ;第5组
004A4C0C|.3BF4          cmp   esi, esp
004A4C0E|.E8 5D8F0100   call    004BDB70
004A4C13|.8985 DCFDFFFF mov   dword ptr , eax

_wtoi函数,这个函数的参数是wchar_t* 把宽字符转为数值。跟踪发现,每组实际上只取了3个字符,修正假码为123-123-123-123-123继续;

004A4C19|.8BF4          mov   esi, esp
004A4C1B|.68 00010000   push    100                              ; /Count = 100 (256.)
004A4C20|.8D95 F4FDFFFF lea   edx, dword ptr          ; |
004A4C26|.52            push    edx                              ; |Buffer
004A4C27|.68 AA000000   push    0AA                              ; |RsrcID = STRING "962"
004A4C2C|.6A 00         push    0                              ; |hInst = NULL
004A4C2E|.FF15 14845300 call    dword ptr [<&USER32.LoadStringW>>; \LoadStringW
004A4C34|.3BF4          cmp   esi, esp                         ;资源中取字符串
004A4C36|.E8 358F0100   call    004BDB70
004A4C3B|.66:C785 FAFDF>mov   word ptr , 0
004A4C44|.8BF4          mov   esi, esp
004A4C46|.8D85 F4FDFFFF lea   eax, dword ptr
004A4C4C|.50            push    eax
004A4C4D|.FF15 4C825300 call    dword ptr [<&MSVCR80D._wtoi>]    ;MSVCR80D._wtoi
004A4C53|.83C4 04       add   esp, 4                           ;转数值
004A4C56|.3BF4          cmp   esi, esp
004A4C58|.E8 138F0100   call    004BDB70
004A4C5D|.8985 D8FDFFFF mov   dword ptr , eax
004A4C63|.8B8D D8FDFFFF mov   ecx, dword ptr
004A4C69|.3B8D ECFDFFFF cmp   ecx, dword ptr          ;第一组应=962
004A4C6F|.74 3A         je      short 004A4CAB
004A4C71|.8BF4          mov   esi, esp
004A4C73|.68 00010000   push    100                              ; /Count = 100 (256.)
004A4C78|.8D95 F4FDFFFF lea   edx, dword ptr          ; |
004A4C7E|.52            push    edx                              ; |Buffer
004A4C7F|.68 BC000000   push    0BC                              ; |RsrcID = STRING "The serial number you entered is invalid. Please check it."
004A4C84|.6A 00         push    0                              ; |hInst = NULL
004A4C86|.FF15 14845300 call    dword ptr [<&USER32.LoadStringW>>; \LoadStringW
由此可知,第一组字符串应该为“962”。修正假码为962-123-123-123-123后继续。

004A4C8C|.3BF4          cmp   esi, esp
004A4C8E|.E8 DD8E0100   call    004BDB70
004A4C93|.6A 00         push    0
004A4C95|.6A 00         push    0
004A4C97|.8D85 F4FDFFFF lea   eax, dword ptr
004A4C9D|.50            push    eax
004A4C9E|.8B4D F8       mov   ecx, dword ptr
004A4CA1|.E8 127E0100   call    <jmp.&MFC80UD.#5753>
004A4CA6|.E9 12020000   jmp   004A4EBD
004A4CAB|>83BD ECFDFFFF>cmp   dword ptr , 0         ;比较各组是否为0
004A4CB2|.74 24         je      short 004A4CD8
004A4CB4|.83BD E8FDFFFF>cmp   dword ptr , 0
004A4CBB|.74 1B         je      short 004A4CD8
004A4CBD|.83BD E4FDFFFF>cmp   dword ptr , 0
004A4CC4|.74 12         je      short 004A4CD8
004A4CC6|.83BD E0FDFFFF>cmp   dword ptr , 0
004A4CCD|.74 09         je      short 004A4CD8
004A4CCF|.83BD DCFDFFFF>cmp   dword ptr , 0
004A4CD6|.75 3A         jnz   short 004A4D12
004A4CD8|>8BF4          mov   esi, esp
004A4CDA|.68 00010000   push    100                              ; /Count = 100 (256.)
004A4CDF|.8D8D F4FDFFFF lea   ecx, dword ptr          ; |
004A4CE5|.51            push    ecx                              ; |Buffer
004A4CE6|.68 BC000000   push    0BC                              ; |RsrcID = STRING "The serial number you entered is invalid. Please check it."
004A4CEB|.6A 00         push    0                              ; |hInst = NULL
004A4CED|.FF15 14845300 call    dword ptr [<&USER32.LoadStringW>>; \LoadStringW
004A4CF3|.3BF4          cmp   esi, esp
004A4CF5|.E8 768E0100   call    004BDB70
004A4CFA|.6A 00         push    0
004A4CFC|.6A 00         push    0
004A4CFE|.8D95 F4FDFFFF lea   edx, dword ptr
004A4D04|.52            push    edx
004A4D05|.8B4D F8       mov   ecx, dword ptr
004A4D08|.E8 AB7D0100   call    <jmp.&MFC80UD.#5753>
004A4D0D|.E9 AB010000   jmp   004A4EBD
004A4D12|>8B85 ECFDFFFF mov   eax, dword ptr          ;第一组
004A4D18|.50            push    eax
004A4D19|.E8 5FD2F5FF   call    00401F7D                         ;余数累加?各位相加--》算法call1
004A4D1E|.83C4 04       add   esp, 4
004A4D21|.8985 D4FDFFFF mov   dword ptr , eax
004A4D27|.8B8D E8FDFFFF mov   ecx, dword ptr          ;第二组
004A4D2D|.51            push    ecx
004A4D2E|.E8 3FD3F5FF   call    00402072                         ;方式B--》算法call2
004A4D33|.83C4 04       add   esp, 4
004A4D36|.8985 D0FDFFFF mov   dword ptr , eax         ;结果保存
004A4D3C|.8B95 DCFDFFFF mov   edx, dword ptr          ;第5组
004A4D42|.52            push    edx
004A4D43|.E8 2AD3F5FF   call    00402072
004A4D48|.83C4 04       add   esp, 4
004A4D4B|.8985 CCFDFFFF mov   dword ptr , eax
004A4D51|.8B85 D4FDFFFF mov   eax, dword ptr          ;第一组结果
004A4D57|.0385 D0FDFFFF add   eax, dword ptr          ;+第二组结果
004A4D5D|.6BC0 03       imul    eax, eax, 3                      ;*3
004A4D60|.8B8D D4FDFFFF mov   ecx, dword ptr          ;第一组结果
004A4D66|.83E9 01       sub   ecx, 1                           ;-1
004A4D69|.0FAF8D E8FDFF>imul    ecx, dword ptr          ;*第二组的值
004A4D70|.2BC1          sub   eax, ecx                         ;二者相减
004A4D72|.50            push    eax                              ; /x
004A4D73|.E8 72910100   call    <jmp.&MSVCR80D.abs>            ; \abs
004A4D78|.83C4 04       add   esp, 4                           ;绝对值
004A4D7B|.8985 C8FDFFFF mov   dword ptr , eax
004A4D81|.8B95 C8FDFFFF mov   edx, dword ptr
004A4D87|.52            push    edx
004A4D88|.E8 FCDEF5FF   call    00402C89                         ;算法call3
004A4D8D|.83C4 04       add   esp, 4
004A4D90|.8985 C8FDFFFF mov   dword ptr , eax
004A4D96|.8B85 E4FDFFFF mov   eax, dword ptr          ;第三组
004A4D9C|.3B85 C8FDFFFF cmp   eax, dword ptr          ;二者需相等
004A4DA2|.74 3A         je      short 004A4DDE
004A4DA4|.8BF4          mov   esi, esp
004A4DA6|.68 00010000   push    100                              ; /Count = 100 (256.)
004A4DAB|.8D8D F4FDFFFF lea   ecx, dword ptr          ; |
004A4DB1|.51            push    ecx                              ; |Buffer
004A4DB2|.68 BC000000   push    0BC                              ; |RsrcID = STRING "The serial number you entered is invalid. Please check it."
004A4DB7|.6A 00         push    0                              ; |hInst = NULL
004A4DB9|.FF15 14845300 call    dword ptr [<&USER32.LoadStringW>>; \LoadStringW
004A4DBF|.3BF4          cmp   esi, esp
004A4DC1|.E8 AA8D0100   call    004BDB70
004A4DC6|.6A 00         push    0
004A4DC8|.6A 00         push    0
004A4DCA|.8D95 F4FDFFFF lea   edx, dword ptr
004A4DD0|.52            push    edx
004A4DD1|.8B4D F8       mov   ecx, dword ptr
004A4DD4|.E8 DF7C0100   call    <jmp.&MFC80UD.#5753>
004A4DD9|.E9 DF000000   jmp   004A4EBD
004A4DDE|>8B85 D4FDFFFF mov   eax, dword ptr          ;第一组的结果
004A4DE4|.0385 CCFDFFFF add   eax, dword ptr          ;第5组的结果
004A4DEA|.6BC0 03       imul    eax, eax, 3
004A4DED|.8B8D D4FDFFFF mov   ecx, dword ptr
004A4DF3|.83E9 01       sub   ecx, 1
004A4DF6|.0FAF8D DCFDFF>imul    ecx, dword ptr          ;第5组
004A4DFD|.2BC1          sub   eax, ecx                         ;方法同上
004A4DFF|.50            push    eax                              ; /x
004A4E00|.E8 E5900100   call    <jmp.&MSVCR80D.abs>            ; \abs
004A4E05|.83C4 04       add   esp, 4
004A4E08|.8985 C4FDFFFF mov   dword ptr , eax
004A4E0E|.8B95 C4FDFFFF mov   edx, dword ptr
004A4E14|.52            push    edx
004A4E15|.E8 6FDEF5FF   call    00402C89
004A4E1A|.83C4 04       add   esp, 4
004A4E1D|.8985 C4FDFFFF mov   dword ptr , eax
004A4E23|.8B85 E0FDFFFF mov   eax, dword ptr          ;第四组
004A4E29|.3B85 C4FDFFFF cmp   eax, dword ptr
004A4E2F|.74 37         je      short 004A4E68
004A4E31|.8BF4          mov   esi, esp
004A4E33|.68 00010000   push    100                              ; /Count = 100 (256.)
004A4E38|.8D8D F4FDFFFF lea   ecx, dword ptr          ; |
004A4E3E|.51            push    ecx                              ; |Buffer
004A4E3F|.68 BC000000   push    0BC                              ; |RsrcID = STRING "The serial number you entered is invalid. Please check it."
004A4E44|.6A 00         push    0                              ; |hInst = NULL
004A4E46|.FF15 14845300 call    dword ptr [<&USER32.LoadStringW>>; \LoadStringW
004A4E4C|.3BF4          cmp   esi, esp
004A4E4E|.E8 1D8D0100   call    004BDB70
004A4E53|.6A 00         push    0
004A4E55|.6A 00         push    0
004A4E57|.8D95 F4FDFFFF lea   edx, dword ptr
004A4E5D|.52            push    edx
004A4E5E|.8B4D F8       mov   ecx, dword ptr
004A4E61|.E8 527C0100   call    <jmp.&MFC80UD.#5753>
004A4E66|.EB 55         jmp   short 004A4EBD
004A4E68|>8BF4          mov   esi, esp
004A4E6A|.68 00010000   push    100                              ; /Count = 100 (256.)
004A4E6F|.8D85 F4FDFFFF lea   eax, dword ptr          ; |
004A4E75|.50            push    eax                              ; |Buffer
004A4E76|.68 BD000000   push    0BD                              ; |RsrcID = STRING "Thank you for your purchase."
004A4E7B|.6A 00         push    0                              ; |hInst = NULL
004A4E7D|.FF15 14845300 call    dword ptr [<&USER32.LoadStringW>>; \LoadStringW

关键跳转页非常明显,不用多说。
算法里边分别对第一组,第二组第五组假码进行了处理,处理结果分别跟第三组,第四组做比较。注册码属于自验证型。跟进几个算法call看一看。

004A5174|.C745 FC 00000>mov   dword ptr , 0
004A517B|.C745 F8 00000>mov   dword ptr , 0
004A5182|.EB 09         jmp   short 004A518D
004A5184|>8B45 F8       /mov   eax, dword ptr
004A5187|.83C0 01       |add   eax, 1
004A518A|.8945 F8       |mov   dword ptr , eax
004A518D|>837D F8 03   cmp   dword ptr , 3            ;三次循环
004A5191|.7D 29         |jge   short 004A51BC
004A5193|.8B45 08       |mov   eax, dword ptr           ;第一组设为A
004A5196|.99            |cdq
004A5197|.B9 0A000000   |mov   ecx, 0A
004A519C|.F7F9          |idiv    ecx                           ;div 10
004A519E|.6BC0 0A       |imul    eax, eax, 0A                  ;*10
004A51A1|.8B55 08       |mov   edx, dword ptr
004A51A4|.2BD0          |sub   edx, eax                        ;A-A (div 10)*10,求余?算法很失败啊
004A51A6|.0355 FC       |add   edx, dword ptr           ;余数累加
004A51A9|.8955 FC       |mov   dword ptr , edx
004A51AC|.8B45 08       |mov   eax, dword ptr           ;A
004A51AF|.99            |cdq
004A51B0|.B9 0A000000   |mov   ecx, 0A
004A51B5|.F7F9          |idiv    ecx
004A51B7|.8945 08       |mov   dword ptr , eax          ;A div 10
004A51BA|.^ EB C8         \jmp   short 004A5184
004A51BC|>8B45 FC       mov   eax, dword ptr
004A51BF|.8BE5          mov   esp, ebp
004A51C1|.5D            pop   ebp
004A51C2\.C3            retn
求余算法是很失败的算法。在VC里边用%即可,即使在汇编里也可以简单的把edx相加即可。
软件作者的方法实在不敢恭维。。。
一言以蔽之,就是把第一组注册码962各位相加。。。算法1这么简单,算法2呢?来看:
004A50E4|.C745 FC 00000>mov   dword ptr , 0
004A50EB|.C745 F8 00000>mov   dword ptr , 0
004A50F2|.EB 09         jmp   short 004A50FD
004A50F4|>8B45 F8       /mov   eax, dword ptr
004A50F7|.83C0 01       |add   eax, 1
004A50FA|.8945 F8       |mov   dword ptr , eax
004A50FD|>837D F8 03   cmp   dword ptr , 3
004A5101|.7D 32         |jge   short 004A5135
004A5103|.8B4D FC       |mov   ecx, dword ptr           ;初始值为0(余数*10累加)
004A5106|.6BC9 0A       |imul    ecx, ecx, 0A                  ;*10
004A5109|.894D FC       |mov   dword ptr , ecx
004A510C|.8B45 08       |mov   eax, dword ptr           ;第二组
004A510F|.99            |cdq
004A5110|.B9 0A000000   |mov   ecx, 0A
004A5115|.F7F9          |idiv    ecx
004A5117|.6BC0 0A       |imul    eax, eax, 0A                  ;求余
004A511A|.8B55 08       |mov   edx, dword ptr
004A511D|.2BD0          |sub   edx, eax                        ;求余
004A511F|.0355 FC       |add   edx, dword ptr           ;累加
004A5122|.8955 FC       |mov   dword ptr , edx
004A5125|.8B45 08       |mov   eax, dword ptr
004A5128|.99            |cdq
004A5129|.B9 0A000000   |mov   ecx, 0A
004A512E|.F7F9          |idiv    ecx
004A5130|.8945 08       |mov   dword ptr , eax
004A5133|.^ EB BF         \jmp   short 004A50F4
004A5135|>8B45 FC       mov   eax, dword ptr
004A5138|.8BE5          mov   esp, ebp
004A513A|.5D            pop   ebp
004A513B\.C3            retn

依然不值得一提。依然有求余的烂算法。这次不同的是余数依次*10再累加。这是在做什么呢?
说穿了还是不值一提。就是把这个数值倒一下序,比如123变成321。。。
最后是算法3:
004A51E0/> \55            push    ebp
004A51E1|.8BEC          mov   ebp, esp
004A51E3|.8B45 08       mov   eax, dword ptr
004A51E6|.99            cdq
004A51E7|.B9 E8030000   mov   ecx, 3E8
004A51EC|.F7F9          idiv    ecx
004A51EE|.69C0 E8030000 imul    eax, eax, 3E8
004A51F4|.8B55 08       mov   edx, dword ptr
004A51F7|.2BD0          sub   edx, eax
004A51F9|.8BC2          mov   eax, edx
004A51FB|.5D            pop   ebp
004A51FC\.C3            retn

呵呵。。。。无语了,只是把数值%1000 求余。
【算法总结】算法那是相当的简单。非常软的柿子。
注册码第一组固定为:962,各位相加=0x11。
注册码第二组和第五组倒装,得到M2,M5
N3=(N2*10-3*(M2+0x11))%1000
N4=(N5*10-3*(M5+0x11))%1000
如此而已。

Delphi注册机关键代码如下:
function ModIT(m:Integer):Integer;
var
i,p,q:Integer;
begin
    q:=0;
    for i:=0 to 2 do
       begin
         q:=10*q+m mod 10;
         m:=m div 10;
       end;
    Result:=q;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      N2,N3,N4,N5,M2,M5:Integer;
    const
      N1=962;
      M1=$11;
begin
    Randomize;
    N2:=Random(900)+100;
    Randomize;
    N5:=Random(900)+100;
    M2:=ModIT(N2);
    M5:=ModIT(N5);
    N3:=Abs((M1+M2)*3-(M1-1)*N2 ) mod 1000;
    N4:=Abs((M1+M5)*3-(M1-1)*N5 ) mod 1000;
    edit2.Text:=IntToStr(N1)+'-'+ IntToStr(N2)+'-'+IntToStr(N3)+'-'+IntToStr(N4)+'-'+IntToStr(N5);
end;

两组可用的注册码:

962-208-871-917-405
962-215-853-615-413

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



臭味香头 发表于 2010-8-29 22:35

有没有汉化版的啊?英文不专业

qq20036 发表于 2010-8-29 22:59

支持LZ 看的我眼都花了 占个板凳!学了一下没学会啊!只能是观摩!

c203770116 发表于 2010-8-29 23:27

支持楼主啊,有心得了~~~~~~~~~~

skycn 发表于 2010-8-30 06:56

分析得很完整,不知这个软件在那里可以下的?

zhuyong770 发表于 2010-9-9 20:54

看不懂为什么我看不懂呢。。。。

yahao01 发表于 2010-9-10 19:52

不是专业 的看不多懂

yahao01 发表于 2010-9-10 19:54

不是专业 的看不多懂

286 发表于 2010-9-25 14:12

很好很强大,应该支持一下

cfc1680 发表于 2012-2-26 23:39

不错,喜欢这样的分析帖子,感谢
页: [1]
查看完整版本: Ez-Architect 5.0算法分析及算法注册机【初级】