zaas 发表于 2010-9-6 21:45:02

CompareDWG for AutoCAD 2006-2011算法分析及算法注册机

【破文标题】CompareDWG for AutoCAD 2006-2011算法分析及算法注册机
【破文作者】zaas
【破解工具】OllyICE,PEiD v0.94
【破解平台】WinXP
【软件类别】:汉化补丁/CAD 图形
【软件授权】:共享版
【软件介绍】:CompareDWG 是用来比较两个DWG图形之间差异的工具,用它可以非常快速的找出两个图形文件的不同之处,并用不同的颜色标注出来,还可以生成详细的报表,让你对图形的变动一目了然。此软件对于图纸被他人修改过后却苦于无法找出被修改的地方非常有用。
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享
--------------------------------------------------------------
【破解内容】
--------------------------------------------------------------
这个是autocad下的二次开发软件。打开Autocad,OD附加。发现如果输入的注册码不对的话,软件的保存注册码按钮是灰色的。

因此下enablewindow断点。断下,返回在
0D094740/$55            push    ebp
0D094741|.8BEC          mov   ebp, esp
0D094743|.6A FF         push    -1
0D094745|.68 04770A0D   push    0D0A7704
0D09474A|.64:A1 0000000>mov   eax, dword ptr fs:
0D094750|.50            push    eax
0D094751|.83EC 48       sub   esp, 48
0D094754|.A1 603B0B0D   mov   eax, dword ptr
0D094759|.33C5          xor   eax, ebp
0D09475B|.50            push    eax
0D09475C|.8D45 F4       lea   eax, dword ptr
0D09475F|.64:A3 0000000>mov   dword ptr fs:, eax
0D094765|.894D D4       mov   dword ptr , ecx
0D094768|.6A 01         push    1
0D09476A|.8B4D D4       mov   ecx, dword ptr
0D09476D|.E8 DC1A0100   call    <jmp.&mfc90u.#6760>
0D094772|.51            push    ecx
0D094773|.8BCC          mov   ecx, esp
0D094775|.8965 E8       mov   dword ptr , esp
0D094778|.68 9BB30A0D   push    0D0AB39B
0D09477D|.FF15 FC930A0D call    dword ptr [<&mfc90u.#290>]       ;mfc90u.78BF338D
0D094783|.8945 D0       mov   dword ptr , eax
0D094786|.8B45 D0       mov   eax, dword ptr
0D094789|.8945 CC       mov   dword ptr , eax
0D09478C|.C745 FC 00000>mov   dword ptr , 0
0D094793|.8B4D D4       mov   ecx, dword ptr
0D094796|.83C1 74       add   ecx, 74
0D094799|.51            push    ecx
0D09479A|.8BD4          mov   edx, esp
0D09479C|.8965 E4       mov   dword ptr , esp
0D09479F|.51            push    ecx
0D0947A0|.8BCA          mov   ecx, edx
0D0947A2|.FF15 20960A0D call    dword ptr [<&mfc90u.#280>]       ;取出假码
0D0947A8|.8945 C8       mov   dword ptr , eax
0D0947AB|.8B45 C8       mov   eax, dword ptr
0D0947AE|.8945 C4       mov   dword ptr , eax
0D0947B1|.C645 FC 01    mov   byte ptr , 1
0D0947B5|.8B4D D4       mov   ecx, dword ptr
0D0947B8|.83C1 78       add   ecx, 78
0D0947BB|.51            push    ecx
0D0947BC|.8BD4          mov   edx, esp
0D0947BE|.8965 E0       mov   dword ptr , esp
0D0947C1|.51            push    ecx
0D0947C2|.8BCA          mov   ecx, edx
0D0947C4|.FF15 20960A0D call    dword ptr [<&mfc90u.#280>]       ;取出注册名
0D0947CA|.8945 C0       mov   dword ptr , eax
0D0947CD|.8B45 C0       mov   eax, dword ptr
0D0947D0|.8945 BC       mov   dword ptr , eax
0D0947D3|.C645 FC 02    mov   byte ptr , 2
0D0947D7|.8B4D D4       mov   ecx, dword ptr
0D0947DA|.83C1 7C       add   ecx, 7C
0D0947DD|.51            push    ecx
0D0947DE|.8BD4          mov   edx, esp
0D0947E0|.8965 DC       mov   dword ptr , esp
0D0947E3|.51            push    ecx
0D0947E4|.8BCA          mov   ecx, edx
0D0947E6|.FF15 20960A0D call    dword ptr [<&mfc90u.#280>]       ;注册类型
0D0947EC|.8945 B8       mov   dword ptr , eax
0D0947EF|.8B45 B8       mov   eax, dword ptr
0D0947F2|.8945 B4       mov   dword ptr , eax
0D0947F5|.C645 FC 03    mov   byte ptr , 3
0D0947F9|.51            push    ecx
0D0947FA|.8BCC          mov   ecx, esp
0D0947FC|.8965 D8       mov   dword ptr , esp
0D0947FF|.68 90B30A0D   push    0D0AB390                         ;ASCII "CompareDWG"
0D094804|.FF15 FC930A0D call    dword ptr [<&mfc90u.#290>]       ;软件名称
0D09480A|.8945 B0       mov   dword ptr , eax
0D09480D|.C745 FC FFFFF>mov   dword ptr , -1
0D094814|.E8 97200000   call    0D0968B0                         ;关键call
0D094819|.83C4 14       add   esp, 14
0D09481C|.8845 AF       mov   byte ptr , al            ;假码首字符
0D09481F|.8A4D AF       mov   cl, byte ptr
0D094822|.884D F3       mov   byte ptr , cl
0D094825|.0FBE55 F3   movsx   edx, byte ptr
0D094829|.33C0          xor   eax, eax
0D09482B|.83FA 43       cmp   edx, 43                        ;不可以<=C,为老版本
0D09482E|.0F9DC0      setge   al
0D094831|.8945 EC       mov   dword ptr , eax
0D094834|.837D EC 00    cmp   dword ptr , 0
0D094838|.75 1D         jnz   short 0D094857
0D09483A|.0FBE4D F3   movsx   ecx, byte ptr
0D09483E|.83F9 41       cmp   ecx, 41
0D094841|.7C 14         jl      short 0D094857                   ;<A也可以的,但算法里并没有这个运算
0D094843|.8B55 D4       mov   edx, dword ptr
0D094846|.8B42 74       mov   eax, dword ptr
0D094849|.50            push    eax
0D09484A|.68 E8B20A0D   push    0D0AB2E8                         ;UNICODE "Old registration code %s.",LF,LF,"Please update your license at http://www.furix.com/renew"
0D09484F|.E8 CCFD0000   call    0D0A4620
0D094854|.83C4 08       add   esp, 8
0D094857|>8B4D EC       mov   ecx, dword ptr
0D09485A|.51            push    ecx
0D09485B|.6A 01         push    1
0D09485D|.8B4D D4       mov   ecx, dword ptr
0D094860|.E8 0D1A0100   call    <jmp.&mfc90u.#2904>
0D094865|.8BC8          mov   ecx, eax
0D094867|.E8 001A0100   call    <jmp.&mfc90u.#2360>
0D09486C|.8B4D F4       mov   ecx, dword ptr
0D09486F|.64:890D 00000>mov   dword ptr fs:, ecx
0D094876|.59            pop   ecx
0D094877|.8BE5          mov   esp, ebp
0D094879|.5D            pop   ebp
0D09487A\.C3            retn
一遍跟下来是返回不了这个call的,因为注册码不对灰色按钮是不会变的。
当然也可以用灰色按钮克星之类的。。。
初步判断关键call在0D094814|.E8 97200000   call    0D0968B0
注意一下,即使注册码正确下边还有一个注册码首字母的比较。如果是‘A’,‘B’,‘C’的话会提示是旧版本的注册码。
跟进关键call:
0D0968B0/$55            push    ebp
0D0968B1|.8BEC          mov   ebp, esp
0D0968B3|.6A FF         push    -1
0D0968B5|.68 3E790A0D   push    0D0A793E
0D0968BA|.64:A1 0000000>mov   eax, dword ptr fs:
0D0968C0|.50            push    eax
0D0968C1|.81EC 88000000 sub   esp, 88
0D0968C7|.A1 603B0B0D   mov   eax, dword ptr
0D0968CC|.33C5          xor   eax, ebp
0D0968CE|.50            push    eax
0D0968CF|.8D45 F4       lea   eax, dword ptr
0D0968D2|.64:A3 0000000>mov   dword ptr fs:, eax
0D0968D8|.C745 FC 04000>mov   dword ptr , 4
0D0968DF|.C645 F3 5A    mov   byte ptr , 5A             ;5a=Z
0D0968E3|.EB 08         jmp   short 0D0968ED
0D0968E5|>8A45 F3       /mov   al, byte ptr
0D0968E8|.2C 01         |sub   al, 1
0D0968EA|.8845 F3       |mov   byte ptr , al
0D0968ED|>0FBE4D F3      movsx   ecx, byte ptr
0D0968F1|.83F9 42       |cmp   ecx, 42                         ;42=B
0D0968F4|.0F8C 3F010000 |jl      0D096A39
0D0968FA|.8D4D EC       |lea   ecx, dword ptr
0D0968FD|.FF15 FC950A0D |call    dword ptr [<&mfc90u.#296>]      ;mfc90u.78A87587
0D096903|.C645 FC 05    |mov   byte ptr , 5
0D096907|.8B55 18       |mov   edx, dword ptr
0D09690A|.52            |push    edx
0D09690B|.0FBE45 F3   |movsx   eax, byte ptr          ;从Z开始递减
0D09690F|.83E8 40       |sub   eax, 40                         ;5A-40=1A=26
0D096912|.50            |push    eax
0D096913|.8B4D 08       |mov   ecx, dword ptr           ;软件名
0D096916|.51            |push    ecx
0D096917|.68 40C30A0D   |push    0D0AC340                        ;UNICODE "%s%d%s"
0D09691C|.8D55 EC       |lea   edx, dword ptr
0D09691F|.52            |push    edx
0D096920|.FF15 8C930A0D |call    dword ptr [<&mfc90u.#2537>]   ;UNICODE "CompareDWG+字母序号26"
0D096926|.83C4 14       |add   esp, 14
0D096929|.51            |push    ecx
0D09692A|.8BCC          |mov   ecx, esp
0D09692C|.8965 E8       |mov   dword ptr , esp
0D09692F|.6A 01         |push    1
0D096931|.0FB645 F3   |movzx   eax, byte ptr          ;从Z开始递减
0D096935|.50            |push    eax
0D096936|.FF15 64940A0D |call    dword ptr [<&mfc90u.#281>]      ;mfc90u.78BF3409
0D09693C|.8945 B8       |mov   dword ptr , eax
0D09693F|.8B4D B8       |mov   ecx, dword ptr
0D096942|.894D B4       |mov   dword ptr , ecx
0D096945|.C645 FC 06    |mov   byte ptr , 6
0D096949|.51            |push    ecx
0D09694A|.8BCC          |mov   ecx, esp
0D09694C|.8965 E4       |mov   dword ptr , esp
0D09694F|.8D55 14       |lea   edx, dword ptr          ;假码ucode
0D096952|.52            |push    edx
0D096953|.FF15 20960A0D |call    dword ptr [<&mfc90u.#280>]      ;mfc90u.78A348EB
0D096959|.8945 B0       |mov   dword ptr , eax
0D09695C|.8B45 B0       |mov   eax, dword ptr
0D09695F|.8945 AC       |mov   dword ptr , eax
0D096962|.C645 FC 07    |mov   byte ptr , 7
0D096966|.51            |push    ecx
0D096967|.8BCC          |mov   ecx, esp
0D096969|.8965 E0       |mov   dword ptr , esp
0D09696C|.8D55 10       |lea   edx, dword ptr          ;注册名ucode
0D09696F|.52            |push    edx
0D096970|.FF15 20960A0D |call    dword ptr [<&mfc90u.#280>]      ;mfc90u.78A348EB
0D096976|.8945 A8       |mov   dword ptr , eax
0D096979|.8B45 A8       |mov   eax, dword ptr
0D09697C|.8945 A4       |mov   dword ptr , eax
0D09697F|.C645 FC 08    |mov   byte ptr , 8
0D096983|.51            |push    ecx
0D096984|.8BCC          |mov   ecx, esp
0D096986|.8965 DC       |mov   dword ptr , esp
0D096989|.8D55 0C       |lea   edx, dword ptr
0D09698C|.52            |push    edx
0D09698D|.FF15 20960A0D |call    dword ptr [<&mfc90u.#280>]      ;注册类型
0D096993|.8945 A0       |mov   dword ptr , eax
0D096996|.8B45 A0       |mov   eax, dword ptr
0D096999|.8945 9C       |mov   dword ptr , eax
0D09699C|.C645 FC 09    |mov   byte ptr , 9
0D0969A0|.51            |push    ecx
0D0969A1|.8BCC          |mov   ecx, esp
0D0969A3|.8965 D8       |mov   dword ptr , esp
0D0969A6|.8D55 EC       |lea   edx, dword ptr
0D0969A9|.52            |push    edx
0D0969AA|.FF15 20960A0D |call    dword ptr [<&mfc90u.#280>]      ;UNICODE "CompareDWG+字母序号26"
0D0969B0|.8945 98       |mov   dword ptr , eax
0D0969B3|.C645 FC 05    |mov   byte ptr , 5
0D0969B7|.E8 E4010000   |call    0D096BA0                        ;算法call
0D0969BC|.83C4 14       |add   esp, 14
0D0969BF|.8945 94       |mov   dword ptr , eax         ;标志位
0D0969C2|.837D 94 00    |cmp   dword ptr , 0
0D0969C6|.74 5F         |je      short 0D096A27                  ;有一组成功则保存按钮可用,跳出循环
0D0969C8|.8A45 F3       |mov   al, byte ptr             ;否则,进行下一组的比较
0D0969CB|.8845 D7       |mov   byte ptr , al
这里是一个大循环。如果输入的注册码不正确的话会在这个call里打转。循环是从字母‘Z’一直循环到字母‘A’,共26次。
每次根据字母在字母表中的序号,生成不同的字符串,由此得到不同的真码,和输入的假码比较。也就是说你每个注册名对应26组正确的注册码。
但首字母为‘A’,‘B’,‘C’的即使正确也会认为是旧版注册码。
可知算法call,跟进:
0D096BA0/$55            push    ebp
0D096BA1|.8BEC          mov   ebp, esp
0D096BA3|.6A FF         push    -1
0D096BA5|.68 B1790A0D   push    0D0A79B1
0D096BAA|.64:A1 0000000>mov   eax, dword ptr fs:
0D096BB0|.50            push    eax
0D096BB1|.83EC 40       sub   esp, 40
0D096BB4|.A1 603B0B0D   mov   eax, dword ptr
0D096BB9|.33C5          xor   eax, ebp
0D096BBB|.50            push    eax
0D096BBC|.8D45 F4       lea   eax, dword ptr
0D096BBF|.64:A3 0000000>mov   dword ptr fs:, eax
0D096BC5|.C745 FC 04000>mov   dword ptr , 4
0D096BCC|.51            push    ecx
0D096BCD|.8BCC          mov   ecx, esp
0D096BCF|.8965 EC       mov   dword ptr , esp
0D096BD2|.8D45 18       lea   eax, dword ptr
0D096BD5|.50            push    eax
0D096BD6|.FF15 20960A0D call    dword ptr [<&mfc90u.#280>]       ;从Z开始递减的变量
0D096BDC|.8945 D0       mov   dword ptr , eax
0D096BDF|.8B4D D0       mov   ecx, dword ptr
0D096BE2|.894D CC       mov   dword ptr , ecx
0D096BE5|.C645 FC 05    mov   byte ptr , 5
0D096BE9|.51            push    ecx
0D096BEA|.8BCC          mov   ecx, esp
0D096BEC|.8965 E8       mov   dword ptr , esp
0D096BEF|.8D55 10       lea   edx, dword ptr           ;注册名
0D096BF2|.52            push    edx
0D096BF3|.FF15 20960A0D call    dword ptr [<&mfc90u.#280>]       ;mfc90u.78A348EB
0D096BF9|.8945 C8       mov   dword ptr , eax
0D096BFC|.8B45 C8       mov   eax, dword ptr
0D096BFF|.8945 C4       mov   dword ptr , eax
0D096C02|.C645 FC 06    mov   byte ptr , 6
0D096C06|.51            push    ecx
0D096C07|.8BCC          mov   ecx, esp
0D096C09|.8965 E4       mov   dword ptr , esp
0D096C0C|.8D55 0C       lea   edx, dword ptr
0D096C0F|.52            push    edx                              ;注册类型
0D096C10|.FF15 20960A0D call    dword ptr [<&mfc90u.#280>]       ;mfc90u.78A348EB
0D096C16|.8945 C0       mov   dword ptr , eax
0D096C19|.8B45 C0       mov   eax, dword ptr
0D096C1C|.8945 BC       mov   dword ptr , eax
0D096C1F|.C645 FC 07    mov   byte ptr , 7
0D096C23|.51            push    ecx
0D096C24|.8BCC          mov   ecx, esp
0D096C26|.8965 E0       mov   dword ptr , esp
0D096C29|.8D55 08       lea   edx, dword ptr
0D096C2C|.52            push    edx
0D096C2D|.FF15 20960A0D call    dword ptr [<&mfc90u.#280>]       ;UNICODE "CompareDWG字母序号"
0D096C33|.8945 B8       mov   dword ptr , eax          ;以上为传参过程
0D096C36|.8D45 DC       lea   eax, dword ptr
0D096C39|.50            push    eax
0D096C3A|.C645 FC 04    mov   byte ptr , 4
0D096C3E|.E8 FDF9FFFF   call    0D096640                         ;算法call
0D096C43|.83C4 14       add   esp, 14
0D096C46|.8945 B4       mov   dword ptr , eax
0D096C49|.8B4D B4       mov   ecx, dword ptr
0D096C4C|.894D D4       mov   dword ptr , ecx
0D096C4F|.C645 FC 08    mov   byte ptr , 8
0D096C53|.8B4D D4       mov   ecx, dword ptr
0D096C56|.FF15 18960A0D call    dword ptr [<&mfc90u.#909>]       ;真吗出现
0D096C5C|.50            push    eax
0D096C5D|.8D4D 14       lea   ecx, dword ptr
0D096C60|.FF15 78930A0D call    dword ptr [<&mfc90u.#1599>]      ;真假码比较call
0D096C66|.F7D8          neg   eax
0D096C68|.1BC0          sbb   eax, eax
0D096C6A|.83C0 01       add   eax, 1                           ;这里就是标志位的由来
0D096C6D|.0FB6D0      movzx   edx, al
0D096C70|.8955 F0       mov   dword ptr , edx
这部分只是传参,真正的算法在0D096C3E|.E8 FDF9FFFF   call    0D096640,跟进:
0D09669C|>8D4D 10       lea   ecx, dword ptr           ;注册类型
0D09669F|.51            push    ecx
0D0966A0|.8D55 0C       lea   edx, dword ptr          ;uNICODE "CompareDWG25"
0D0966A3|.52            push    edx
0D0966A4|.8D45 D0       lea   eax, dword ptr
0D0966A7|.50            push    eax
0D0966A8|.E8 33060000   call    0D096CE0                         ;字符串组合UNICODE "CompareDWG25Company license (unlimited)"
0D0966AD|.83C4 0C       add   esp, 0C
0D0966B0|.8945 C4       mov   dword ptr , eax
0D0966B3|.8B4D C4       mov   ecx, dword ptr
0D0966B6|.894D C0       mov   dword ptr , ecx
0D0966B9|.C645 FC 04    mov   byte ptr , 4
0D0966BD|.8D55 14       lea   edx, dword ptr
0D0966C0|.52            push    edx                              ;注册名
0D0966C1|.8B45 C0       mov   eax, dword ptr
0D0966C4|.50            push    eax                              ;组合字符串
0D0966C5|.8D4D EC       lea   ecx, dword ptr
0D0966C8|.51            push    ecx
0D0966C9|.E8 12060000   call    0D096CE0                         ;再次组合注册名
0D0966CE|.83C4 0C       add   esp, 0C
0D0966D1|.C645 FC 06    mov   byte ptr , 6
0D0966D5|.8D4D D0       lea   ecx, dword ptr
0D0966D8|.FF15 2C960A0D call    dword ptr [<&mfc90u.#600>]       ;mfc90u.78A8D3D2
0D0966DE|.8D4D EC       lea   ecx, dword ptr
0D0966E1|.FF15 5C940A0D call    dword ptr [<&mfc90u.#4494>]      ;转大写
0D0966E7|.68 D8970A0D   push    0D0A97D8
0D0966EC|.8D4D E8       lea   ecx, dword ptr
0D0966EF|.FF15 24960A0D call    dword ptr [<&mfc90u.#286>]       ;mfc90u.78A35B3B
0D0966F5|.C645 FC 07    mov   byte ptr , 7
0D0966F9|.C745 F0 00000>mov   dword ptr , 0
0D096700|.EB 09         jmp   short 0D09670B
0D096702|>8B55 F0       /mov   edx, dword ptr
0D096705|.83C2 01       |add   edx, 1
0D096708|.8955 F0       |mov   dword ptr , edx
0D09670B|>8D4D EC      lea   ecx, dword ptr
0D09670E|.FF15 14960A0D |call    dword ptr [<&mfc90u.#3185>]   ;取长度
0D096714|.3945 F0       |cmp   dword ptr , eax
0D096717|.7D 33         |jge   short 0D09674C                  ;非0
0D096719|.8B45 F0       |mov   eax, dword ptr
0D09671C|.50            |push    eax
0D09671D|.8D4D EC       |lea   ecx, dword ptr
0D096720|.FF15 94930A0D |call    dword ptr [<&mfc90u.#899>]      ;取字符
0D096726|.66:8945 DC    |mov   word ptr , ax
0D09672A|.0FB74D DC   |movzx   ecx, word ptr
0D09672E|.51            |push    ecx                           ; /w
0D09672F|.FF15 80910A0D |call    dword ptr [<&MSVCR90.iswalnum>] ; \iswalnum
0D096735|.83C4 04       |add   esp, 4                        ;字符检查
0D096738|.85C0          |test    eax, eax
0D09673A|.74 0E         |je      short 0D09674A
0D09673C|.0FB755 DC   |movzx   edx, word ptr
0D096740|.52            |push    edx
0D096741|.8D4D E8       |lea   ecx, dword ptr
0D096744|.FF15 90930A0D |call    dword ptr [<&mfc90u.#933>]      ;mfc90u.78A71137
0D09674A|>^ EB B6         \jmp   short 0D096702                  ;去非字母数字字符
0D09674C|>C745 E0 00000>mov   dword ptr , 0
0D096753|.C745 E4 00000>mov   dword ptr , 0
0D09675A|.C745 F0 00000>mov   dword ptr , 0
0D096761|.EB 09         jmp   short 0D09676C
0D096763|>8B45 F0       /mov   eax, dword ptr
0D096766|.83C0 01       |add   eax, 1
0D096769|.8945 F0       |mov   dword ptr , eax
0D09676C|>8D4D E8      lea   ecx, dword ptr
0D09676F|.FF15 14960A0D |call    dword ptr [<&mfc90u.#3185>]   ;长度
0D096775|.3945 F0       |cmp   dword ptr , eax
0D096778|.7D 74         |jge   short 0D0967EE                  ;非0
0D09677A|.8B4D F0       |mov   ecx, dword ptr          ;初始值为0
0D09677D|.51            |push    ecx
0D09677E|.8D4D E8       |lea   ecx, dword ptr
0D096781|.FF15 94930A0D |call    dword ptr [<&mfc90u.#899>]      ;取字符
0D096787|.66:8945 D8    |mov   word ptr , ax
0D09678B|.C745 D4 00000>|mov   dword ptr , 0
0D096792|.EB 09         |jmp   short 0D09679D
0D096794|>8B55 D4       |/mov   edx, dword ptr       ;计数器
0D096797|.83C2 01       ||add   edx, 1
0D09679A|.8955 D4       ||mov   dword ptr , edx
0D09679D|>837D D4 08    | cmp   dword ptr , 8
0D0967A1|.7D 46         ||jge   short 0D0967E9               ;做8次运算
0D0967A3|.0FB745 D8   ||movzx   eax, word ptr          ;字符ascii
0D0967A7|.8BC8          ||mov   ecx, eax
0D0967A9|.81E1 1F000080 ||and   ecx, 8000001F                  ;and 运算
0D0967AF|.79 05         ||jns   short 0D0967B6
0D0967B1|.49            ||dec   ecx
0D0967B2|.83C9 E0       ||or      ecx, FFFFFFE0
0D0967B5|.41            ||inc   ecx
0D0967B6|>8B55 E4       ||mov   edx, dword ptr       ;初始值为0
0D0967B9|.D3C2          ||rol   edx, cl                        ;循环左移cl位
0D0967BB|.8955 E4       ||mov   dword ptr , edx
0D0967BE|.8B45 E4       ||mov   eax, dword ptr       ;初始值为0
0D0967C1|.83E0 FE       ||and   eax, FFFFFFFE
0D0967C4|.8945 E4       ||mov   dword ptr , eax
0D0967C7|.0FB74D D8   ||movzx   ecx, word ptr          ;字符ascii
0D0967CB|.83E1 01       ||and   ecx, 1
0D0967CE|.0B4D E4       ||or      ecx, dword ptr
0D0967D1|.894D E4       ||mov   dword ptr , ecx
0D0967D4|.8B55 E0       ||mov   edx, dword ptr       ;初始值为0
0D0967D7|.3355 E4       ||xor   edx, dword ptr       ;XOR是关键
0D0967DA|.8955 E0       ||mov   dword ptr , edx
0D0967DD|.0FB745 D8   ||movzx   eax, word ptr
0D0967E1|.D1C8          ||ror   eax, 1
0D0967E3|.66:8945 D8    ||mov   word ptr , ax
0D0967E7|.^ EB AB         |\jmp   short 0D096794
0D0967E9|>^ E9 75FFFFFF   \jmp   0D096763
0D0967EE|>8B4D E0       mov   ecx, dword ptr           ;以上为关键算法
0D0967F1|.51            push    ecx
0D0967F2|.68 FCC20A0D   push    0D0AC2FC                         ;UNICODE "%08LX"
0D0967F7|.8D55 E8       lea   edx, dword ptr
0D0967FA|.52            push    edx
0D0967FB|.FF15 8C930A0D call    dword ptr [<&mfc90u.#2537>]      ;结果转字符串
0D096801|.83C4 0C       add   esp, 0C
0D096804|.8D45 18       lea   eax, dword ptr
0D096807|.50            push    eax
0D096808|.8D4D CC       lea   ecx, dword ptr
0D09680B|.FF15 20960A0D call    dword ptr [<&mfc90u.#280>]       ;mfc90u.78A348EB
0D096811|.8945 BC       mov   dword ptr , eax
0D096814|.8B4D BC       mov   ecx, dword ptr
0D096817|.894D B8       mov   dword ptr , ecx
0D09681A|.C645 FC 08    mov   byte ptr , 8
0D09681E|.8D55 E8       lea   edx, dword ptr
0D096821|.52            push    edx
0D096822|.8B45 B8       mov   eax, dword ptr
0D096825|.50            push    eax
0D096826|.8B4D 08       mov   ecx, dword ptr
0D096829|.51            push    ecx
0D09682A|.E8 B1040000   call    0D096CE0                         ;连接初始化的字符串
软件用软件名,字母序号,注册类型,注册名组成一个新字符串,剔除非数字和字母的符号,用ascii码做了一个很复杂的运算。
循环左右移和XOR得出一个结果,转字符串(8位)并和组成新字符串时候所用到的字符组合在一起,即为注册码。
举例:假设使用字母D,D在字母表中序号为4,注册名为zaas。则组合的新字符串为:
CompareDWG4Company license (unlimited)
变换后得到的十六进制数值为:B716D222
则注册码前面加上使用的字母D,为:DB716D222
一组可用的注册码:
注册名:zaas
注册码:PA98B0F06
注册类型:Company license (unlimited)具体字符串转换的循环左右移算法让人头晕。估计是自己没找到其数学模型。(数学不好,没办法)
写注册机正好试试内嵌汇编。对delphi的这个功能神往已久了。从VB转delphi很大程度上是因为这个。
实践证明:非常爽!
算法注册机代码如下:
procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      Name,Code,FstWord:string;
      RndNum,i,j:Integer;
      ONECHAR:word;
      REF,RESULT:integer;
    const
      Index:string='DDDDEFGHIJKLMNOPQRSTUVWXYZ';
      Company:string='CompareDWG';
      License:string='Companylicenseunlimited';
begin
      Randomize;
      RndNum:=Random(26);
      FstWord:=index ;
      name:=UpperCase(Company+inttostr(RndNum)+license+Trim(edit1.Text));
      REF:=0;    //   
      RESULT:=0;
      for i:=1 to length(name) do
          begin
            ONECHAR:=Ord(name);
            for j:=1 to 8do
                  begin
                      asm
                        movzx   eax, ONECHAR
                        mov   ecx, eax
                        and   ecx, $8000001F
                        jns   @JUMP
                        dec   ecx
                        or      ecx, $FFFFFFE0
                        inc   ecx
                        @JUMP:
                        mov   edx, REF
                        rol   edx, cl
                        mov   eax, edx
                        and   eax, $FFFFFFFE
                        movzx   ecx, ONECHAR
                        and   ecx, 1
                        or      ecx, eax
                        mov   REF, ecx
                        mov   edx, RESULT
                        xor   edx, ecx
                        mov   RESULT, edx
                        movzx   eax, ONECHAR
                        ror   eax, 1
                        mov   ONECHAR, ax
                      end;
                  end;
          end;
      code:=FstWord+IntToHex(RESULT,8)   ;
      edit2.Text:=code;
end;【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

wan 发表于 2010-9-6 22:40:34

好文,顺便学习下源码

GGLHY 发表于 2010-9-7 09:35:52

学习了!
顶下大Z!

月之精灵 发表于 2010-9-7 11:21:57

进来学习下,

CCC_Fish 发表于 2010-9-7 12:10:52

很精彩,学习

老万 发表于 2010-9-8 07:25:44

学习了,很精彩。

bzw4612537 发表于 2010-9-13 07:06:22

这个图形比较还是挺有用的,省的对照

VC8 发表于 2010-9-13 23:38:10

弱弱问下楼主,安装包何处可下?

zaas 发表于 2010-9-14 21:18:33

弱弱问下楼主,安装包何处可下?
VC8 发表于 2010-9-13 23:38 https://www.chinapyg.com/images/common/back.gif


    http://www.furix.com/download
页: [1]
查看完整版本: CompareDWG for AutoCAD 2006-2011算法分析及算法注册机