飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6229|回复: 19

[原创] XNview 1.96 Full 破解笔记

[复制链接]
  • TA的每日心情
    开心
    2016-12-24 08:16
  • 签到天数: 464 天

    [LV.9]以坛为家II

    发表于 2009-3-2 23:27:18 | 显示全部楼层 |阅读模式
    【破文标题】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)。支持简体中文语言。
    [hide]【破解声明】高手请飘过~~~
    ------------------------------------------------------------------------
    【破解过程】先运行看看注册失败的提示,跳出对话框:注册非法
    一、探壳
    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
    ------------------------------------------------------------------------
    【版权声明】本文只是出于学习与交流目的,请勿用于商业用途,否则后果自负。软件版权归作者所有。

    [ 本帖最后由 萧萧黄叶 于 2009-3-4 20:48 编辑 ]

    评分

    参与人数 1威望 +40 飘云币 +80 收起 理由
    Nisy + 40 + 80 PYG有你更精彩!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 09:07
  • 签到天数: 51 天

    [LV.5]常住居民I

    发表于 2009-3-3 13:55:58 | 显示全部楼层
    下载下来看看
    PYG19周年生日快乐!
  • TA的每日心情

    2016-6-2 20:34
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2009-3-3 14:33:02 | 显示全部楼层
    学习一下,顺便下个软件来试用一下,习惯了ACDSEE
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-3-3 14:46:20 | 显示全部楼层
    下来学习,谢谢~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-3-3 14:54:15 | 显示全部楼层
    比较喜欢破文
    多谢分享
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-3-3 15:59:44 | 显示全部楼层
    看看牛人的文章·
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-3-3 17:41:52 | 显示全部楼层
    学习一下,不过注册机不完善,我的ID注册不成功,应该是五个注册名后的处理有点问题,修正下就完美了

    [ 本帖最后由 backboy 于 2009-3-3 18:07 编辑 ]
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-3-3 18:58:27 | 显示全部楼层
    哦?~学习学习喽~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-3-3 21:28:48 | 显示全部楼层
    来膜拜了/:good
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-3-3 21:57:45 | 显示全部楼层
    以前看过别人的算法分析  今天来学习下楼主的:loveliness:
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表