老文章档案 · 2003 年

Gif2swf V2.1版 算法分析

赢政天下 [WINZHENG.COM] · 网络学院 · 2003-06-25 · 作者:ShenGe 人气: · 出处:嬴政天下整理收藏)

破解软件:Gif2swf V2.1版

下载网址:gz2.onlinedown.net

破解难度:易

破解工具:TRW1.22,PWdasm黄金版

软件说明:GIF2SWF是一个可以把gif文件转换Flash的swf文件的小工具,包括有WINDOWS及DOS模式两种版本,可以轻易转换大量的图形文件。

同以往一样,运行程序,任意填入用户名:ShenGe和注册码:12345678,下BPX HMEMCPY,点注册,?#@$%^!没反应,断不下来,厉害!再试GETDLGITEMTEXTA,GETWINDOWTEXTA,还是断不下来,见鬼!用PWdasm反汇编看看,幸运的是它没加壳,查找字串发现有"Congratulations",它由404197和4079D4及407A10这3处有关键跳转

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:004079D4(C)

|

:004079DF 83FF01 cmp edi, 00000001

:004079E2 5F pop edi

:004079E3 0F85A5000000 jne 00407A8E

:004079E9 E842BDFFFF call 00403730

:004079EE 85C0 test eax, eax

:004079F0 0F8485000000 je 00407A7B

:004079F6 6A00 push 00000000

:004079F8 8BCB mov ecx, ebx

:004079FA C7056CC5410001000000 mov dword ptr [0041C56C], 00000001

* Reference To: MFC42.Ordinal:0A55, Ord:0A55h

|

:00407A04 E8A17A0000 Call 0040F4AA

:00407A09 A168C54100 mov eax, dword ptr [0041C568]

:00407A0E 85C0 test eax, eax

:00407A10 743A je 00407A4C <---关键跳转!

:00407A12 A1E03A4100 mov eax, dword ptr [00413AE0]

:00407A17 6A00 push 00000000

:00407A19 6A00 push 00000000

:00407A1B 6810010000 push 00000110

:00407A20 50 push eax

* Reference To: USER32.SendMessageA, Ord:0214h

|

:00407A21 FF1500044100 Call dword ptr [00410400]

:00407A27 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"Congratulations"

|

:00407A29 6800374100 push 00413700

* Possible StringData Ref from Data Obj ->"GIF2SWF has been successfuly registered "

->"!"

|

:00407A2E 68D4364100 push 004136D4

:00407A33 6A00 push 00000000

我们再在TRW中下BPX 407A10,运行,@!#$%!~,还是没断下来,再仔细看看,发现在0167:407A10上面的4079F0处和4079E3处也有跳转,管它的,先试试!下BPX 4079E9,Good Luck!断下来了!小样儿,看我怎么治你!

......

0167:004079BF PUSH EDI

0167:004079C0 MOV ECX,ESI

0167:004079C2 MOV DWORD [ESP+18],FFFFFFFF

0167:004079CA CALL NEAR [EAX+C0]

0167:004079D0 TEST ESI,ESI

0167:004079D2 MOV EDI,EAX

0167:004079D4 JZ 004079DF

0167:004079D6 MOV EDX,[ESI]

0167:004079D8 PUSH BYTE +01

0167:004079DA MOV ECX,ESI

0167:004079DC CALL NEAR [EDX+04]

0167:004079DF CMP EDI,BYTE +01

0167:004079E2 POP EDI

0167:004079E3 JNZ NEAR 00407A8E

0167:004079E9 CALL 00403730 <---我们在此下断,关键的Call,跟进

0167:004079EE TEST EAX,EAX

0167:004079F0 JZ NEAR 00407A7B

0167:004079F6 PUSH BYTE +00

0167:004079F8 MOV ECX,EBX

0167:004079FA MOV DWORD [0041C56C],01

0167:00407A04 CALL MFC42!ord_00000A55

0167:00407A09 MOV EAX,[0041C568]

0167:00407A0E TEST EAX,EAX

0167:00407A10 JZ 00407A4C

0167:00407A12 MOV EAX,[00413AE0]

0167:00407A17 PUSH BYTE +00

0167:00407A19 PUSH BYTE +00

0167:00407A1B PUSH DWORD 0110

0167:00407A20 PUSH EAX

0167:00407A21 CALL USER32!SendMessageA

0167:00407A27 PUSH BYTE +40

0167:00407A29 PUSH DWORD 00413700

0167:00407A2E PUSH DWORD 004136D4

0167:00407A33 PUSH BYTE +00

0167:00407A35 CALL USER32!MessageBoxA <---OK!注册成功!

0167:00407A3B POP ESI

0167:00407A3C POP EBX

0167:00407A3D MOV ECX,[ESP+04]

0167:00407A41 MOV [FS:00],ECX

0167:00407A48 ADD ESP,BYTE +10

0167:00407A4B RET

0167:00407A4C PUSH BYTE +40

0167:00407A4E PUSH DWORD 00413700

0167:00407A53 PUSH DWORD 004136D4

0167:00407A58 PUSH BYTE +00

0167:00407A5A CALL USER32!MessageBoxA

0167:00407A60 PUSH BYTE +00

0167:00407A62 CALL 00403250

0167:00407A67 ADD ESP,BYTE +04

0167:00407A6A POP ESI

0167:00407A6B POP EBX

0167:00407A6C MOV ECX,[ESP+04]

0167:00407A70 MOV [FS:00],ECX

0167:00407A77 ADD ESP,BYTE +10

0167:00407A7A RET

0167:00407A7B PUSH BYTE +30

0167:00407A7D PUSH DWORD 004136C4

0167:00407A82 PUSH DWORD 00413678

0167:00407A87 MOV ECX,EBX

0167:00407A89 CALL MFC42!ord_00001080 <---Bad boy!注册出错!

0167:00407A8E MOV ECX,[ESP+0C]

0167:00407A92 POP ESI

0167:00407A93 POP EBX

0167:00407A94 MOV [FS:00],ECX

0167:00407A9B ADD ESP,BYTE +10

0167:00407A9E RET

跟进上面的那个关键Call,我们看到如下代码:

0167:00403730 PUSH BYTE -01

0167:00403732 PUSH DWORD 0040F9F8

0167:00403737 MOV EAX,[FS:00]

0167:0040373D PUSH EAX

0167:0040373E MOV [FS:00],ESP

0167:00403745 SUB ESP,BYTE +08

0167:00403748 PUSH ECX

0167:00403749 MOV ECX,ESP

0167:0040374B MOV [ESP+04],ESP

0167:0040374F PUSH DWORD 00413AD8

0167:00403754 CALL MFC42!ord_00000217

0167:00403759 PUSH ECX

0167:0040375A MOV DWORD [ESP+18],00

0167:00403762 MOV ECX,ESP

0167:00403764 MOV [ESP+0C],ESP

0167:00403768 PUSH DWORD 00413ADC

0167:0040376D CALL MFC42!ord_00000217

0167:00403772 MOV DWORD [ESP+18],FFFFFFFF

0167:0040377A CALL 004035B0 <---关键的Call,跟进

0167:0040377F ADD ESP,BYTE +08

0167:00403782 TEST EAX,EAX

0167:00403784 JNZ 004037CA <---关键跳转!

0167:00403786 MOV ECX,00413ADC

0167:0040378B CALL MFC42!ord_0000104B

0167:00403790 PUSH EAX

0167:00403791 PUSH DWORD 0041356C

0167:00403796 CALL 00403490

0167:0040379B ADD ESP,BYTE +08

0167:0040379E MOV ECX,00413AD8

0167:004037A3 CALL MFC42!ord_0000104B

0167:004037A8 PUSH EAX

0167:004037A9 PUSH DWORD 00413558

0167:004037AE CALL 00403490

0167:004037B3 ADD ESP,BYTE +08

0167:004037B6 MOV EAX,01 <---EAX=1,走到这可以收工了!

0167:004037BB MOV ECX,[ESP+08]

0167:004037BF MOV [FS:00],ECX

0167:004037C6 ADD ESP,BYTE +14

0167:004037C9 RET

0167:004037CA MOV ECX,[ESP+08]

0167:004037CE XOR EAX,EAX <---EAX=0,走到这就完了

0167:004037D0 MOV [FS:00],ECX

0167:004037D7 ADD ESP,BYTE +14

0167:004037DA RET

跟进上面的Call,来到如下代码:

0167:004035B0 PUSH BYTE -01

0167:004035B2 PUSH DWORD 0040F9E0

0167:004035B7 MOV EAX,[FS:00]

0167:004035BD PUSH EAX

0167:004035BE MOV [FS:00],ESP

0167:004035C5 SUB ESP,BYTE +68

0167:004035C8 PUSH EBX

0167:004035C9 PUSH ESI

0167:004035CA PUSH EDI

0167:004035CB LEA ECX,[ESP+84] <---[ECX]中为我们输入的用户名

0167:004035D2 MOV DWORD [ESP+7C],01

0167:004035DA CALL MFC42!ord_0000106C <---此Call将输入的用户名转换成大写字符

0167:004035DF LEA ECX,[ESP+84]

0167:004035E6 CALL MFC42!ord_0000104B <---取转换后的用户名

0167:004035EB LEA ECX,[ESP+88]

0167:004035F2 MOV ESI,EAX

0167:004035F4 CALL MFC42!ord_0000104B <---取输入的注册码

0167:004035F9 MOV EBX,EAX

0167:004035FB MOV EDI,ESI

0167:004035FD OR ECX,BYTE -01

0167:00403600 XOR EAX,EAX

0167:00403602 REPNE SCASB

0167:00403604 NOT ECX

0167:00403606 DEC ECX

0167:00403607 MOV [ESP+0C],EBX

0167:0040360B JZ NEAR 004036ED

0167:00403611 MOV EDI,EBX

0167:00403613 OR ECX,BYTE -01

0167:00403616 REPNE SCASB

0167:00403618 NOT ECX

0167:0040361A DEC ECX

0167:0040361B JZ NEAR 004036ED

0167:00403621 PUSH EBP

0167:00403622 MOV EDI,ESI

0167:00403624 OR ECX,BYTE -01

0167:00403627 XOR EBP,EBP

0167:00403629 REPNE SCASB

0167:0040362B NOT ECX

0167:0040362D DEC ECX

0167:0040362E CMP ECX,BYTE +20 <---比较用户名位数是否大于32,谁会用这么长的用户名!

0167:00403631 JNG 00403638

0167:00403633 MOV ECX,20

0167:00403638 XOR ESI,ESI <---ESI=0

0167:0040363A TEST ECX,ECX

0167:0040363C JNG 00403666

0167:0040363E MOV EAX,[ESP+88] <---取转换后的用户名到EAX中

0167:00403645 MOV BL,[ESI+EAX] <---按位取用户名的单个字符值到BL中

0167:00403648 MOV EAX,00163EF7 <---置EAX值为163EF7H

0167:0040364D MOVSX EDI,BL

0167:00403650 CDQ

0167:00403651 IDIV EDI

0167:00403653 MOVSX EDX,BL

0167:00403656 ADD EAX,ESI <---商与位数相加,注意第1位为0

0167:00403658 IMUL EAX,EDX <---再与字符值相乘

0167:0040365B ADD EBP,EAX <---结果累加到ESP中

0167:0040365D INC ESI

0167:0040365E CMP ESI,ECX <---是否取完所有字符

0167:00403660 JL 0040363E

0167:00403662 MOV EBX,[ESP+10] <---取输入的假注册码到EBX中

0167:00403666 ADD EBP,0085D9ED <---上面累加到EBP的值再加0085D9EDH,此时?EBP可看到真码

0167:0040366C LEA EAX,[ESP+14]

0167:00403670 PUSH EBP

0167:00403671 PUSH DWORD 00413554

0167:00403676 PUSH EAX

0167:00403677 CALL MSVCRT!sprintf <---十六进制转换成十进制,将EBP中值转换成十进制值

0167:0040367D ADD ESP,BYTE +0C

0167:00403680 MOV ESI,EBX <---EBX中为我们输入的假码

0167:00403682 LEA EAX,[ESP+14] <---取正确注册码到EAX中,下D EAX即可看到正确注册码

0167:00403686 POP EBP

0167:00403687 MOV DL,[EAX] <---按位取正确注册码

0167:00403689 MOV BL,[ESI] <---按位取输入的假码

0167:0040368B MOV CL,DL

0167:0040368D CMP DL,BL <---比较是否相等

0167:0040368F JNZ 004036AF

0167:00403691 TEST CL,CL <---判断是否取完

0167:00403693 JZ 004036AB

0167:00403695 MOV DL,[EAX+01] <---按位取正确注册码下一位

0167:00403698 MOV BL,[ESI+01] <---按位取输入的假码下一位

0167:0040369B MOV CL,DL

0167:0040369D CMP DL,BL

0167:0040369F JNZ 004036AF <---比较是否相等

0167:004036A1 ADD EAX,BYTE +02

0167:004036A4 ADD ESI,BYTE +02

0167:004036A7 TEST CL,CL <---判断是否取完

0167:004036A9 JNZ 00403687

0167:004036AB XOR ESI,ESI <---ESI=0

0167:004036AD JMP SHORT 004036B4

0167:004036AF SBB ESI,ESI <---ESI=0

0167:004036B1 SBB ESI,BYTE -01 <---ESI=1

0167:004036B4 LEA ECX,[ESP+84]

0167:004036BB MOV BYTE [ESP+7C],00

0167:004036C0 CALL MFC42!ord_00000320

0167:004036C5 LEA ECX,[ESP+88]

0167:004036CC MOV DWORD [ESP+7C],FFFFFFFF

0167:004036D4 CALL MFC42!ord_00000320

0167:004036D9 MOV EAX,ESI <---置EAX中的值用以控制跳转,它由ESI中的值决定

0167:004036DB POP EDI

0167:004036DC POP ESI

0167:004036DD POP EBX

0167:004036DE MOV ECX,[ESP+68]

0167:004036E2 MOV [FS:00],ECX

0167:004036E9 ADD ESP,BYTE +74

0167:004036EC RET

该程序注册成功后将注册信息保存在注册表的

“HKEY_LOCAL_MACHINE/Software/GIF2SWF”中

OK!收工!

我得到的注册码为:

用户名:ShenGe

注册码:17520444

如果是一切还能从前 把如果能再说一遍

我仍愿意再许下心愿 陪着你直到永远

(出处:嬴政天下整理收藏)

相关文章:

·语音界面2.0算法分析及注册机源码!

·侠客系统修改器1.21破解手记--算法分析

·中文拨号上网计时计费器 V4.12注册算法分析

·ClockWise 3.22e注册码算法分析

·CoolClock V1.02注册算法分析

·Directory Scanner v1.5 注册算法分析

·Disk Chief 1.2 简单注册算法分析

·EffeTech HTTP Sniffer 3.2注册算法分析

·eLib2.01算法分析

·EZ MP3 Recorder 1.15 注册算法分析

相关软件:

→ 特别推荐

→ 热点TOP10

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright © 1999-2003

winzheng.com All Rights Reserved.

繁体版:由华琦数码技术提供

Powered

by:MeSky.Net

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史