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;【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
好文,顺便学习下源码 学习了!
顶下大Z! 进来学习下, 很精彩,学习 学习了,很精彩。 这个图形比较还是挺有用的,省的对照 弱弱问下楼主,安装包何处可下? 弱弱问下楼主,安装包何处可下?
VC8 发表于 2010-9-13 23:38 https://www.chinapyg.com/images/common/back.gif
http://www.furix.com/download
页:
[1]