标 题:Access Animation破解的简要分析
发信人: ShenGe
时
间:2003/05/10 11:11am
详细信息:
软件大小: 1289 KB
软件语言: 英文
软件类别: 国外软件 / 共享版 / 动画制作
应用平台: Win9x/NT/2000/XP
界面预览: 无
加入时间: 2003-05-02 17:23:25
下载次数: 872
破解工具:TRW1.22 PWdasmV10.0
软件下载:http://count.skycn.com/softdown.php?id=11878&url=http://on165-http.skycn.net/down/aanim.zip软件简介:Access Animation 是一套专门为了制作 GIF 动画而产生的软件,里面内建了完整的绘图机能。甚至一般绘图软件所拥有的喷枪、绘图刷等绘图工具,也一应俱全。在软件中你可以指定动画的张数以及动画之间的延迟时间,以及图形透明化程度等参数,让你的动画 GIF 档案更能和你的网页结合。
作者声明:初学Crack,仅作学习交流,无其它目的。
BC编写,无壳,下中断BPX GETDLGITEMTEXTA,点OK键,程序被中断,按F12,再按F10,来到如下代码:
0167:00415D2D PUSH DWORD 0104 <---程序中断于此
0167:00415D32 LEA ECX,[EBP+FFFFFEE0]
0167:00415D38 PUSH ECX
0167:00415D39 PUSH BYTE +64
0167:00415D3B PUSH DWORD [EBP+08]
0167:00415D3E CALL `USER32!GetDlgItemTextA` <---取输入的注册码
0167:00415D43 LEA EAX,[EBP+FFFFFEE0] <---EAX=输入的注册码
0167:00415D49 PUSH EAX
0167:00415D4A CALL 00436F68 <---取注册码的位数
0167:00415D4F POP ECX
0167:00415D50 MOV EDI,EAX
0167:00415D52 CMP EDI,EBX <---判断有无输入注册码
0167:00415D54 JNG 00415DC2
0167:00415D56 MOV AL,[EBP+EBX+FFFFFEE0]
0167:00415D5D CMP AL,2D <---判断是否为“-”
0167:00415D5F JZ 00415D68
0167:00415D61 LEA EDX,[EDI-01]
0167:00415D64 CMP EBX,EDX
0167:00415D66 JNZ 00415DAE
0167:00415D68 LEA ECX,[EDI-01]
0167:00415D6B CMP EBX,ECX
0167:00415D6D JNZ 00415D7D
0167:00415D6F MOV AL,[EBP+EBX+FFFFFEE0]
0167:00415D76 MOV [EBP+ESI+FFFFFDDC],AL <---将每部分注册码移到EBP+ESI+FFFFFDDC的地址中
0167:00415D7D LEA EDX,[EBP+FFFFFDDC]
0167:00415D83 PUSH EDX
0167:00415D84 CALL 0043BD5C <---将注册码的10进制换为16进制值
0167:00415D89 POP ECX
0167:00415D8A MOV ECX,[EBP-04]
0167:00415D8D MOV [EBP+ECX*4-10],EAX <----转换的值存入[EBP+ECX*4-10]中,后面会用到
0167:00415D91 INC DWORD [EBP-04] 即后面的[EBP-10] [EBP-0C] [EBP-08]
0167:00415D94 PUSH DWORD 0104
0167:00415D99 PUSH BYTE +00
0167:00415D9B LEA EAX,[EBP+FFFFFDDC]
0167:00415DA1 PUSH EAX
0167:00415DA2 CALL 00436EA0
0167:00415DA7 ADD ESP,BYTE +0C
0167:00415DAA XOR ESI,ESI
0167:00415DAC JMP SHORT 00415DBD
0167:00415DAE MOV AL,[EBP+EBX+FFFFFEE0]
0167:00415DB5 MOV [EBP+ESI+FFFFFDDC],AL
0167:00415DBC INC ESI
0167:00415DBD INC EBX
0167:00415DBE CMP EDI,EBX
0167:00415DC0 JG 00415D56
0167:00415DC2 PUSH DWORD 00475E50 <---475E50为我们输入的用户名
0167:00415DC7 CALL 00436F68
0167:00415DCC POP ECX
0167:00415DCD MOV EDI,EAX
0167:00415DCF TEST EAX,EAX
0167:00415DD1 JNG 00415DED
0167:00415DD3 XOR EBX,EBX
0167:00415DD5 PUSH EBX
0167:00415DD6 PUSH DWORD 00475E50
0167:00415DDB CALL 00416034 <---计算注册码的关键Call,调用3次,跟进
0167:00415DE0 ADD ESP,BYTE +08
0167:00415DE3 MOV [EBP+EBX*4-1C],EAX
0167:00415DE7 INC EBX
0167:00415DE8 CMP EBX,BYTE +03
0167:00415DEB JL 00415DD5
0167:00415DED MOV EAX,[0046B12C] <---[0046B12C]为程序运行的次数
0167:00415DF2 CMP EAX,C8 <---此处为第一个关键判断,判断是否运行到200次
0167:00415DF7 JNZ 00415E78 <---跳到出错对话框,此处改为两个nop nop
0167:00415DF9 PUSH DWORD 00475F54
0167:00415DFE LEA EDX,[EBP+FFFFFEE0]
0167:00415E04 PUSH EDX
0167:00415E05 CALL `KERNEL32!lstrcmpA`
0167:00415E0A TEST EAX,EAX
0167:00415E0C JZ 00415E2C
0167:00415E0E MOV ECX,[EBP-10] <---取假码的第1部分
0167:00415E11 MOV EAX,[EBP-1C] <---取正确注册码的第1部分
0167:00415E14 CMP ECX,EAX <---关键比较2,比较注册码第1部分
0167:00415E16 JNZ 00415E78
0167:00415E18 MOV EDX,[EBP-0C] <---取假码的第若部分
0167:00415E1B MOV ECX,[EBP-18]
0167:00415E1E CMP EDX,ECX <---关键比较3,比较注册码第2部分
0167:00415E20 JNZ 00415E78
0167:00415E22 MOV EAX,[EBP-08] <---取假码的第3部分
0167:00415E25 MOV EDX,[EBP-14]
0167:00415E28 CMP EAX,EDX <---关键比较4,比较注册码第3部分
0167:00415E2A JNZ 00415E78
0167:00415E2C MOV DWORD [0043F09C],01
0167:00415E36 PUSH BYTE +01
0167:00415E38 CALL 004030E3
0167:00415E3D POP ECX
0167:00415E3E PUSH DWORD 0046B0FE
0167:00415E43 PUSH DWORD 004405D6
0167:00415E48 PUSH DWORD 0046A922
0167:00415E4D CALL `USER32!wsprintfA`
0167:00415E52 ADD ESP,BYTE +0C
0167:00415E55 PUSH BYTE +40
0167:00415E57 PUSH DWORD 0046B0FE
0167:00415E5C PUSH DWORD 0046A922
0167:00415E61 PUSH DWORD [EBP+08]
0167:00415E64 CALL `USER32!MessageBoxA` <---注册成功!
0167:00415E69 PUSH BYTE +00
0167:00415E6B PUSH DWORD [EBP+08]
0167:00415E6E CALL `USER32!EndDialog`
0167:00415E73 JMP 00415F0C
0167:00415E78 PUSH BYTE +40
0167:00415E7A PUSH DWORD 00440619
0167:00415E7F PUSH DWORD 004405F3
0167:00415E84 PUSH DWORD [EBP+08]
0167:00415E87 CALL `USER32!MessageBoxA` <---出错对话框!
0167:00415E8C PUSH BYTE +64
0167:00415E8E PUSH DWORD [EBP+08]
0167:00415E91 CALL `USER32!GetDlgItem`
0167:00415E96 PUSH EAX
0167:00415E97 CALL `USER32!SetFocus`
0167:00415E9C JMP SHORT 00415F0C
0167:00415E9E PUSH DWORD 0104
0167:00415EA3 PUSH DWORD 00475E50
0167:00415EA8 PUSH BYTE +65
0167:00415EAA PUSH DWORD [EBP+08]跟进上面的那个关键Call,来到如下代码:
0167:00416034 PUSH EBP
0167:00416035 MOV EBP,ESP
0167:00416037 PUSH ECX
0167:00416038 PUSH EBX
0167:00416039 PUSH ESI
0167:0041603A PUSH EDI
0167:0041603B MOV ESI,[EBP+0C]
0167:0041603E MOV EDI,[EBP+08] <---EDI中为用户名
0167:00416041 XOR EBX,EBX
0167:00416043 PUSH EDI
0167:00416044 CALL 00436F68 <---取用户名长度,返回值在EAX中
0167:00416049 POP ECX
0167:0041604A MOV [EBP-04],EAX
0167:0041604D MOV EAX,[EBP-04]
0167:00416050 CMP EAX,FF <---比较用户名长度是否大于255,
0167:00416055 JNG 0041605E 谁会用这么长的名字?!
0167:00416057 MOV DWORD [EBP-04],FF
0167:0041605E XOR ECX,ECX <---ECX=0,作用同指针
0167:00416060 MOV EDX,[EBP-04]
0167:00416063 CMP ECX,EDX
0167:00416065 JNL NEAR 00416527
0167:0041606B MOVSX EAX,BYTE [EDI+ECX] <---按位取用户名的每个字符值到EAX中
0167:0041606F ADD EAX,BYTE -20 <---EAX=EAX-20,小写字母转换成大写
0167:00416072 CMP EAX,BYTE +5A <---比较是否大于‘Z’
0167:00416075 JA NEAR 004164CF
0167:0041607B MOV AL,[EAX+00416088] <---用[EAX+00416088]的值查表给AL赋值自016F:0416088处的表值如下:
016F:416088:1C 00 00 00 00 00 00 00-00 00 00 00 00 00 1B 00
016F:416098:00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
016F:4160A8:00 1A 19 18 17 16 15 14-13 12 11 10 0F 0E 0D 0C
016F:4160B8:0B 0A 09 08 07 06 05 04 03 02 01 00 00 00 00 00
016F:4160C8:0A 1A 19 18 17 16 15 14-13 12 11 10 0F 0E 0D 0C
016F:4160D8:0B 0A 09 08 07 06 05 04 03 02 01 CF 04 41 00 090167:00416081 JMP NEAR [EAX*4+004160E3] <---根据[EAX*4+004160E3]的值查表决定程序跳转位置
自004160E3处的表值如下:
016F:004160E3:CF 64 41 00 09 64 41 00-44 64 41 00 25 64 41 00
016F:004160E3:7E 64 41 00 E7 63 41 00-C8 63 41 00 A6 63 41 00
016F:004160E3:87 63 41 00 65 63 41 00-63 64 41 00 46 63 41 00
016F:004160E3:27 63 41 00 05 63 41 00-E3 62 41 00 C1 62 41 00
016F:004160E3:F9 62 41 00 80 62 41 00-5E 62 41 00 3C 62 41 00
016F:004160E3:1A 62 41 00 F8 61 41 00-D9 61 41 00 BA 61 41 00
016F:004160E3:98 61 41 00 76 61 41 00-57 61 41 00 99 64 41 00
0167:00416088 SBB AL,00
0167:0041608A ADD [EAX],AL
0167:0041608C ADD [EAX],AL
0167:0041608E ADD [EAX],AL
0167:00416090 ADD [EAX],AL
0167:00416092 ADD [EAX],AL
0167:00416094 ADD [EAX],AL
0167:00416096 SBB EAX,[EAX]
0167:00416098 ADD [EAX],AL
0167:0041609A ADD [EAX],AL
0167:0041609C ADD [EAX],AL
0167:0041609E ADD [EAX],AL
0167:004160A0 ADD [EAX],AL
0167:004160A2 ADD [EAX],AL
0167:004160A4 ADD [EAX],AL
0167:004160A6 ADD [EAX],AL
0167:004160A8 ADD [EDX],BL
0167:004160AA SBB [EAX],EBX
0167:004160AC POP SS
0167:004160AD PUSH SS
0167:004160AE ADC EAX,11121314
0167:004160B3 ADC [EDI],CL
0167:004160B5 PUSH CS
0167:004160B6 OR EAX,090A0B0C
0167:004160BB OR [EDI],AL
0167:004160BD PUSH ES
0167:004160BE ADD EAX,01020304
0167:004160C3 ADD [EAX],AL
0167:004160C5 ADD [EAX],AL
0167:004160C7 ADD [EAX],AL
0167:004160C9 SBB BL,[ECX]
0167:004160CB SBB [EDI],DL
0167:004160CD PUSH SS
0167:004160CE ADC EAX,11121314
0167:004160D3 ADC [EDI],CL
0167:004160D5 PUSH CS
0167:004160D6 OR EAX,090A0B0C
0167:004160DB OR [EDI],AL
0167:004160DD PUSH ES
0167:004160DE ADD EAX,01020304
0167:004160E3 IRET
0167:004160E4 INC ECX
0167:004160E6 ADD [ECX],CL
0167:004160E8 INC ECX
0167:004160EA ADD [ESP+41],AL
0167:004160EE ADD [7E004164],AH
0167:004160F4 INC ECX
0167:004160F6 ADD BH,AH
0167:004160F8 ARPL [ECX+00],AX
0167:004160FB ENTER 4163,00
0167:004160FF CMPSB
0167:00416100 ARPL [ECX+00],AX
0167:00416103 XCHG ESP,[EBX+41]
0167:00416106 ADD [EBP+63],AH
0167:00416109 INC ECX
0167:0041610A ADD [EBX+64],AH
0167:0041610D INC ECX
0167:0041610E ADD [ESI+63],AL
0167:00416111 INC ECX
0167:00416112 ADD [EDI],AH
0167:00416114 ARPL [ECX+00],AX
0167:00416117 ADD EAX,E3004163
0167:0041611C BOUND EAX,[ECX+00]
0167:0041611F SHL DWORD [EDX+41],00
0167:00416123 LAHF
0167:00416124 BOUND EAX,[ECX+00]
0167:00416127 AND BYTE [EDX+41],00
0167:0041612B POP ESI
0167:0041612C BOUND EAX,[ECX+00]
0167:0041612F CMP AL,62
0167:00416131 INC ECX
0167:00416132 ADD [EDX],BL
0167:00416134 BOUND EAX,[ECX+00]
0167:00416137 CLC
0167:00416138 POPA
0167:00416139 INC ECX
0167:0041613A ADD CL,BL
0167:0041613C POPA
0167:0041613D INC ECX
0167:0041613E ADD [EDX+98004161],BH
0167:00416144 POPA
0167:00416145 INC ECX
0167:00416146 ADD [ESI+61],DH
0167:00416149 INC ECX
0167:0041614A ADD [EDI+61],DL
0167:0041614D INC ECX
0167:0041614E ADD [ECX+B4004164],BL
0167:00416154 INC ECX
0167:00416156 ADD [EBX+BE0F7FC3],AL
0167:0041615C ADC AL,0F
0167:0041615E TEST BYTE [EDX+00444089],08
0167:00416165 JZ NEAR 004164E0
0167:0041616B ADD EBX,FD
0167:00416171 JMP 004164E0
0167:00416176 ADD EBX,02D3 <---EBX=EBX+02D3 ------------|
0167:0041617C MOVSX EAX,BYTE [EDI+ECX] <---按位取用户名的每个字符 |
0167:00416180 TEST BYTE [EAX+00444089],08<---根据[EAX+00444089]的值查表 |
0167:00416187 JZ NEAR 004164E0 得到相应值与08H进行判断 |
0167:0041618D ADD EBX,86 <---EBX=EBX+86 |
0167:00416193 JMP 004164E0 <------------------------------|
0167:00416198 ADD EBX,0929 <---以下同上,懒得写了|
0167:0041619E MOVSX EDX,BYTE [EDI+ECX] |
0167:004161A2 TEST BYTE [EDX+00444089],08 |
0167:004161A9 JZ NEAR 004164E0 |
0167:004161AF ADD EBX,01D9 |
0167:004161B5 JMP 004164E0 |
0167:004161BA ADD EBX,030D |
0167:004161C0 MOVSX EAX,BYTE [EDI+ECX] |
0167:004161C4 TEST BYTE [EAX+00444089],08 |
0167:004161CB JZ NEAR 004164E0 |
0167:004161D1 ADD EBX,BYTE +47 |
0167:004161D4 JMP 004164E0 |
0167:004161D9 ADD EBX,BYTE +02 |
0167:004161DC MOVSX EDX,BYTE [EDI+ECX] |
0167:004161E0 TEST BYTE [EDX+00444089],08 |
0167:004161E7 JZ NEAR 004164E0 |
0167:004161ED ADD EBX,1E61 |
0167:004161F3 JMP 004164E0 |
0167:004161F8 ADD EBX,01C8 |
0167:004161FE MOVSX EAX,BYTE [EDI+ECX] |
0167:00416202 TEST BYTE [EAX+00444089],08 |
0167:00416209 JZ NEAR 004164E0 |
0167:0041620F ADD EBX,022B |
0167:00416215 JMP 004164E0 |
0167:0041621A ADD EBX,0114 |
0167:00416220 MOVSX EDX,BYTE [EDI+ECX] |
0167:00416224 TEST BYTE [EDX+00444089],08 |
0167:0041622B JZ NEAR 004164E0 |
0167:00416231 ADD EBX,0378 |
0167:00416237 JMP 004164E0 |
0167:0041623C ADD EBX,015A |
0167:00416242 MOVSX EAX,BYTE [EDI+ECX] |
0167:00416246 TEST BYTE [EAX+00444089],08 |
0167:0041624D JZ NEAR 004164E0 |
0167:00416253 ADD EBX,0235 |
0167:00416259 JMP 004164E0 |
0167:0041625E ADD EBX,F6 |
0167:00416264 MOVSX EDX,BYTE [EDI+ECX] |
0167:00416268 TEST BYTE [EDX+00444089],08 |
0167:0041626F JZ NEAR 004164E0 |
0167:00416275 ADD EBX,03F2 |
0167:0041627B JMP 004164E0 |
0167:00416280 ADD EBX,1EB1 |
0167:00416286 MOVSX EAX,BYTE [EDI+ECX] |
0167:0041628A TEST BYTE [EAX+00444089],08 |
0167:00416291 JZ NEAR 004164E0 |
0167:00416297 ADD EBX,BYTE +6E |
0167:0041629A JMP 004164E0 |
0167:0041629F ADD EBX,0278 |
0167:004162A5 MOVSX EDX,BYTE [EDI+ECX] |
0167:004162A9 TEST BYTE [EDX+00444089],08 |
0167:004162B0 JZ NEAR 004164E0 |
0167:004162B6 ADD EBX,173A |
0167:004162BC JMP 004164E0 |
0167:004162C1 ADD EBX,017F |
0167:004162C7 MOVSX EAX,BYTE [EDI+ECX] |
0167:004162CB TEST BYTE [EAX+00444089],08 |
0167:004162D2 JZ NEAR 004164E0 |
0167:004162D8 ADD EBX,04FE |
0167:004162DE JMP 004164E0 |
0167:004162E3 ADD EBX,115D |
0167:004162E9 MOVSX EDX,BYTE [EDI+ECX] |
0167:004162ED TEST BYTE [EDX+00444089],08 |
0167:004162F4 JZ NEAR 004164E0 |
0167:004162FA ADD EBX,0338 |
0167:00416300 JMP 004164E0 |
0167:00416305 ADD EBX,2382 |
0167:0041630B MOVSX EAX,BYTE [EDI+ECX] |
0167:0041630F TEST BYTE [EAX+00444089],08 |
0167:00416316 JZ NEAR 004164E0 |
0167:0041631C ADD EBX,0DED |
0167:00416322 JMP 004164E0 |
0167:00416327 ADD EBX,0315 |
0167:0041632D MOVSX EDX,BYTE [EDI+ECX] |
0167:00416331 TEST BYTE [EDX+00444089],08 |
0167:00416338 JZ NEAR 004164E0 |
0167:0041633E ADD EBX,BYTE +1B |
0167:00416341 JMP 004164E0 |
0167:00416346 ADD EBX,BYTE +17 |
0167:00416349 MOVSX EAX,BYTE [EDI+ECX] |
0167:0041634D TEST BYTE [EAX+00444089],08 |
0167:00416354 JZ NEAR 004164E0 |
0167:0041635A ADD EBX,129C |
0167:00416360 JMP 004164E0 |
0167:00416365 ADD EBX,04DD |
0167:0041636B MOVSX EDX,BYTE [EDI+ECX] |
0167:0041636F TEST BYTE [EDX+00444089],08 |
0167:00416376 JZ NEAR 004164E0 |
0167:0041637C ADD EBX,0137 |
0167:00416382 JMP 004164E0 |
0167:00416387 ADD EBX,02D4 |
0167:0041638D MOVSX EAX,BYTE [EDI+ECX] |
0167:00416391 TEST BYTE [EAX+00444089],08 |
0167:00416398 JZ NEAR 004164E0 |
0167:0041639E ADD EBX,BYTE +04 |
0167:004163A1 JMP 004164E0 |
0167:004163A6 ADD EBX,0340 |
0167:004163AC MOVSX EDX,BYTE [EDI+ECX] |
0167:004163B0 TEST BYTE [EDX+00444089],08 |
0167:004163B7 JZ NEAR 004164E0 |
0167:004163BD ADD EBX,06DF |
0167:004163C3 JMP 004164E0 |
0167:004163C8 ADD EBX,BYTE +12 |
0167:004163CB MOVSX EAX,BYTE [EDI+ECX] |
0167:004163CF TEST BYTE [EAX+00444089],08 |
0167:004163D6 JZ NEAR 004164E0 |
0167:004163DC ADD EBX,05BE |
0167:004163E2 JMP 004164E0 |
0167:004163E7 ADD EBX,16DA |
0167:004163ED MOVSX EDX,BYTE [EDI+ECX] |
0167:004163F1 TEST BYTE [EDX+00444089],08 |
0167:004163F8 JZ NEAR 004164E0 |
0167:004163FE ADD EBX,01BE |
0167:00416404 JMP 004164E0 |
0167:00416409 ADD EBX,BYTE +22 |
0167:0041640C MOVSX EAX,BYTE [EDI+ECX] |
0167:00416410 TEST BYTE [EAX+00444089],08 |
0167:00416417 JZ NEAR 004164E0 |
0167:0041641D ADD EBX,BYTE +16 |
0167:00416420 JMP 004164E0 |
0167:00416425 ADD EBX,BYTE +44 |
0167:00416428 MOVSX EDX,BYTE [EDI+ECX] |
0167:0041642C TEST BYTE [EDX+00444089],08 |
0167:00416433 JZ NEAR 004164E0 |
0167:00416439 ADD EBX,026A |
0167:0041643F JMP 004164E0 |
0167:00416444 ADD EBX,029A |
0167:0041644A MOVSX EAX,BYTE [EDI+ECX] |
0167:0041644E TEST BYTE [EAX+00444089],08 |
0167:00416455 JZ NEAR 004164E0 |
0167:0041645B ADD EBX,3039 |
0167:00416461 JMP SHORT 004164E0 |
0167:00416463 ADD EBX,0185 |
0167:00416469 MOVSX EDX,BYTE [EDI+ECX] |
0167:0041646D TEST BYTE [EDX+00444089],08 |
0167:00416474 JZ 004164E0 |
0167:00416476 ADD EBX,1272 |
0167:0041647C JMP SHORT 004164E0 |
0167:0041647E ADD EBX,0271 |
0167:00416484 MOVSX EAX,BYTE [EDI+ECX] |
0167:00416488 TEST BYTE [EAX+00444089],08 |
0167:0041648F JZ 004164E0 |
0167:00416491 ADD EBX,BA |
0167:00416497 JMP SHORT 004164E0 |
0167:00416499 ADD EBX,014D |
0167:0041649F MOVSX EDX,BYTE [EDI+ECX] |
0167:004164A3 TEST BYTE [EDX+00444089],08 |
0167:004164AA JZ 004164E0 |
0167:004164AC ADD EBX,0285 |
0167:004164B2 JMP SHORT 004164E0 |
0167:004164B4 ADD EBX,2342 |
0167:004164BA MOVSX EAX,BYTE [EDI+ECX] |
0167:004164BE TEST BYTE [EAX+00444089],08 |
0167:004164C5 JZ 004164E0 |
0167:004164C7 ADD EBX,B0 |
0167:004164CD JMP SHORT 004164E0 |
0167:004164CF INC EBX |
0167:004164D0 MOVSX EDX,BYTE [EDI+ECX] |
0167:004164D4 TEST BYTE [EDX+00444089],08 |
0167:004164DB JZ 004164E0 |
0167:004164DD ADD EBX,BYTE +03 ----------------------|
0167:004164E0 TEST ESI,ESI <---判断计算注册码的第几部分,
0167:004164E2 JNZ 004164F5 从而转向不同的运算,见后
0167:004164E4 MOV EAX,EBX
0167:004164E6 PUSH ECX
0167:004164E7 MOV ECX,03 <---ECX=3
0167:004164EC XOR EDX,EDX
0167:004164EE DIV ECX <---EAX=EAX/ECX
0167:004164F0 POP ECX <---恢复ECX值
0167:004164F1 ADD EBX,EAX <---EBX=EBX+EAX
0167:004164F3 JMP SHORT 0041651B
0167:004164F5 CMP ESI,BYTE +01 <---计算注册码第2部分会走到这里|
0167:004164F8 JNZ 00416502 |
0167:004164FA MOV EAX,EBX |
0167:004164FC SHR EAX,1 |
0167:004164FE ADD EBX,EAX |
0167:00416500 JMP SHORT 0041651B <------------------------------|
0167:00416502 CMP ESI,BYTE +02 <---计算注册码第3部分会走到这里|
0167:00416505 JNZ 0041651B |
0167:00416507 MOVSX EDX,BYTE [EDI+01] |
0167:0041650B TEST BYTE [EDX+00444089],08 |
0167:00416512 JZ 0041651B |
0167:00416514 MOV EAX,EBX |
0167:00416516 SHR EAX,02 |
0167:00416519 ADD EBX,EAX <------------------------------|
0167:0041651B INC ECX <---ECX加1
0167:0041651C MOV EDX,[EBP-04]
0167:0041651F CMP ECX,EDX <---比较是否取完用户名
0167:00416521 JL NEAR 0041606B
0167:00416527 MOV EAX,EBX <---取运算后的最终值存入EAX中,
0167:00416529 POP EDI 即正确注册码的16进制值
0167:0041652A POP ESI
0167:0041652B POP EBX
0167:0041652C POP ECX
0167:0041652D POP EBP
0167:0041652E RET
唉!写到这头都晕了,还是没能把这个软件详细分析出来,正如前面所看到的0167:00415DF2处的判断是判断程序运行的次数,很显然是小于200次,所以在这个地方肯定会跳,也即无法注册。猜想可能在此之前已进行了注册验证,但我功力有限,跟了几次还是一样,实在不想跟了,还请高手跟一下看看!不过根据作者的说明好像这是个演示版,因为还有功能限制,我不确定作者是否将这部分功能做在程序中。
程序中运用查表法对用户名进行有关运算后得到注册码的值,我实在不知该如何描述,各位自己看看吧!呵呵头都晕了,如果看不明白是我写得不好,请见谅!
我把0167:00415DF7处改为两个nop,然后填入用户名:ShenGe和注册码:73348-109543-59405,注册成功!
嘿嘿!别高兴得太早,等到你运行到151次时你就会看到那个讨厌的对话框出来了,不能运行程序了。前面已经讲过,[0046B12C]中存放的为程序运行的次数,下BPM 46B12C,重新运行程序,你会很快发现如下代码:
* Possible Reference to Dialog: IDD_MATRIX_EDIT, CONTROL_ID:0096, ""
|
:00401121 3D96000000 cmp eax, 00000096 <---判断是否运行超过了150次
:00401126 7628 jbe 00401150 <---改为jmp 00401150
:00401128 8B152CB14600 mov edx, dword ptr [0046B12C]
:0040112E 81FAC8000000 cmp edx, 000000C8 <---判断是否运行超过了200次
:00401134 731A jnb 00401150 <---上面改过了此处就不用改了
:00401136 6A40 push 00000040
:00401138 68FEB04600 push 0046B0FE* Possible StringData Ref from Data Obj ->"Thank you for using Access Image "
->"software.
You were already accessed "
->"this software more then 150 times.
If "
->"you want to continue using this "
->"software you must
buy it for $18 "
->"US only."
|
:0040113D 68B4F54300 push 0043F5B4
:00401142 6A00 push 00000000* Reference To: USER32.MessageBoxA, Ord:0000h
|
:00401144 E82BD50300 Call 0043E674
:00401149 33C0 xor eax, eax
:0040114B E967020000 jmp 004013B7
将上面的:00401126 7628 jbe 00401150改为EB28,再运行一下,OK!又可以用了!但是还有那该死的对话框,我实在不想再跟了,各位有兴趣的话试试看吧!等等,这不是爆破吗?前面那么多岂不是白写了吗?到头来还是爆破,唉,不干了!睡觉去了!
最后还是爆破了,但还有功能限制,高手不妨试试看!本不想贴出来,但老外的算法还是比较有意思,各位如果有兴趣不妨研究一下。水平太低,失误之处还请各位老大指点!----------------------------------------ShenGe---------------------------------- 爆破点:
1.改0167:00401126 JBE 00401150为JMP 00401150
2.改0167:00415DF7 JNZ 00415E78为NOP NOP
3.改0167:00415E16 JNZ 00415E78为JZ 00415E78
4.改0167:00415E20 JNZ 00415E78为JZ 00415E78
5.改0167:00415E2A JNZ 00415E78为JZ 00415E78