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