找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 1572|回复: 0

Skin++通用界面换肤系统V2.0.1破解探讨

[复制链接]

253

主题

1490

回帖

2325

牛毛

二级牛人

88

积分
2355
发表于 2008-7-26 04:51:44 | 显示全部楼层 |阅读模式 来自 广东省广州市
*[前言]:
skin技术,大家都不会陌生,比如winamp,可以灵活的更换界面风格。早期的实现定制的外观方法都需要程序本身做许多处理,编码太麻烦。
后来出现了专门的Skin插件,ActiveSkin什么的。再后来dll调用的skin软件出现,需要Skin支持的程序调用几个方法,就可以使自己的程序外观完全改变,不需要编程者对skin技术有任何的了解。Skin++通用界面换肤系统V2.0.1就是其中比较出名的一款。
但是让很多“贫民”用户来说,要收费还是比较让人烦的。恰好我前几天做了个小项目,顺便用了下朋友推荐的这款软件。

*[软件原理分析]:
逆向了下这款软件,因为这款软件是商业软件,没方法得到源代码,所以我也是主观的猜测。
原理上基本上是这样:
通过消息钩子来改变已有控件的外观,函数原型是SetWindowsHookEx(WH_CALLWNDPROC, HookProc, 0, lThreadID);
这个函数就不多做解释了,查阅MSDN。设置类型为WH_CALLWNDPROC的HOOK。
然后是截获消息,当然不同控件发出的相同消息也是要分开处理的,简单的方法是得到窗口句柄,而通过窗口句柄得到窗口类,一般在HOOK的CALLBACK函数中可以获得。接下来就是消息处理,一般都是从截获WM_CREATE消息开始,再就是WM_PAINT,其他诸如鼠标消息之类的也是要处理的,就不再多说。但是这里的细节部分,比如钩子的记录,会出现很多烦琐的东西,解决方案是为窗口类型建立类,然后由实例去解决窗口消息的处理和窗口状态数据的记录。获得了窗口句柄以后,使用SetWindowLong技术将窗口句柄关联到窗口类上。并且可以根据窗口的风格让同一个类做出不同风格的显示效果。

具体的代码实现限于我的水平和时间问题,就不多做纠缠。

*[软件用法说明]:
到skin++的官方网站http://www.uipower.com去下载试用版。安装。
在VC平台下设置include和lib,tools\\options\\directory。也可以把SkinPPDemoSystem(VC)\\VCcases下的include和lib文件的文件拷贝到VC的对应目录。在project\\settings\\link里添上SkinPPWTL.lib 。
然后将DLL目录里的SkinPPWTL.dll拷贝到windows目录的system32目录下(注意这个是没破解的)。
生成project的时候,将Skins目录里的某张皮肤拷贝到项目目录下,然后在源代码里加上#include \"SkinPPWTL.h\",int CMainFrame::OnCreate或者CMFC_SkinApp::InitInstance下加上skinppLoadSkin(_T(\"xxx.ssk\"));即可。
详细的代码可以参考附带的demo。

如果不是正版用户,在生成可执行文件后运行会弹出对话框要求注册。下面我们就破解掉它。关键是对SkinPPWTL.dll的破解。

*[软件破解分析]:
这款软件好象保护不是很强,explorer \"http://www.uipower.com\"。我不太习惯叫这类弹出型限制为nag,呵呵。
SkinPPWTL.dll,一般没正式购买的版本会不厌其烦的弹出“Skin++ allows you to add skinning ability to your applications.For informationon obtaining a license to use this control,please visit www.uipower.com or e-mail sales@uipwer.com.Are you registering?”。
那我们破除它。

Copy code
10033097|. 68 7C120710PUSH skinppwt.1007127C;ASCII \"UIPower : ...?\"
1003309C|. E8 F7E9FCFFCALL skinppwt.10001A98
100330A1|. 8365 FC 00AND DWORD PTR SS:[EBP-4],0
100330A5|. 51PUSH ECX
100330A6|. 8BCCMOV ECX,ESP
100330A8|. 8965 ECMOV DWORD PTR SS:[EBP-14],ESP
100330AB|. 68 10030710PUSH skinppwt.10070310;ASCII \"UIPOWER\"
100330B0|. E8 E3E9FCFFCALL skinppwt.10001A98
100330B5|. FF35 A8270710PUSH DWORD PTR DS:[100727A8]
100330BB|. 834D FC FFOR DWORD PTR SS:[EBP-4],FFFFFFFF
100330BF|. E8 B7F10000CALL skinppwt.1004227B
100330C4|. 83C4 14ADD ESP,14
100330C7|. 83F8 06CMP EAX,6
100330CA|. 75 18JNZ SHORT skinppwt.100330E4
100330CC|. 6A 05PUSH 5; /IsShown = 5
100330CE|. 6A 00PUSH 0; |DefDir = NULL
100330D0|. 6A 00PUSH 0; |Parameters = NULL
100330D2|. 68 64120710PUSH skinppwt.10071264; |FileName = \"http://www.uipower.com\"
100330D7|. 68 5C120710PUSH skinppwt.1007125C; |Operation = \"open\"
100330DC|. 6A 00PUSH 0; |hWnd = NULL
100330DE|. FF15 3C840510CALL DWORD PTR DS:[<&SHELL32.ShellExecut>; \\ShellExecuteA
100330E4|> 8B4D F4MOV ECX,DWORD PTR SS:[EBP-C]
100330E7|. 64:890D 000000>MOV DWORD PTR FS:[0],ECX
100330EE|. C9LEAVE
100330EF\\. C3RETN



最让人讨厌的是这句:
100330BF|. E8 B7F10000CALL SkinPPWT.1004227B
跟进去就能看到是一个函数MessageBoxIndirect调用.
直接NOP掉。
接着看下面这个:
100330CA|. 75 18JNZ SHORT skinppwt.100330E4
jump掉:
100330CA. EB 18JMP SHORT SkinPPWT.100330E4
这里查找75 18的时候可以把上下文加上,这样:83 F8 06 75 18 6A 05然后替换为83 F8 06 EB 18 6A 05即可。
保存SkinPPWTL.dll。拷贝到两个地方:skin++安装目录的VCcases\\Bin目录下和windows目录的system32目录下。

*[软件服务破解]:
有了这个skin++,当然是需要更多皮肤了,而软件本身只提供了不到10张。而正版的用户才能下载官方网站上的皮肤。不管那么多,我到官方网站转了一圈,分析了下网站下载链接,发现了一个好玩的东西。可以通过下面的方法下载到更多的皮肤:
用迅雷新建批量下载任务,这样:
http://www.uipower.com/skindown/hit.asp?id=(*)
(*) 范围115-160。
下载...正常应该能拿到50多张皮肤...Enjoy!
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5用户社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-1-13 06:07 , Processed in 0.115562 second(s), 23 queries , Yac On.

Powered by Discuz! X3.5

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