skin++ 是一款不错的换肤软件,通过它可以非常简单的让自己编写的程序有特别漂亮的界面,官方下载网站www.uipower.com,有试用版和正式版,试用版除了一些功能和售后服务有限制外,还经常在程序运行时弹出提示购买 正版的对话框,下面用两种方法去掉这个对话框。
一,编写监视弹出 提示框 的线程
道理其实很简单,当提示框弹出时,需要点取消关闭对话框,这正是我们觉得麻烦的,现在何不把这项工作交给程序自动完成。编写一个监视的线程,当这个对话框出现时,就瞬间点掉,由于时间特别短,给我们的感觉像它一直没出现一样,下面讲具体实现。
下在软件安装后,关键的几个文件就是:
SkinPPWTL.h
SkinPPWTL.lib
SkinPPWTL.dll
这里不多解释各文件的用法,相信大家都比较清楚,首先要把dll装入工程。
下面是程序代码:
void CGGApp::SetSkin(CString strSkinFile)
{
//Init skins.
//Find the skins file in the Skins directory.
KillSkinpp();
strSkinFile=m_strPath+"//Skins//"+strSkinFile;
BOOL bReg=skinppLoadSkin(strSkinFile.GetBuffer(strSkinFile.GetLength()));
strSkinFile.ReleaseBuffer();
}
void CGGApp::KillSkinpp()
{
DWORD dwThread;
HANDLE hThread=::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadKill,0,0,&dwThread);
CloseHandle(hThread);
}
DWORD CGGApp::ThreadKill(LPVOID lp)//注意!这个线程函数的声明是static的!
{
int iCount=0;
while (iCount++<10000)
{
Sleep(1);
HWND hWnd=::FindWindow(NULL,"UIPOWER");
if (hWnd==NULL) continue;
//
WPARAM wp=BN_CLICKED<<16 | IDNO;
::SendMessage(hWnd,WM_COMMAND,wp,0);
break;
}
return EXIT_SUCCESS;
}
首先在KillSkinpp()中启动一个监视线程,在线程函数ThreadKill中用FindWindow函数监视窗口UIPOWER(弹出的提示窗口标题)的出现,然后通过SkinPPWTL.dll中的函数skinppLoadSkin加载皮肤文件,当UIPOWER窗口出现时,将点击取消的消息wp=BN_CLICKED<<16 | IDNO通过SendMessage发出,完成点击取消。
二 用ollydbg反汇编SkinPPWTL.dll
弹出提示窗口的命令是在SkinPPWTL.dll中的函数skinppLoadSkin中出现的,现在通过反汇编将这个函数中的弹出代码屏蔽掉。
试用版中弹出弹出提示窗口的内容:“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 [email protected] you registering?”。在ollydbg中进入SkinPPWTL.dll模块,通过字符串参考查找,很容易就可将代码定位到下面这段:
10033126 /$ B8 F8650510 MOV EAX,SkinPPWT.100565F8
1003312B |. E8 F0E60100 CALL <JMP.&MSVCRT._EH_prolog>
10033130 |. 51 PUSH ECX
10033131 |. 51 PUSH ECX
10033132 |. 6A 04 PUSH 4
10033134 |. 6A 65 PUSH 65
10033136 |. 51 PUSH ECX
10033137 |. 8BCC MOV ECX,ESP
10033139 |. 8965 F0 MOV DWORD PTR SS:[EBP-10],ESP
1003313C |. 68 74120710 PUSH SkinPPWT.10071274 ; ASCII "UIPower : 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 [email protected] Are you registering skin++ now ?"
10033141 |. E8 52E9FCFF CALL SkinPPWT.10001A98
10033146 |. 8365 FC 00 AND DWORD PTR SS:[EBP-4],0
1003314A |. 51 PUSH ECX
1003314B |. 8BCC MOV ECX,ESP
1003314D |. 8965 EC MOV DWORD PTR SS:[EBP-14],ESP
10033150 |. 68 10030710 PUSH SkinPPWT.10070310 ; ASCII "UIPOWER"
10033155 |. E8 3EE9FCFF CALL SkinPPWT.10001A98
1003315A |. FF35 A8270710 PUSH DWORD PTR DS:[100727A8]
10033160 |. 834D FC FF OR DWORD PTR SS:[EBP-4],FFFFFFFF
10033164 |. E8 16F20000 CALL SkinPPWT.1004237F
10033169 |. 83C4 14 ADD ESP,14
1003316C |. 83F8 06 CMP EAX,6
1003316F |. 75 18 JNZ SHORT SkinPPWT.10033189
10033171 |. 6A 05 PUSH 5 ; /IsShown = 5
10033173 |. 6A 00 PUSH 0 ; |DefDir = NULL
10033175 |. 6A 00 PUSH 0 ; |Parameters = NULL
10033177 |. 68 5C120710 PUSH SkinPPWT.1007125C ; |FileName = "http://www.uipower.com"
1003317C |. 68 54120710 PUSH SkinPPWT.10071254 ; |Operation = "open"
10033181 |. 6A 00 PUSH 0 ; |hWnd = NULL
10033183 |. FF15 3C840510 CALL DWORD PTR DS:[<&SHELL32.ShellExecut>; /ShellExecuteA
10033189 |> 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
1003318C |. 64:890D 00000>MOV DWORD PTR FS:[0],ECX
10033193 |. C9 LEAVE
10033194 /. C3 RETN
从10033164 |. E8 16F20000 CALL SkinPPWT.1004237F跟进去就能看到有一个函数MessageBoxIndirect调用 ,为了防止弹出提示对话框,直接在这里nop掉。下面10033183 |. FF15 3C840510 CALL DWORD PTR DS:[<&SHELL32.ShellExecut>; 处的ShellExecuteA完成了向网站http://www.uipower.com的连接,可以直接跳过这段代码,将1003316F |. 75 18 JNZ SHORT SkinPPWT.10033189处改为JMP SHORT SkinPPWT.10033189,最后将修改后的文件保存即可。
虽然试用版通过上面的方法可以去掉一些限制,但如果您做商业开发的话,还是希望能支持正版软件,在官方网站http://www.uipower.com下载,谢谢!