很是漂亮滴皮膚skin++ 終極破解之法

*[標題]:Skin++通用界面換膚系統V2.0.1破解探討html

*[做者]:gz1X <gz1x(at)tom(dot)com>程序員

*[來自]:中國黑客聯盟編程

*[前言]:windows

skin技術,你們都不會陌生,好比winamp,能夠靈活的更換界面風格。早期的實現定製的外觀方法都須要程序自己作許多處理,編碼太麻煩。app

後來出現了專門的Skin插件,ActiveSkin什麼的。再後來dll調用的skin軟件出現,須要Skin支持的程序調用幾個方法,就可使本身的程序外觀徹底改變,不須要編程者對skin技術有任何的瞭解。Skin++通用界面換膚系統V2.0.1就是其中比較出名的一款。函數

可是讓不少「貧民」用戶來講,要收費仍是比較讓人煩的。剛好我前幾天作了個小項目,順便用了下朋友推薦的這款軟件。網站

*[軟件原理分析]:ui

逆向了下這款軟件,由於這款軟件是商業軟件,沒方法獲得源代碼,因此我也是主觀的猜想。this

原理上基本上是這樣:編碼

經過消息鉤子來改變已有控件的外觀,函數原型是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,可是我想加點我的認爲有必要的東西:

一、使用的調試軟件:

    軟件:OllyICE

    下載連接:http://www.pediy.com/tools/Debuggers/ollydbg/OllyICE.rar

二、軟件的使用:

    入門可參考: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,保存,退出。

再試試,問題是否是已經解決?

相關文章
相關標籤/搜索