skin++ 终极破解之法
*[标题]:Skin++通用界面换肤系统V2.0.1破解探讨
*[作者]:gz1X <gz1x(at)tom(dot)com>
*[来自]:中国黑客联盟
*[前言]:
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 [url]www.uipower.com[/url] or e-mail sales@uipwer.com.Are you registering?”。
那我们破除它。
[code]
10033097 |. 68 7C120710 PUSH skinppwt.1007127C ; ASCII "UIPower : ...?"
1003309C |. E8 F7E9FCFF CALL skinppwt.10001A98
100330A1 |. 8365 FC 00 AND DWORD PTR SS:[EBP-4],0
100330A5 |. 51 PUSH ECX
100330A6 |. 8BCC MOV ECX,ESP
100330A8 |. 8965 EC MOV DWORD PTR SS:[EBP-14],ESP
100330AB |. 68 10030710 PUSH skinppwt.10070310 ; ASCII "UIPOWER"
100330B0 |. E8 E3E9FCFF CALL skinppwt.10001A98
100330B5 |. FF35 A8270710 PUSH DWORD PTR DS:[100727A8]
100330BB |. 834D FC FF OR DWORD PTR SS:[EBP-4],FFFFFFFF
100330BF |. E8 B7F10000 CALL skinppwt.1004227B
100330C4 |. 83C4 14 ADD ESP,14
100330C7 |. 83F8 06 CMP EAX,6
100330CA |. 75 18 JNZ SHORT skinppwt.100330E4
100330CC |. 6A 05 PUSH 5 ; /IsShown = 5
100330CE |. 6A 00 PUSH 0 ; |DefDir = NULL
100330D0 |. 6A 00 PUSH 0 ; |Parameters = NULL
100330D2 |. 68 64120710 PUSH skinppwt.10071264 ; |FileName = "http://www.uipower.com/"
100330D7 |. 68 5C120710 PUSH skinppwt.1007125C ; |Operation = "open"
100330DC |. 6A 00 PUSH 0 ; |hWnd = NULL
100330DE |. FF15 3C840510 CALL DWORD PTR DS:[<&SHELL32.ShellExecut>; /ShellExecuteA
100330E4 |> 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
100330E7 |. 64:890D 000000>MOV DWORD PTR FS:[0],ECX
100330EE |. C9 LEAVE
100330EF /. C3 RETN
最让人讨厌的是这句:
100330BF |. E8 B7F10000 CALL SkinPPWT.1004227B
跟进去就能看到是一个函数MessageBoxIndirect调用.
直接NOP掉。
接着看下面这个:
100330CA |. 75 18 JNZ SHORT skinppwt.100330E4
jump掉:
100330CA . EB 18 JMP 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!
上面是网友gz1X写的部分,我试验了,破解很成功,达到了去掉每次启动程序都弹出的询问注册的CMessageDialog,但是我想加点个人认为有必要的东西:
1、使用的调试软件:
软件:OllyICE
下载链接:http://www.pediy.com/tools/Debuggers/ollydbg/OllyICE.rar
2、软件的使用:
入门可参考:http://hi.baidu.com/hack1015/blog/item/877eef2426bd43034c088d12.html
选择打开要破解的SkinPPWTL.dll文件之后按上述步骤完成修改之后,就有一个保存修改的问题,我在使用的时候找遍了整个菜单栏,硬是没有发现有保存修改这个项的存在,后来发现操作方法如下:
a.被修改处右击,选择“复制到可执行文件”,选择“所有修改”
b.出现提示框“把选中的内容复制到可执行文件”,选择“全部复制”
c.弹出一个新的窗口,直接点X,关闭该子窗口,提示“文件已更改”,选择“是”,再弹“另存为”框,此时不要做任何修改,切记不可改文件名,接着提示“文件已存在”,问是否覆盖,点“是”,覆盖原文件,关闭OllyICE,打完收功。
到此,对于达到最终目的来说,软件的这些操作已经足够,但程序使用后依然存在一个严重问题:程序所有窗口的标题栏右边都有“SKIN++ UNREGISTERED!!!”字样,这样对于一个程序员来说,无异于没做,然而网友gz1X没有将此问题完善。经过调试,终于成功破解,操作步骤如下:
a.在反汇编窗口中右击,出来一个菜单,我们在 查找->所有参考文本字串 上左键点击
b.现在出来另一个对话框,我们在这个对话框里右击,选择“查找文本”菜单项,输入“SKIN++ UNREGISTERED!!!”(注意这里查找内容要区分大小写)来查找,找到一处,位置在 008DACE2.
c.在此行,汇编指令为:push 00920784,这条指令用于将“SKIN++ UNREGISTERED!!!”所在的内存地址传递给子程序,我们只需要将这个地址修改一下就可以改变显示的字符了,这个字符串一共22个字符,压栈的地址最后两位84+22=A6,于是我们将这条指令改为:push 009297A6,保存,退出。
再试试,问题是不是已经解决?
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pbe_sedm/archive/2008/06/12/2538048.aspx
skin++ 终极破解之法的更多相关文章
- 非常漂亮滴皮肤skin++ 终极破解之法
破解includeparametershook汇编windows *[标题]:Skin++通用界面换肤系统V2.0.1破解探讨 *[作者]:gz1X <gz1x(at)tom(dot)com&g ...
- 【Xamarin挖墙脚系列:Xamarin的终极破解步骤(更新)】
前面文章中,我们可以找到对应版本的补丁. Xamarin的 4.0.1717 版本,在补丁的地址中,有作者整理的全部的安装包.迅雷磁力贴: magnet:?xt=urn:btih:9FD298AA61 ...
- IntelliJ IDEA 终极破解
1. 下载破解补丁(JetbrainsCrack-2.6.10-release-enc.jar): http://idea.lanyus.com/jar/JetbrainsCrack-2.6.10-r ...
- 意法STM32F1系列MCU单片机解密芯片破解复制
意法STM32F1系列MCU单片机解密芯片破解复制 STM32F1系列MCU芯片解密: STM32F100解密 | STM32F101解密 | STM32F102解密 | STM32F103解密 | ...
- 怎样破解邮箱password
破解邮箱password怎样破解邮箱password邮箱在我们的生活中日益成为一个不可或缺的角色.公司与公司之间的商贸往来,学生与老师间的学习交流,以及占非常大部分的私人信件的往来等等非常难离开它.但 ...
- 当面对会反制遭破解装置的App该如何顺利提取数据
在检测App的过程之中,总会遇到比较棘手的,以”侦测是否遭破解的装置”为例,便会是个不好处理的状况.当App具备侦测装置是否已遭Root时,一旦发现装置已遭破解,便会停止运行,等于是只准安装及运行在未 ...
- 极验验证码破解之selenium
这一篇写完很久了,因为识别率一直很低,没办法拿出来见大家,所以一直隐藏着,今天终于可以拿出来见见阳光了. 哈喽,大家好,我是星星在线,我又来了,今天给大家带来的是极验验证码的selenium破解之法, ...
- 1 Winform 异步更新控件
刚才看到有人问为了winfrom中,在大数据绑定的时候出现画面假死的状态,为了解决这个问题希望通过再开一个线程来给控件绑定数据,可是画面还是会假死.现在看到的方法有1.掩耳盗铃法(Control.Ch ...
- 龙杰ACR122S NFC读卡器
龙杰智能卡有限公司(ACS,龙杰智能卡控股有限公司之全资附属公司,香港联交所上市编号:8210)创立于1995年,是亚太地区第一大.全球三大智能卡读写器供应商之一.ACS被<福布斯亚洲>杂 ...
随机推荐
- 杭州电子科技大学Online Judge 之 “确定比赛名次(ID1285)”解题报告
杭州电子科技大学Online Judge 之 "确定比赛名次(ID1285)"解题报告 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozh ...
- BZOJ 1296: [SCOI2009]粉刷匠( dp )
dp[ i ][ j ] = max( dp[ i - 1 ][ k ] + w[ i ][ j - k ] ) ( 0 <= k <= j ) 表示前 i 行用了 j 次粉刷的机会能正 ...
- BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )
最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...
- 经典阅读-《Effective C++》Item1:视C++为一个联邦语言
C++已经是个多重范型编程语言(multiparadigm programming language),一个同时支持过程形式(procedural).面向对象形式(object-oriented).泛 ...
- uncompyle2 windows安装和使用方法
uncompyle2是Python 2.7的反编译工具,它可以把python生成的pyo.pyc字节码文件反编译为十分完美的源码,并可以将反编译后的源码再次生成字节码文件! ----- 本文介绍在wi ...
- 03-C语言编码规范和变量
目录: 一.C语言的编码规范 二.变量 三.浮点型float 四.变量名命名规则 五.变量作用域与生命周期 回到顶部 一.C语言的编程规范 1 语句可以分开放在任意位置 2 空格可以让代码更清晰 3 ...
- 闲来无事写写-Huffman树的生成过程
前言:最近项目上一直没事干,感觉无聊到了极点,给自己找点事做,补一下大学没有完成的事情,写一个huffman算法Java版的,学校里面写过c语言的. 因为很久没搞数据结构和算法这方面了(现在搞Java ...
- ubutu下的几个命令
nginx重启命令 (ps:意为将nginx重启) /usr/local/nginx/sbin/nginx -s reload 给new目录权限设置为777 (ps:意思为将wwwroot/new目录 ...
- 使用HISTCONTROL强制history忽略某条特定命令
http://www.linuxnote.org/mandatory-use-of-histcontrol-ignore-a-certain-specific-command-history.html ...
- kinect for windows - DepthBasics-D2D详解之三
这篇文章我们将总结一下,之前两篇文章中提到的Kinect SDK的函数接. 函数接口: NuiGetSensorCount: 获取连接的Kinect设备个数 原型:_Check_return_ HRE ...