首页
社区
课程
招聘
[分享][讨论]也来调戏SkinSharp
发表于: 2011-10-29 00:23 6485

[分享][讨论]也来调戏SkinSharp

2011-10-29 00:23
6485
目前见到最好用的轻量级换肤库就要数SkinSharp了,一键换肤而且体积很小,效果也很不错。
开源的duilib虽然看着很强大,但是不能一键换肤,不支持对MFC程序换肤等诸多不便。
上次看了“『原创』调戏 SkinSharp”: http://bbs.pediy.com/showthread.php?t=132247,
能够不用释放dll就能使用其功能,觉得挺好的。
但是这样做有两点不足,第一:稳定性和兼容性有待考究;第二:严重误报。

其实还有一种方法,就是使用静态库。但是skinsharp作者的静态库是出售的,并不免费提供。
于是就下载了个dll2lib来转换之,dll2lib提供了一个很好的思想:既然功能都在dll里面,那么一定能够生成一个静态库最终链接到exe中。

注:这里说的不是网上说的那个DUMPBIN,LIB生成导入库的,这里是生产静态库。
以下说说详细步骤:
1)下载dll2lib:http://www.binary-soft.com/download.htm

2)下载SkinSharp,http://www.skinsharp.com/htdocs/tar/SkinH_VC.rar

3)对SkinH.dll脱壳,壳是upx的,我试了304以上版本的upx.exe都能脱之。

4)使用dll2lib转换脱壳后的SkinH.dll,“Link Options”中去掉“-defaultlib:LIBC”。
转换LOG:
Start conversion.
Preparing for the conversion...
Convert DLL file into object files...
Warning 13: Invalid address reference(00000000) found. If the DLL has been compressed or encrypted, 
please uncompress or decrypt it before converting.
Bind object files to static library files.
Conversion finished.

完了会生产SkinH.lib和SkinH_supp.h文件。

5)打开Demo\SkinSharpDemo中的SkinSharpDemo.dsw项目,这里要稍作修改项目属性,
修改“MFC 使用”为“在共享 DLL 中使用 MFC”,“代码生产”为“多线程调试 DLL (/MDd)”,Release版本为“多线程调试 DLL (/MD)”。
添加头文件SkinH_supp.h包含,修改链接库为上一步生产的SkinH.lib。

6)在代码CSkinSharpDemoApp::InitInstance()中添加:
	// Initialize the library
	SKINH_DllMain(GetModuleHandle(NULL), DLL_PROCESS_ATTACH, NULL);
	SkinH_Attach();

上面的SKINH_DllMain调用是为了让shinsharp进行初始化处理,因为原来的初始化代码是在DllMain中完成的。

7)编译,成功后运行SkinH_VC\Bin下的SkinSharpDemo.exe,效果图:

但是后面就运行出错了,后来分析了很久也没找到原因,也就是在SKINH_DllMain中调用初始化代码里面出错的,估计与第4步骤中的景观有关系:
Warning 13: Invalid address reference(00000000) found. If the DLL has been compressed or encrypted, please uncompress or decrypt it before converting.

8)OD载入SkinSharpDemo.exe,找到弹出MessgeBox的相关代码,发现一个对call调用异常。
0045556E    E8 32080100     call    [B]00465DA5[/B]


[COLOR="Red"][/COLOR]
[COLOR="Red"]00465C64[/COLOR]| 50                    | push    eax                                       |这里才应该是函数头
00465C65| 51                    | push    ecx                                       |
00465C66| 52                    | push    edx                                       |
00465C67| 53                    | push    ebx                                       |
00465C68| 54                    | push    esp                                       |
00465C69| 55                    | push    ebp                                       |
00465C6A| 56                    | push    esi                                       |
00465C6B| 57                    | push    edi                                       |
00465C6C| 33C0                  | xor     eax, eax                                  |
00465C6E| BF 1C1B4800           | mov     edi, 00481B1C                             |
00465C73| 8107 4B5F606A         | add     dword ptr [edi], 6A605F4B                 |
00465C79| 8187 04000000 175D6C65| add     dword ptr [edi+4], 656C5D17               |
00465C83| 8187 08000000 5A6B6066| add     dword ptr [edi+8], 66606B5A               |
00465C8D| 8187 0C000000 6517606A| add     dword ptr [edi+C], 6A601765               |
00465C97| 8187 10000000 175E5C65| add     dword ptr [edi+10], 655C5E17              |
00465CA1| 8187 14000000 5C69586B| add     dword ptr [edi+14], 6B58695C              |
00465CAB| 8187 18000000 5C5B1759| add     dword ptr [edi+18], 59175B5C              |
00465CB5| 8187 1C000000 70175865| add     dword ptr [edi+1C], 65581770              |
00465CBF| 8187 20000000 176C6569| add     dword ptr [edi+20], 69656C17              |
00465CC9| 8187 24000000 5C5E606A| add     dword ptr [edi+24], 6A605E5C              |
00465CD3| 8187 28000000 6B5C695C| add     dword ptr [edi+28], 5C695C6B              |
00465CDD| 8187 2C000000 5B176D5C| add     dword ptr [edi+2C], 5C6D175B              |
00465CE7| 8187 30000000 696A6066| add     dword ptr [edi+30], 66606A69              |
00465CF1| 8187 34000000 6517665D| add     dword ptr [edi+34], 5D661765              |
00465CFB| 8187 38000000 173B4343| add     dword ptr [edi+38], 43433B17              |
00465D05| 8187 3C000000 176B6617| add     dword ptr [edi+3C], 17666B17              |
00465D0F| 8187 40000000 43605918| add     dword ptr [edi+40], 18596043              |
00465D19| 8187 44000000 04010401| add     dword ptr [edi+44], 1040104               |
00465D23| 8187 48000000 4B661769| add     dword ptr [edi+48], 6917664B              |
00465D2D| 8187 4C000000 5C5E606A| add     dword ptr [edi+4C], 6A605E5C              |
00465D37| 8187 50000000 6B5C6917| add     dword ptr [edi+50], 17695C6B              |
00465D41| 8187 54000000 70666C69| add     dword ptr [edi+54], 696C6670              |
00465D4B| 8187 58000000 175A6667| add     dword ptr [edi+58], 67665A17              |
00465D55| 8187 5C000000 7017665D| add     dword ptr [edi+5C], 5D661770              |
00465D5F| 8187 60000000 173B4343| add     dword ptr [edi+60], 43433B17              |
00465D69| 8187 64000000 176B6617| add     dword ptr [edi+64], 17666B17              |
00465D73| 8187 68000000 43605923| add     dword ptr [edi+68], 23596043              |
00465D7D| 8187 6C000000 1767635C| add     dword ptr [edi+6C], 5C636717              |
00465D87| 8187 70000000 586A5C17| add     dword ptr [edi+70], 175C6A58              |
00465D91| 8187 74000000 6D606A60| add     dword ptr [edi+74], 606A606D              |
00465D9B| 8187 78000000 6B310401| add     dword ptr [edi+78], 104316B               |
[COLOR="Red"]00465DA5[/COLOR]| 8187 7C000000 006E6E6E| add     dword ptr [edi+7C], 6E6E6E00              |函数却从这里调进,肯定不对
00465DAF| 8187 80000000 25596065| add     dword ptr [edi+80], 65605925              |
00465DB9| 8187 84000000 58697024| add     dword ptr [edi+84], 24706958              |
00465DC3| 8187 88000000 6A665D6B| add     dword ptr [edi+88], 6B5D666A              |
00465DCD| 8187 8C000000 255A6664| add     dword ptr [edi+8C], 64665A25              |
00465DD7| 8187 90000000 2666695B| add     dword ptr [edi+90], 5B696626              |
00465DE1| 8187 94000000 5C69255F| add     dword ptr [edi+94], 5F25695C              |
00465DEB| 8187 98000000 6B640401| add     dword ptr [edi+98], 104646B               |
00465DF5| 8187 9C000000 6669175A| add     dword ptr [edi+9C], 5A176966              |
00465DFF| 8187 A0000000 66656B58| add     dword ptr [edi+A0], 586B6566              |
00465E09| 8187 A4000000 5A6B3104| add     dword ptr [edi+A4], 4316B5A               |
00465E13| 8187 A8000000 01006A58| add     dword ptr [edi+A8], 586A0001              |
00465E1D| 8187 AC000000 635C6A37| add     dword ptr [edi+AC], 376A5C63              |
00465E27| 8187 B0000000 59606558| add     dword ptr [edi+B0], 58656059              |
00465E31| 8187 B4000000 6970246A| add     dword ptr [edi+B4], 6A247069              |
00465E3B| 8187 B8000000 665D6B25| add     dword ptr [edi+B8], 256B5D66              |
00465E45| 66:8187 BC000000 5A66 | add     word ptr [edi+BC], 665A                   |
00465E4E| 8087 BE000000 64      | add     byte ptr [edi+BE], 64                     |
00465E55| 80BF C0000000 00      | cmp     byte ptr [edi+C0], 0                      |
00465E5C| 74 07                 | je      short 00465E65                            |
00465E5E| B8 01000000           | mov     eax, 1                                    |
00465E63| EB 19                 | jmp     short 00465E7E                            |
00465E65| C687 C0000000 01      | mov     byte ptr [edi+C0], 1                      |
00465E6C| 57                    | push    edi                                       |
00465E6D| 68 30200000           | push    2030                                      |
00465E72| 6A 00                 | push    0                                         |
00465E74| 57                    | push    edi                                       |
00465E75| 6A 00                 | push    0                                         |
00465E77| FF15 1C464800         | call    dword ptr [<&USER32.MessageBoxA>]         |USER32.MessageBoxA
00465E7D| 5F                    | pop     edi                                       |
00465E7E| 83E0 01               | and     eax, 1                                    |
00465E81| B9 BF000000           | mov     ecx, 0BF                                  |
00465E86| B0 09                 | mov     al, 9                                     |
00465E88| FC                    | cld                                               |
00465E89| F3:AA                 | rep     stos byte ptr es:[edi]                    |
00465E8B| 5F                    | pop     edi                                       |
00465E8C| 5E                    | pop     esi                                       |
00465E8D| 5D                    | pop     ebp                                       |
00465E8E| 5C                    | pop     esp                                       |
00465E8F| 5B                    | pop     ebx                                       |
00465E90| 5A                    | pop     edx                                       |
00465E91| 59                    | pop     ecx                                       |
00465E92| 58                    | pop     eax                                       |
00465E93| C3                    | retn                                              |




可以看出
0045556E    E8 32080100     call    [B]00465DA5[/B]
应该是:
0045556E    E8 32080100     call    [B]00465C64[/B]


修改后重新运行SkinSharpDemo.exe,效果图:

是dll2lib的试用提示,紧接着就出错了:


我最终还是没能修复好,猜测很可能是在dll2lib转换那一步出的问题,但是网上又找不到相关的工具转行dll到lib。
我把代码什么的放在附件里,大家一起研究下吧,希望能够更进一步!
SkinH_VC.rar

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//