wzwgp 发表于 2006-4-23 14:29:32

菜鸟初学Crack破解PictureToIcon 1.914

【破解软件】Picture To Icon 1.914
【下载地址】http://www.onlinedown.net/soft/45891.htm
【运行环境】Win9x/Me/NT/2000/XP/2003
【保护方式】ASPack 壳、注册码
【作者声明】初学Crack,只是感兴趣,没有其他目的。错误之处敬请诸位前辈不吝赐教
【调试环境】Winxp、OllyDBD、PEiD
【软件信息】能将图片或屏幕的一部分转化为ICON图标,调整图标大小以及从资源库中提取icon。支持BMP, JPEG, GIF, CUR, WMF。
【破解过程】常在论坛学习Crack,找了个简单的软件练习,增加学习的兴趣。

一、脱壳

PEiD 查壳:ASPack 2.001 -> Alexey Solodovnikov  OD载入,提示“入口点超出代码范围......”确定后,提示“代码段可能被压

缩、加密....”选否。停在下面:

00613001 >60            PUSHAD              ; 入口代码
00613002    E8 72050000   CALL Pic2Ico.00613579       ; F8到此 ESP=12FFA4
00613007    EB 4C         JMP SHORT Pic2Ico.00613055

下断:HR ESPF9

006134F4   /75 08         JNZ SHORT Pic2Ico.006134FE      ; 断在此,F8跳
006134F6   |B8 01000000   MOV EAX,1
006134FB   |C2 0C00         RETN 0C
006134FE   \68 CC154000   PUSH Pic2Ico.004015CC       ; 跳到这儿
00613503    C3            RETN               ; F8返回到004015CC

004015CC   /EB 10         JMP SHORT Pic2Ico.004015DE    ; 到达OEP
004015CE   |66:623A         BOUND DI,DWORD PTR DS:
004015D1   |43            INC EBX
004015D2   |2B2B            SUB EBP,DWORD PTR DS:
004015D4   |48            DEC EAX
004015D5   |4F            DEC EDI
004015D6   |4F            DEC EDI
004015D7   |4B            DEC EBX

在004015CC处OllyDump方式1脱壳,保存文件后,运行正常。PEiD 再查: Borland C++ 1999


二、追码

OD载入脱壳后文件,查找字串参考,找到:register successfully!\nthank you,双击来到:00422BED处,向上翻很长一段代码,在
004228E8处下断,F9 在注册框里填用户名:wzwgp 注册码:127A31682B 点“OK”

004228E8/.55            PUSH EBP                         ;断下
004228E9|.8BEC          MOV EBP,ESP
004228EB|.83C4 9C       ADD ESP,-64
      --------------中间省略------------------
00422926|.8B4D A4       MOV ECX,DWORD PTR SS:
00422929|.8B81 00030000 MOV EAX,DWORD PTR DS:
0042292F|.E8 E4FE0900   CALL zt.004C2818
00422934|.8D45 FC       LEA EAX,DWORD PTR SS:      ;用户名地址指针入EAX
00422937|.E8 6032FEFF   CALL zt.00405B9C                  ;取得用户名位数
0042293C|.83F8 03       CMP EAX,3                         ;用户名位数与3比较大小
0042293F|.0F9CC2      SETL DL
00422942|.83E2 01       AND EDX,1
00422945|.52            PUSH EDX                        
00422946|.FF4D C4       DEC DWORD PTR SS:         
00422949|.8D45 FC       LEA EAX,DWORD PTR SS:   
0042294C|.BA 02000000   MOV EDX,2                        
00422951|.E8 1E0F0D00   CALL zt.004F3874                  
00422956|.59            POP ECX
00422957|.84C9          TEST CL,CL
00422959|.74 3C         JE SHORT zt.00422997            ;用户名位数大于3位跳
0042295B|.66:C745 B8 14>MOV WORD PTR SS:,14
00422961|.BA 6D275100   MOV EDX,zt.0051276D               ;please input your full name!

00422997|> \68 F4010000   PUSH 1F4                        ; /跳到此
0042299C|.E8 B7A40E00   CALL <JMP.&kernel32.Sleep>      ; \Sleep
004229A1|.66:C745 B8 20>MOV WORD PTR SS:,20
004229A7|.8D45 F4       LEA EAX,DWORD PTR SS:
004229AA|.E8 CD11FEFF   CALL zt.00403B7C
004229AF|.8BD0          MOV EDX,EAX
004229B1|.FF45 C4       INC DWORD PTR SS:
004229B4|.8B4D A4       MOV ECX,DWORD PTR SS:
004229B7|.8B81 04030000 MOV EAX,DWORD PTR DS:
004229BD|.E8 56FE0900   CALL zt.004C2818                  ;取假码
004229C2|.8D55 F4       LEA EDX,DWORD PTR SS:      ;假码地址指针入EDX
004229C5|.FF32          PUSH DWORD PTR DS:         ;Arg1 = 00BA3684 (ASCII "127A31682B")
004229C7|.E8 24E7FFFF   CALL zt.004210F0                  ;F7 进入算法

 004229C7 处F7 来到下面:

004210F0/$55            PUSH EBP
004210F1|.8BEC          MOV EBP,ESP
004210F3|.81C4 74FFFFFF ADD ESP,-8C
004210F9|.56            PUSH ESI
004210FA|.57            PUSH EDI
004210FB|.B8 C0285100   MOV EAX,zt.005128C0
00421100|.E8 7B760C00   CALL zt.004E8780
00421105|.C745 F8 01000>MOV DWORD PTR SS:,1
0042110C|.8D55 08       LEA EDX,DWORD PTR SS:
0042110F|.8D45 08       LEA EAX,DWORD PTR SS:
00421112|.E8 DD260D00   CALL zt.004F37F4
00421117|.FF45 F8       INC DWORD PTR SS:
0042111A|.66:C745 EC 08>MOV WORD PTR SS:,8
00421120|.C645 DB 00    MOV BYTE PTR SS:,0
00421124|.8D45 08       LEA EAX,DWORD PTR SS:
00421127|.E8 704AFEFF   CALL zt.00405B9C         ;取假码位数
0042112C|.83F8 2C       CMP EAX,2C                     ;注册码要44位,填入44位注册码重新来到此
0042112F      0F85 3E020000 JNZ zt.00421373
00421135|.BE D6245100   MOV ESI,zt.005124D6            ;常数组入ESI (1z1h+2a0n-0g8y*9a1n|)
0042113A|.8D7D 88       LEA EDI,DWORD PTR SS:
0042113D|.B9 05000000   MOV ECX,5
00421142|.F3:A5         REP MOVS DWORD PTR ES:,DWOR>; 常数入栈(12FA30-40)
00421144|.A4            MOVS BYTE PTR ES:,BYTE PTR >
00421145|.8D45 08       LEA EAX,DWORD PTR SS:   ; 假码地址入EAX
00421148|.E8 2B10FEFF   CALL zt.00402178         ; 取假码
0042114D|.0FBE50 28   MOVSX EDX,BYTE PTR DS:  ; 假码41位入EDX
00421151|.83FA 50       CMP EDX,50                     ; 第41位注册码(50)
00421154      74 23         JE SHORT zt.00421179
00421156|.33C0          XOR EAX,EAX
00421158|.50            PUSH EAX
00421159|.FF4D F8       DEC DWORD PTR SS:
0042115C|.8D45 08       LEA EAX,DWORD PTR SS:
0042115F|.BA 02000000   MOV EDX,2
00421164|.E8 0B270D00   CALL zt.004F3874
00421169|.58            POP EAX
0042116A|.8B55 DC       MOV EDX,DWORD PTR SS:
0042116D|.64:8915 00000>MOV DWORD PTR FS:,EDX
00421174      E9 19020000   JMP zt.00421392
00421179|>8D45 08       LEA EAX,DWORD PTR SS:
0042117C|.E8 F70FFEFF   CALL zt.00402178
00421181|.0FBE50 29   MOVSX EDX,BYTE PTR DS:
00421185|.83FA 32       CMP EDX,32            ; 第42位注册码(32)
00421188|.74 23         JE SHORT zt.004211AD
0042118A|.33C0          XOR EAX,EAX
0042118C|.50            PUSH EAX
0042118D|.FF4D F8       DEC DWORD PTR SS:
00421190|.8D45 08       LEA EAX,DWORD PTR SS:
00421193|.BA 02000000   MOV EDX,2
00421198|.E8 D7260D00   CALL zt.004F3874
0042119D|.58            POP EAX
0042119E|.8B55 DC       MOV EDX,DWORD PTR SS:
004211A1|.64:8915 00000>MOV DWORD PTR FS:,EDX
004211A8|.E9 E5010000   JMP zt.00421392
004211AD|>8D45 08       LEA EAX,DWORD PTR SS:
004211B0|.E8 C30FFEFF   CALL zt.00402178
004211B5|.0FBE50 2A   MOVSX EDX,BYTE PTR DS:
004211B9|.83FA 49       CMP EDX,49                        ; 第43位注册码(49)
004211BC|.74 23         JE SHORT zt.004211E1
004211BE|.33C0          XOR EAX,EAX
004211C0|.50            PUSH EAX
004211C1|.FF4D F8       DEC DWORD PTR SS:
004211C4|.8D45 08       LEA EAX,DWORD PTR SS:
004211C7|.BA 02000000   MOV EDX,2
004211CC|.E8 A3260D00   CALL zt.004F3874
004211D1|.58            POP EAX
004211D2|.8B55 DC       MOV EDX,DWORD PTR SS:
004211D5|.64:8915 00000>MOV DWORD PTR FS:,EDX
004211DC|.E9 B1010000   JMP zt.00421392
004211E1|>8D45 08       LEA EAX,DWORD PTR SS:
004211E4|.E8 8F0FFEFF   CALL zt.00402178
004211E9|.0FBE50 2B   MOVSX EDX,BYTE PTR DS:
004211ED|.83FA 31       CMP EDX,31                        ;第44位注册码(31)
004211F0|.74 23         JE SHORT zt.00421215       ;相等就跳

00421215|> \8D45 08       LEA EAX,DWORD PTR SS:      ;跳到此
00421218|.E8 5B0FFEFF   CALL zt.00402178
0042121D|.50            PUSH EAX                           
0042121E|.8D55 A0       LEA EDX,DWORD PTR SS:   
00421221|.52            PUSH EDX                           
00421222|.E8 B5720C00   CALL zt.004E84DC                  
00421227|.83C4 08       ADD ESP,8
0042122A|.0FBE4D A1   MOVSX ECX,BYTE PTR SS:  ; 取假码第2位
0042122E|.83F9 30       CMP ECX,30                        ; 第2位注册码(30)
00421231      0F85 3C010000 JNZ zt.00421373                  
00421237|.C645 A1 23    MOV BYTE PTR SS:,23       ; 常数32替换第2位注册码
0042123B|.C645 DB 01    MOV BYTE PTR SS:,1
0042123F|.C745 D4 02000>MOV DWORD PTR SS:,2
 
 进入第一个循环
00421246|> /8B45 D4       /MOV EAX,DWORD PTR SS:
00421249|. |0FBE5405 88   |MOVSX EDX,BYTE PTR SS:      ;edx=31(常数组第三位)(逐位取常数组)
0042124E|. |8B4D D4       |MOV ECX,DWORD PTR SS:         ;=2
00421251|. |0FBE440D 9F   |MOVSX EAX,BYTE PTR SS:      ;eax=23(替换后的假码第二位、逐位取假码)
00421256|. |03D0          |ADD EDX,EAX                           ;edx=54
00421258|. |8B4D D4       |MOV ECX,DWORD PTR SS:
0042125B|. |0FBE440D A0   |MOVSX EAX,BYTE PTR SS:      ;eax=37(假码第三位、逐位取假码)
00421260|. |33D0          |XOR EDX,EAX                           ;edx=63
00421262|. |8B4D D4       |MOV ECX,DWORD PTR SS:
00421265|. |0FBE440D 88   |MOVSX EAX,BYTE PTR SS:      ;eax=31
0042126A|. |33D0          |XOR EDX,EAX                           ;edx=52
0042126C|. |52            |PUSH EDX                              
0042126D|. |E8 26010000   |CALL zt.00421398                        
00421272|. |59            |POP ECX
00421273|. |B9 1A000000   |MOV ECX,1A
00421278|. |99            |CDQ
00421279|. |F7F9          |IDIV ECX                              ;eax=3edx=4 (52 IDIV 1A)
0042127B|. |83C2 41       |ADD EDX,41                              ;edx=4+41=45
0042127E|. |8B45 D4       |MOV EAX,DWORD PTR SS:
00421281|. |0FBE4C05 A9   |MOVSX ECX,BYTE PTR SS:      ;假码第12位入ecx
00421286|. |3BD1          |CMP EDX,ECX               ;注册码第12位=45
00421288   |75 06          JZ SHORT zt.00421290                  ;将JN改成JNZ可以走完循环
0042128A|. |C645 DB 00    |MOV BYTE PTR SS:,0
0042128E|. |EB 09         |JMP SHORT zt.00421299
00421290|> |FF45 D4       |INC DWORD PTR SS:               ;=2+1(计数器)
00421293|. |837D D4 0A    |CMP DWORD PTR SS:,0A
00421297|.^\7C AD         \JL SHORT zt.00421246                  ;小于0A循环

 通过该循环计算出44位注册码中的8个数(45 41 4D 59 50 47 51 57),第12位到第19位。
 走出第一个循环来到第二个循环,将已知的注册码填到对应位置,来到第二个循环。

004212B6|> /8B55 D0       /MOV EDX,DWORD PTR SS:         ;18入EDX 计数器
004212B9|. |0FBE4415 89   |MOVSX EAX,BYTE PTR SS:      ;替换后的假码第二位入EAX (逐位取假码)
004212BE|. |B9 06000000   |MOV ECX,6
004212C3|. |99            |CDQ
004212C4|. |F7F9          |IDIV ECX                              ;EAX=5 EDX=5 (23 IDIV 6)
004212C6|. |8BCA          |MOV ECX,EDX                           ;ECX=5
004212C8|. |8B45 D0       |MOV EAX,DWORD PTR SS:
004212CB|. |0FBE5405 8A   |MOVSX EDX,BYTE PTR SS:      ;假码第3位入EDX (逐位取假码)
004212D0|. |D3E2          |SHL EDX,CL                              ;EDX=6E0Cl=5 (逻辑右移)
004212D2|. |8B45 D0       |MOV EAX,DWORD PTR SS:
004212D5|. |0FBE4C05 8B   |MOVSX ECX,BYTE PTR SS:      ;假码第4位入ECX=41 (A)
004212DA|. |0BD1          |OR EDX,ECX                              ;EDX=6E1 (6E0 OR 41)
004212DC|. |52            |PUSH EDX                              
004212DD|. |E8 B6000000   |CALL zt.00421398                        ;EDX的值存入EAX
004212E2|. |59            |POP ECX
004212E3|. |B9 1A000000   |MOV ECX,1A
004212E8|. |99            |CDQ
004212E9|. |F7F9          |IDIV ECX                              ;eax=43 edx=13 (6E1 IDIV 1A)
004212EB|. |80C2 61       |ADD DL,61                               ;DL=13+61=74
004212EE|. |8B45 D0       |MOV EAX,DWORD PTR SS:
004212F1|. |889405 5CFFFF>|MOV BYTE PTR SS:,DL         ;保存计算结果
004212F8|. |FF45 D0       |INC DWORD PTR SS:               ;计数器加1
004212FB|. |837D D0 28    |CMP DWORD PTR SS:,28            ;计数器的数值小于28继续循环
004212FF|.^\7C B5         \JL SHORT zt.004212B6                  ;循环

通过第二个循环计算出一组中间数,共16个(74 78 6C 65 75 67 75 68 70 6C 72 66 71 66 6C 62 )。

00421301|> \C645 84 5A    MOV BYTE PTR SS:,5A            ; 5A加入中间数第17个
00421305|.C645 85 59    MOV BYTE PTR SS:,59       ; 59加入中间数第18个
00421309|.C745 CC 18000>MOV DWORD PTR SS:,18
00421310|.66:C745 EC 08>MOV WORD PTR SS:,8
00421316|.837D CC 28    CMP DWORD PTR SS:,28
0042131A|.7D 4A         JGE SHORT zt.00421366

走出第二个循环来到第三个循环。

0042131C|> /8B55 CC       /MOV EDX,DWORD PTR SS:         ;=18 计数器
0042131F|. |0FBE8415 5CFF>|MOVSX EAX,BYTE PTR SS:      ;中间数第一位入EAX=74(逐位取数)
00421327|. |C1E0 04       |SHL EAX,4                               ;逻辑左移4位
0042132A|. |8B55 CC       |MOV EDX,DWORD PTR SS:
0042132D|. |0FBE8C15 5DFF>|MOVSX ECX,BYTE PTR SS:      ;中间数第2位入ECX=78(逐位取数)
00421335|. |D1F9          |SAR ECX,1                               ;算术右移1位
00421337|. |33C1          |XOR EAX,ECX                           ;EAX=77C
00421339|. |50            |PUSH EAX                              
0042133A|. |E8 59000000   |CALL zt.00421398                        
0042133F|. |59            |POP ECX
00421340|. |B9 1A000000   |MOV ECX,1A
00421345|. |99            |CDQ
00421346|. |F7F9          |IDIV ECX                              ;EAX=49 EDX=12
00421348|. |83C2 41       |ADD EDX,41                              ;EDX=12+41=53
0042134B|. |8B45 CC       |MOV EAX,DWORD PTR SS:
0042134E|. |0FBE4405 A0   |MOVSX EAX,BYTE PTR SS:      ;取第25位假码(逐位比较注册码)
00421353|. |3BD0          |CMP EDX,EAX
00421355   |74 06         JE SHORT zt.0042135D
00421357|. |C645 DB 00    |MOV BYTE PTR SS:,0
0042135B|. |EB 09         |JMP SHORT zt.00421366
0042135D|> |FF45 CC       |INC DWORD PTR SS:
00421360|. |837D CC 28    |CMP DWORD PTR SS:,28
00421364|.^\7C B6         \JL SHORT zt.0042131C          ; 小于28继续循环

 通过第三个循环计算出44位注册码中的16个数(53 59 4B 45 54 59 55 45 41 52 52 4D 48 4B 4A 50),第25位到第40位。

00421366|> \0FBE55 AA   MOVSX EDX,BYTE PTR SS:         ;取假码11位入EDX
0042136A|.83FA 59       CMP EDX,59                               ;注册码第11位=59
0042136D      74 04         JE SHORT zt.00421373
0042136F|.C645 DB 00    MOV BYTE PTR SS:,0
00421373|>8A45 DB       MOV AL,BYTE PTR SS:
00421376|.50            PUSH EAX
00421377|.FF4D F8       DEC DWORD PTR SS:
0042137A|.8D45 08       LEA EAX,DWORD PTR SS:             ;取假码地址入EAX
0042137D|.BA 02000000   MOV EDX,2
00421382|.E8 ED240D00   CALL zt.004F3874
00421387|.58            POP EAX
00421388|.8B55 DC       MOV EDX,DWORD PTR SS:
0042138B|.64:8915 00000>MOV DWORD PTR FS:,EDX
00421392|>5F            POP EDI
00421393|.5E            POP ESI
00421394|.8BE5          MOV ESP,EBP
00421396|.5D            POP EBP
00421397\.C3            RETN                                     ; 返回到 004229CC

走完 004229C7处 CALL zt.004210F0  返回到下面:

004229C7|.E8 24E7FFFF   CALL zt.004210F0                        
004229CC|.59            POP ECX                 ; 返回到此
004229CD|.8B0D FCAE5100 MOV ECX,DWORD PTR DS:            
004229D3|.8B11          MOV EDX,DWORD PTR DS:
004229D5|.8882 E4030000 MOV BYTE PTR DS:,AL
   --------------中间省略------------------
00422A48|.E8 2BF7FDFF   CALL zt.00402178
00422A4D|.0FBE50 17   MOVSX EDX,BYTE PTR DS:         ; 取假码第24位入EDX
00422A51|.83FA 30       CMP EDX,30
00422A54|.7C 16         JL SHORT zt.00422A6C
00422A56|.8B45 A4       MOV EAX,DWORD PTR SS:
00422A59|.05 20030000   ADD EAX,320
00422A5E|.E8 15F7FDFF   CALL zt.00402178
00422A63|.0FBE50 17   MOVSX EDX,BYTE PTR DS:      ; 取假码第24位入EDX
00422A67|.83FA 39       CMP EDX,39
00422A6A      7E 0F         JLE SHORT zt.00422A7B

注册码第24位是0-9(十进制)之间的任意数
 一路往下走就到了"register successfully!\nthank you."

00422BDE|.FF51 FC       CALL NEAR DWORD PTR DS:
00422BE1|.66:C745 B8 5C>MOV WORD PTR SS:,5C
00422BE7|>66:C745 B8 74>MOV WORD PTR SS:,74
00422BED|.BA A8275100   MOV EDX,zt.005127A8                      ;register successfully!\nthank you.

三、追码总结

1.用户名要3位以上,与注册码无关。
2.注册码位数是44位(ASCII字符)。
3.注册码第1位、第3到10位(参与不固定注册码运算)、第20到23位可以取任意字符。
4.注册码第2位、第41到44位是固定字符:0 P 2 I 1
5.注册码第24位是0-9(十进制)之间的任意字符
6.第2位〔常数23(h)替换〕到10位注册码与常数组(1z1h+2a0n-0g8y*9a1n|)
通过循环逐位运算得到注册码第12到19位注册码。
7.第2位〔常数23(h)替换〕到19位注册码通过循环逐位运算得到一组中间数16个,
再加上固定数5A 59, 中间数组共计有18个。
8.18个中间数通过循环逐位运算得到第25位到第40位注册码。

我的用户名:wzwgp
  注册码:107A31682BYEAMYPGQW56787SYKETYUEARRMHKJPP2I1

注册信息保存在注册表:HKEY_USERS\S-1-5-21-1123561945-492894223-1060284298-1002\Software\XTZY\Pic2Ico

 破文写得很乱,感谢你看完。

[ 本帖最后由 wzwgp 于 2006-4-24 09:45 编辑 ]

shatan 发表于 2006-4-23 19:09:51

好文,学习

寒湖鹤影 发表于 2006-6-1 14:15:31

牛呀,算法都搞出来了

sky3749 发表于 2006-6-1 23:40:16

真厉害呀!!算法都还没跟进,大家努力!!

JOYSIDE 发表于 2006-6-2 18:48:35

写的不错。..学习了。..

nihaoya_li 发表于 2006-6-6 18:55:05

很想看明白,但是实在看不明白!!

浪淘沙 发表于 2006-6-7 10:38:46

学习学习,慢慢的看看

nioyun 发表于 2006-8-5 08:55:32

真厉害呀。

Mysoft 发表于 2006-8-5 09:29:59

正适合我这样的菜鸟学习。。。

bfqyygy 发表于 2006-9-7 17:25:25

好详细!!学习!
页: [1] 2 3
查看完整版本: 菜鸟初学Crack破解PictureToIcon 1.914