XNview 1.96 Full 破解笔记

2009/3/4 来源:www.arpun.com 作者:小白

【破文标题】XNview 1.96 Full 破解笔记

【破文作者】萧萧黄叶

【作者邮箱】

【作者主页】

【破解工具】OllyICE, PEiD v0.94

【破解平台】WinXP

【软件名称】XNview 1.96 Full

【软件大小】14.92 M

【原版下载】http://www1.skycn.com/soft/2717.html

【更新时间】2009-02-25

【软件类别】国外软件 / 图像浏览

【软件语言】英文

【软件类别】国外软件 / 图像浏览

【应用平台】Win9x/WinNT/Win2000/WinXP

【保护方式】

【软件简介】支持多达 70 种格式的图形浏览、转换、编辑软件, 还可制作 Slide Show。 是否嫌ACDSEE

太大功能太少?XNVIEW能很好地解决问题, 他具有抓图、编辑图象、增加特效的功能, 支持你所知道的

所有格式及你不知道的格式(包括电影、MP3)。 支持简体中文语言。

【破解声明】高手请飘过~~~

------------------------------------------------------------------------

【破解过程】先运行看看注册失败的提示, 跳出对话框:注册非法

一、探壳

PEiD v0.94:Microsoft Visual C++ 6.0

二、OllyICE分析

程序载入后停在这里:

005A7A81 >/$  55            PUSH EBP

005A7A82  |.  8BEC          MOV EBP,ESP

005A7A84  |.  6A FF         PUSH -1

F9运行程序, 用你喜欢的姓名注册, 填入假码, 确定前下GetDlgItemTextA断点, 确定后程序被断下了:

77D6B05E >  8BFF            MOV EDI,EDI                              ;

USER32.GetDlgItemTextA

77D6B060    55              PUSH EBP

77D6B061    8BEC            MOV EBP,ESP

清除断点, 慢慢F8返回到这里:

00575F44   .  56            PUSH ESI                                 ; |hWnd

00575F45   .  FFD7          CALL EDI                                 ; \GetDlgItemTextA

00575F47   .  8D4C24 10     LEA ECX,DWORD PTR SS:[ESP+10]            ;  返回 到这里。

00575F4B   .  6A 20         PUSH 20                                  ; /Count = 20 (32.)

00575F4D   .  51            PUSH ECX                                 ; |Buffer

00575F4E   .  68 D1070000   PUSH 7D1                                 ; |ControlID = 7D1

(2001.)

00575F53   .  56            PUSH ESI                                 ; |hWnd

00575F54   .  FFD7          CALL EDI                                 ; \GetDlgItemTextA

00575F56   .  8A4424 70     MOV AL,BYTE PTR SS:[ESP+70]              ;  上面两个CALL后得到

了姓名和注册码的长度

00575F5A   .  84C0          TEST AL,AL

00575F5C   .  0F84 3A010000 JE xnview.0057609C                       ;  如果没有填入姓名就

跳走了。

00575F62   .  8A4424 10     MOV AL,BYTE PTR SS:[ESP+10]

00575F66   .  84C0          TEST AL,AL

00575F68   .  0F84 2E010000 JE xnview.0057609C                       ;  如果没有填入注册码

就跳走了。

00575F6E   .  8D5424 08     LEA EDX,DWORD PTR SS:[ESP+8]

00575F72   .  8D4424 70     LEA EAX,DWORD PTR SS:[ESP+70]

00575F76   .  52            PUSH EDX

00575F77   .  50            PUSH EAX

00575F78   .  E8 035DF9FF   CALL xnview.0050BC80                     ;  关键CALL, 跟进!

00575F7D   .  8D4C24 18     LEA ECX,DWORD PTR SS:[ESP+18]

00575F81   .  51            PUSH ECX

00575F82   .  E8 6CCE0200   CALL xnview.005A2DF3

00575F87   .  8B4C24 14     MOV ECX,DWORD PTR SS:[ESP+14]

00575F8B   .  83C4 0C       ADD ESP,0C

00575F8E   .  3BC8          CMP ECX,EAX

00575F90      74 5D         JE SHORT xnview.00575FEF                 ;  关键跳, 一跳就死!

00575F92   .  A1 40317600   MOV EAX,DWORD PTR DS:[763140]

关键CALL0050BC80 跟进如下:

首先是第一个循环:

0050BCA9  |. /74 21         JE SHORT xnview.0050BCCC

0050BCAB  |> |8A0C16        /MOV CL,BYTE PTR DS:[ESI+EDX]            ;  从这里开始第一个循

环计算。

0050BCAE  |. |8AD9          |MOV BL,CL                               ;  依次取姓名每一个字

符的ASCII码放到BL上

0050BCB0  |. |3298 B8CF7500 |XOR BL,BYTE PTR DS:[EAX+75CFB8]         ;  姓名ASCII码与

EAX+75CFB8处的数值作异或运算。 EAX=循环的次数。

0050BCB6  |. |40            |INC EAX

0050BCB7  |. |83F8 05       |CMP EAX,5

0050BCBA  |. |881C16        |MOV BYTE PTR DS:[ESI+EDX],BL            ;  将计算结果保存

0050BCBD  |. |8888 B7CF7500 |MOV BYTE PTR DS:[EAX+75CFB7],CL         ;  用计算结果填充

EAX+75CFB8

0050BCC3  |. |75 02         |JNZ SHORT xnview.0050BCC7               ;  如果循环超过5次就将

EAX清零, 从新参加计算, 此时EAX+75CFB8已经不是原来的值, 而第一次异或运算的结果。

0050BCC5  |. |33C0          |XOR EAX,EAX

0050BCC7  |> |46            |INC ESI

0050BCC8  |. |3BF5          |CMP ESI,EBP

0050BCCA  |.^|72 DF         \JB SHORT xnview.0050BCAB                ;  姓名都计算完了就结

束这个循环。

0050BCCC  |> \33FF          XOR EDI,EDI

0050BCCE  |.  33C9          XOR ECX,ECX

数据窗口跟随0075CFB8

0075CFB8  AA 89 C4 FE 46 78 F0 D0 03 E7 F7 FD F4 E7 B9 B5  獕宁Fx鹦琪绻

第二、三、四个循环:

0050BCCE  |.  33C9          XOR ECX,ECX

0050BCD0  |.  85ED          TEST EBP,EBP

0050BCD2  |.  76 26         JBE SHORT xnview.0050BCFA

0050BCD4  |>  8A9F BDCF7500 /MOV BL,BYTE PTR DS:[EDI+75CFBD]         ;  取0075CFB8处后面五

组数来进行运算

0050BCDA  |.  8BF5          |MOV ESI,EBP

0050BCDC  |.  2BF1          |SUB ESI,ECX

0050BCDE  |.  4E            |DEC ESI

0050BCDF  |.  8A0416        |MOV AL,BYTE PTR DS:[ESI+EDX]            ;  将第一次计算的结果

再合出来与上面的数作异或运算。 但是, 顺序是相反的, 上次运算的第一个结果此次最后运算。

0050BCE2  |.  32D8          |XOR BL,AL

0050BCE4  |.  47            |INC EDI

0050BCE5  |.  881C16        |MOV BYTE PTR DS:[ESI+EDX],BL

0050BCE8  |.  8887 BCCF7500 |MOV BYTE PTR DS:[EDI+75CFBC],AL

0050BCEE  |.  83FF 05       |CMP EDI,5

0050BCF1  |.  75 02         |JNZ SHORT xnview.0050BCF5

0050BCF3  |.  33FF          |XOR EDI,EDI

0050BCF5  |>  41            |INC ECX

0050BCF6  |.  3BCD          |CMP ECX,EBP

0050BCF8  |.^ 72 DA         \JB SHORT xnview.0050BCD4

0050BCFA  |>  33F6          XOR ESI,ESI

0050BCFC  |.  33FF          XOR EDI,EDI

0050BCFE  |.  85ED          TEST EBP,EBP

0050BD00  |.  76 21         JBE SHORT xnview.0050BD23

0050BD02  |>  8A0417        /MOV AL,BYTE PTR DS:[EDI+EDX]

0050BD05  |.  8A8E C2CF7500 |MOV CL,BYTE PTR DS:[ESI+75CFC2]         ;  第三组数来参加运算

0050BD0B  |.  32C8          |XOR CL,AL

0050BD0D  |.  46            |INC ESI

0050BD0E  |.  880C17        |MOV BYTE PTR DS:[EDI+EDX],CL

0050BD11  |.  8886 C1CF7500 |MOV BYTE PTR DS:[ESI+75CFC1],AL

0050BD17  |.  83FE 05       |CMP ESI,5

0050BD1A  |.  75 02         |JNZ SHORT xnview.0050BD1E

0050BD1C  |.  33F6          |XOR ESI,ESI

0050BD1E  |>  47            |INC EDI

0050BD1F  |.  3BFD          |CMP EDI,EBP

0050BD21  |.^ 72 DF         \JB SHORT xnview.0050BD02

0050BD23  |>  33FF          XOR EDI,EDI

0050BD25  |.  33C9          XOR ECX,ECX

0050BD27  |.  85ED          TEST EBP,EBP

0050BD29  |.  76 26         JBE SHORT xnview.0050BD51

0050BD2B  |>  8A9F C7CF7500 /MOV BL,BYTE PTR DS:[EDI+75CFC7]         ;  第四组数再来参加运

算。

0050BD31  |.  8BF5          |MOV ESI,EBP

0050BD33  |.  2BF1          |SUB ESI,ECX

0050BD35  |.  4E            |DEC ESI

0050BD36  |.  8A0416        |MOV AL,BYTE PTR DS:[ESI+EDX]

0050BD39  |.  32D8          |XOR BL,AL

0050BD3B  |.  47            |INC EDI

0050BD3C  |.  881C16        |MOV BYTE PTR DS:[ESI+EDX],BL

0050BD3F  |.  8887 C6CF7500 |MOV BYTE PTR DS:[EDI+75CFC6],AL

0050BD45  |.  83FF 05       |CMP EDI,5

0050BD48  |.  75 02         |JNZ SHORT xnview.0050BD4C

0050BD4A  |.  33FF          |XOR EDI,EDI

0050BD4C  |>  41            |INC ECX

0050BD4D  |.  3BCD          |CMP ECX,EBP

0050BD4F  |.^ 72 DA         \JB SHORT xnview.0050BD2B

0050BD51  |>  8B7C24 18     MOV EDI,DWORD PTR SS:[ESP+18]

0050BD55  |.  33C0          XOR EAX,EAX

最后一个循环:

0050BD59  |.  C707 00000000 MOV DWORD PTR DS:[EDI],0

0050BD5F  |.  76 17         JBE SHORT xnview.0050BD78

0050BD61  |>  8BC8          /MOV ECX,EAX

0050BD63  |.  83E1 03       |AND ECX,3

0050BD66  |.  8A1C39        |MOV BL,BYTE PTR DS:[ECX+EDI]

0050BD69  |.  8D3439        |LEA ESI,DWORD PTR DS:[ECX+EDI]

0050BD6C  |.  8A0C10        |MOV CL,BYTE PTR DS:[EAX+EDX]

0050BD6F  |.  02D9          |ADD BL,CL                               ;  最后的注册码只有四

组数值, 如果运算时参加运算的字符多于四个就会得到超过四组的数值, 将后面的往前面的上面相加,

如第五个加到第一个上, 第六个加到第二个上等等。

0050BD71  |.  40            |INC EAX

0050BD72  |.  3BC5          |CMP EAX,EBP

0050BD74  |.  881E          |MOV BYTE PTR DS:[ESI],BL

0050BD76  |.^ 72 E9         \JB SHORT xnview.0050BD61

0050BD78  |>  5F            POP EDI

0050BD79  |.  5E            POP ESI

这个CALL得到了我们要的注册码的十六进制

00575F82位置上的CALL xnview.005A2DF3则是将填入的注册码换算成十六进制。

最后

00575F87   .  8B4C24 14     MOV ECX,DWORD PTR SS:[ESP+14]

00575F8B   .  83C4 0C       ADD ESP,0C

00575F8E   .  3BC8          CMP ECX,EAX                              ;  这里是真假码的十六

进制形式的对比。

00575F90      74 5D         JE SHORT xnview.00575FEF                 ;  关键跳, 一跳就死!

------------------------------------------------------------------------

【破解总结】将你填入的姓名与一组数作一定的运算得到的结果再转化为十进制就是正确的注册码。

具体算法:

固定数值:AA 89 C4 FE 46 78 F0 D0 03 E7 F7 FD F4 E7 B9 B5 1B C9 50 73 平均分为五组。

取姓名的每一个字符的ASCII码与上面的第一组作异或运算, 结果为int1(a)

将int1(a)倒序与第二组数作异或运算, 结果为int1(a), 同样的方法再运算四次。

将int1(a)合并为四个数, 超过的依次加到前面。

网友评论
评论(...
全部评论