首页
社区
课程
招聘
[旧帖] [原创]XNview 1.96 Full 破解笔记 0.00雪花
发表于: 2009-6-2 18:18 2600

[旧帖] [原创]XNview 1.96 Full 破解笔记 0.00雪花

2009-6-2 18:18
2600
【破文标题】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)合并为四个数,超过的依次加到前面。

已经克服了中文名字和姓名位数的限制。
当然要防止VB的溢出。
请大家试用,在实践中检验,我将及时更正!
谢谢!!!

VB源码:
Option Base 1
Private Sub Command1_Click()
Dim int1(5)
Dim str1(100)
Dim sn(4)
Dim sn1 As Long
Txt1 = Text1.Text

For i = 1 To Len(Txt1)
str4 = Hex(Asc(Mid(Txt1, i, 1)))
str5 = str5 & str4
Next

i = 0
For s = 1 To Len(str5) Step 2
i = i + 1
str1(i) = Mid(str5, s, 2)
Next

t = Len(str5) / 2
For i = 1 To t
Hex2 = str1(i)

For n = 1 To Len(Hex2)
        Select Case Mid(Hex2, Len(Hex2) - n + 1, 1)
            Case "0": x = x + 16 ^ (n - 1) * 0
            Case "1": x = x + 16 ^ (n - 1) * 1
            Case "2": x = x + 16 ^ (n - 1) * 2
            Case "3": x = x + 16 ^ (n - 1) * 3
            Case "4": x = x + 16 ^ (n - 1) * 4
            Case "5": x = x + 16 ^ (n - 1) * 5
            Case "6": x = x + 16 ^ (n - 1) * 6
            Case "7": x = x + 16 ^ (n - 1) * 7
            Case "8": x = x + 16 ^ (n - 1) * 8
            Case "9": x = x + 16 ^ (n - 1) * 9
            Case "A": x = x + 16 ^ (n - 1) * 10
            Case "B": x = x + 16 ^ (n - 1) * 11
            Case "C": x = x + 16 ^ (n - 1) * 12
            Case "D": x = x + 16 ^ (n - 1) * 13
            Case "E": x = x + 16 ^ (n - 1) * 14
            Case "F": x = x + 16 ^ (n - 1) * 15
        End Select
Next n
str1(i) = x
x = 0
Next
'上面是将姓名的ASCII转为十六进制,再转为十进制,是因为中文字符的ASCII码的十六进制很明确,直

接转十进制的有误。
'第一次循环
int1(1) = &HAA
int1(2) = &H89
int1(3) = &HC4
int1(4) = &HFE
int1(5) = &H46
a = 0
For i = 1 To t
a = a + 1
int2 = int1(a)
int1(a) = str1(i)
str1(i) = str1(i) Xor int2
    If a >= 5 Then
    a = a - 5
    End If
Next

'第二次循环
int1(1) = &H78
int1(2) = &HF0
int1(3) = &HD0
int1(4) = &H3
int1(5) = &HE7
a = 0
For i = t To 1 Step -1
a = a + 1
int2 = int1(a)
int1(a) = str1(i)
str1(i) = str1(i) Xor int2
    If a >= 5 Then
    a = a - 5
    End If
Next

'第三次循环
int1(1) = &HF7
int1(2) = &HFD
int1(3) = &HF4
int1(4) = &HE7
int1(5) = &HB9
a = 0
For i = 1 To t
a = a + 1
int2 = int1(a)
int1(a) = str1(i)
str1(i) = str1(i) Xor int2
    If a >= 5 Then
    a = a - 5
    End If
Next

'第四次循环
int1(1) = &HB5
int1(2) = &H1B
int1(3) = &HC9
int1(4) = &H50
int1(5) = &H73
a = 0
For i = t To 1 Step -1
a = a + 1
int2 = int1(a)
int1(a) = str1(i)
str1(i) = str1(i) Xor int2
    If a >= 5 Then
    a = a - 5
    End If
Next

'整合出注册码
m = 0
For i = 1 To t
m = m + 1
sn(m) = sn(m) + str1(i)
    If m = 4 Then
    m = m - 4
    End If
Next

For m = 1 To 4
sn2 = Hex(sn(m))
    If Len(sn2) < 2 Then '因为考虑到注册码是四个字符相连而成,为了防止有少于或多于两个字符


    sn2 = "0" & sn2
    End If
    If Len(sn2) > 2 Then
    sn2 = Right(sn2, 2)
    End If
sn3 = sn2 & sn3
Next

hex1 = sn3
For i = 1 To Len(hex1)
        Select Case Mid(hex1, Len(hex1) - i + 1, 1)
            Case "0": b = b + 16 ^ (i - 1) * 0
            Case "1": b = b + 16 ^ (i - 1) * 1
            Case "2": b = b + 16 ^ (i - 1) * 2
            Case "3": b = b + 16 ^ (i - 1) * 3
            Case "4": b = b + 16 ^ (i - 1) * 4
            Case "5": b = b + 16 ^ (i - 1) * 5
            Case "6": b = b + 16 ^ (i - 1) * 6
            Case "7": b = b + 16 ^ (i - 1) * 7
            Case "8": b = b + 16 ^ (i - 1) * 8
            Case "9": b = b + 16 ^ (i - 1) * 9
            Case "A": b = b + 16 ^ (i - 1) * 10
            Case "B": b = b + 16 ^ (i - 1) * 11
            Case "C": b = b + 16 ^ (i - 1) * 12
            Case "D": b = b + 16 ^ (i - 1) * 13
            Case "E": b = b + 16 ^ (i - 1) * 14
            Case "F": b = b + 16 ^ (i - 1) * 15
        End Select
Next i
sn3 = b
Text2.Text = sn3
End Sub
------------------------------------------------------------------------
【版权声明】本文只是出于学习与交流目的,请勿用于商业用途,否则后果自负。软件版权归作者所有


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//