skin++ 終極破解之法

來源:互聯網
上載者:User

*[標題]: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.