PE下桌面主题使用技巧解读
程序员文章站
2022-06-02 14:51:43
PE下桌面主题使用技巧解读windows下更换主题相信大家都会,但在PE下使用桌面主题对大家来说,或许就有点难度了,下面为大家介绍个小技巧,大家可以参考下... 14-04-01...
在正常windows下更换主题相信大家也会了,但在pe下使用桌面主题大家应该就没见过吧。下面一起来操作一下吧。
先看看原理:winlogon启动后先初始化一些全局变量,检测hkey_local_machinesystemsetup下的systemsetupinprogress是否为零,如果是正常启动,如果为1,则在启动系统服务samss时告诉它不要管sam数据库,启动一些必要的服务后,比如services,lsass,然后就启动hkey_local_machinesystemsetup下由cmdline指定的程序,等待程序结束,重启或者关机。如果systemsetupinprogress == 1,则初始化系统服务后调用msgina.dll登录xp。msgina.dll 在初始化时调用shsvcs.dll产生一个themesstartevent系统级事件,代码如下:
#define themewatchforstart_ordinal 1
#define themewaitforserviceready_ordinal 2
typedef dword (_stdcall *pfn_themewaitforserviceready)(dword dwtimeout);
typedef bool (_stdcall *pfn_themewatchforstart)(void);
hmodule hshsvcs = loadlibrary(_t("shsvcs.dll"));
if( hshsvcs != null )
{
pfn_themewaitforserviceready pfthemewait
= (pfn_themewaitforserviceready)getprocaddress( hshsvcs, (lpcstr)themewaitforserviceready_ordinal);
pfn_themewatchforstart pfthemewatch
= (pfn_themewatchforstart)getprocaddress( hshsvcs,(lpcstr)themewatchforstart_ordinal);
if( pfthemewait != null &&
pfthemewatch != null )
{
pfthemewait(1000);
pfthemewatch();
}
closehandle(hshsvcs);
}
那位同学说了:“把systemsetupinprogress直接改成0不就得了!”
lsass告诉你:“此路不通!重启吧你”
我告诉你:“我们可以改一改winlogon,让它先启动msgina或是直接调用shsvcs就行了。”
themesstartevent事件是出来了,怎么?还不行!
那是因为还有个家伙在捣乱:sxs.dll。他会在系统要求它调用指定dll时用fusionpareweinossetupmode函数进行判断systemsetupinprogress是否为零,如果为1,它就会告诉系统:“我那个什么......先歇会儿再说。”
然而系统要实现themes,恰恰需要它去找到合适的comctl32.dll。
你可以修改它,但是合适的dll在哪里?
这种概念是从微软的.net framework的gac引入的。每当应用程序要求合适的dll时,系统会调用sxs.dll在%systemroot%winsxs
文件夹中寻找,当有多个相同文件时,它就查看c:windowswinsxsmanifests以c:windowswinsxspolicies中的规则来调用相应的文件。
———————————————————————————————————————————————————
动手了:
1、启用themes需要以下文件:修改版的winlogon调用msgina.dll或直接修改minlogon(xpe feathure pack 2007 中有此文件),winlogon,msgina.dll,shsvcs.dll,activeds.dll,,uxtheme.dll,themeui.dll,sxs.dllc:windowswinsxsmanifests文件夹中的(对应sp3)
x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83.cat
x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83.manifest
c:windowswinsxspoliciesx86_policy.6.0.microsoft.windows.common-controls_6595b64144ccf1df_x-ww_5ddad775
文件夹下的
6.0.2600.5512.cat
6.0.2600.5512.policy
c:windowswinsxsx86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83
文件夹下的
comctl32.dll
还有一些windows文件夹system32下的文件,自己研究吧。(用depends工具找一找文件的依赖关系)
2、修改文件。(均已sp3的文件为例)使用ultraedit打开文件,winlogon.exe 查找af46ffff85c07512,将最后的12改为27,查找
56e8151d000056 ff7614e8fc,修改为56e8151d000056 e8bc91ffff(看清了,只修改最后五位);打开sxs.dll查找530079007300740065006d005300650074007500700049006e00500072006f00670072006500可以看到s.e.t.u.p.i.n.p.r.o.g.r.e.s.s的字样,把最后的s改成t,即73改成74。
修改pe的注册表,在systemsetup下比照着systemsetupinprogress新建一个reg_dword值systemsetupinprogrest,设为0。特别注意要修改services.exe中的systemsetupinprogress为systemsetupinprogrest。
同时测试了基于bartpe的xpe硬盘版,因为xpe使用自己的pegina.dll重新进入sas序列,所以无法启用主题。
———————————————————————————————————————————————————
上传一个修改过的minlogon,切记修改注册表。对了,最重要的是别忘了加上你自己的主题文件,它们一般在windowsresources文件夹下。传了一个压缩的,是用我心如水的pe做的(hhh333的也不错,不过他的是sp2的,测试不方便),我重新上传一个精简过文件的is_文件,可直接替换我心如水里面的winpe.is_
1、修改的注册表,添加了一些键值,比如对dx8游戏的支持;
2、修改为支持双核,理论上能在p4以上单核上启动;
3、自动检测硬件,安装驱动。(必须有相应的inf和驱动文件)
今天上传了一个自己用的img格式的内核,根据站长的研究使主题自动开启。其中添加了vc2005的运行库,内置nv显示驱动,配合外置的dx9可以玩现在的新游戏了。
有一个小问题,墙纸不能自动加载是因为windows只认bmp格式的图片,jpg格式的要转换成bmp。把你需要的墙纸转换成bmp,然后再修改hkey_current_usercontrol paneldesktop下的wallpaper路径指向你自己的图片。
先看看原理:winlogon启动后先初始化一些全局变量,检测hkey_local_machinesystemsetup下的systemsetupinprogress是否为零,如果是正常启动,如果为1,则在启动系统服务samss时告诉它不要管sam数据库,启动一些必要的服务后,比如services,lsass,然后就启动hkey_local_machinesystemsetup下由cmdline指定的程序,等待程序结束,重启或者关机。如果systemsetupinprogress == 1,则初始化系统服务后调用msgina.dll登录xp。msgina.dll 在初始化时调用shsvcs.dll产生一个themesstartevent系统级事件,代码如下:
#define themewatchforstart_ordinal 1
#define themewaitforserviceready_ordinal 2
typedef dword (_stdcall *pfn_themewaitforserviceready)(dword dwtimeout);
typedef bool (_stdcall *pfn_themewatchforstart)(void);
hmodule hshsvcs = loadlibrary(_t("shsvcs.dll"));
if( hshsvcs != null )
{
pfn_themewaitforserviceready pfthemewait
= (pfn_themewaitforserviceready)getprocaddress( hshsvcs, (lpcstr)themewaitforserviceready_ordinal);
pfn_themewatchforstart pfthemewatch
= (pfn_themewatchforstart)getprocaddress( hshsvcs,(lpcstr)themewatchforstart_ordinal);
if( pfthemewait != null &&
pfthemewatch != null )
{
pfthemewait(1000);
pfthemewatch();
}
closehandle(hshsvcs);
}
那位同学说了:“把systemsetupinprogress直接改成0不就得了!”
lsass告诉你:“此路不通!重启吧你”
我告诉你:“我们可以改一改winlogon,让它先启动msgina或是直接调用shsvcs就行了。”
themesstartevent事件是出来了,怎么?还不行!
那是因为还有个家伙在捣乱:sxs.dll。他会在系统要求它调用指定dll时用fusionpareweinossetupmode函数进行判断systemsetupinprogress是否为零,如果为1,它就会告诉系统:“我那个什么......先歇会儿再说。”
然而系统要实现themes,恰恰需要它去找到合适的comctl32.dll。
你可以修改它,但是合适的dll在哪里?
这种概念是从微软的.net framework的gac引入的。每当应用程序要求合适的dll时,系统会调用sxs.dll在%systemroot%winsxs
文件夹中寻找,当有多个相同文件时,它就查看c:windowswinsxsmanifests以c:windowswinsxspolicies中的规则来调用相应的文件。
———————————————————————————————————————————————————
动手了:
1、启用themes需要以下文件:修改版的winlogon调用msgina.dll或直接修改minlogon(xpe feathure pack 2007 中有此文件),winlogon,msgina.dll,shsvcs.dll,activeds.dll,,uxtheme.dll,themeui.dll,sxs.dllc:windowswinsxsmanifests文件夹中的(对应sp3)
x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83.cat
x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83.manifest
c:windowswinsxspoliciesx86_policy.6.0.microsoft.windows.common-controls_6595b64144ccf1df_x-ww_5ddad775
文件夹下的
6.0.2600.5512.cat
6.0.2600.5512.policy
c:windowswinsxsx86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83
文件夹下的
comctl32.dll
还有一些windows文件夹system32下的文件,自己研究吧。(用depends工具找一找文件的依赖关系)
2、修改文件。(均已sp3的文件为例)使用ultraedit打开文件,winlogon.exe 查找af46ffff85c07512,将最后的12改为27,查找
56e8151d000056 ff7614e8fc,修改为56e8151d000056 e8bc91ffff(看清了,只修改最后五位);打开sxs.dll查找530079007300740065006d005300650074007500700049006e00500072006f00670072006500可以看到s.e.t.u.p.i.n.p.r.o.g.r.e.s.s的字样,把最后的s改成t,即73改成74。
修改pe的注册表,在systemsetup下比照着systemsetupinprogress新建一个reg_dword值systemsetupinprogrest,设为0。特别注意要修改services.exe中的systemsetupinprogress为systemsetupinprogrest。
同时测试了基于bartpe的xpe硬盘版,因为xpe使用自己的pegina.dll重新进入sas序列,所以无法启用主题。
———————————————————————————————————————————————————
上传一个修改过的minlogon,切记修改注册表。对了,最重要的是别忘了加上你自己的主题文件,它们一般在windowsresources文件夹下。传了一个压缩的,是用我心如水的pe做的(hhh333的也不错,不过他的是sp2的,测试不方便),我重新上传一个精简过文件的is_文件,可直接替换我心如水里面的winpe.is_
1、修改的注册表,添加了一些键值,比如对dx8游戏的支持;
2、修改为支持双核,理论上能在p4以上单核上启动;
3、自动检测硬件,安装驱动。(必须有相应的inf和驱动文件)
今天上传了一个自己用的img格式的内核,根据站长的研究使主题自动开启。其中添加了vc2005的运行库,内置nv显示驱动,配合外置的dx9可以玩现在的新游戏了。
有一个小问题,墙纸不能自动加载是因为windows只认bmp格式的图片,jpg格式的要转换成bmp。把你需要的墙纸转换成bmp,然后再修改hkey_current_usercontrol paneldesktop下的wallpaper路径指向你自己的图片。