• 标 题:Gif2swf V2.1版
  • 作 者:ShenGe
  • 时 间:2003/04/11 07:43am
  • 链 接:http://bbs.pediy.com

破解软件: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

如果是一切还能从前  把如果能再说一遍
我仍愿意再许下心愿  陪着你直到永远