- 积分
- 165
- 最后登录
- 2024-3-24
- 精华
- 0
- 阅读权限
- 20
- 主题
- 63
- UID
- 2944778
- 帖子
- 218
- PB币
- 241
- 威望
- 13
- 贡献
- 0
- 技术
- 13
- 活跃
- 976
- UID
- 2944778
- 帖子
- 218
- PB币
- 241
- 贡献
- 0
- 技术
- 13
- 活跃
- 976
|
发表于 2021-12-8 09:56:49
IP属地浙江
|显示全部楼层
本帖最后由 laomms 于 2021-12-9 17:01 编辑
之前说过通过修改mui文件达到去除一些预览版显示字样。但是随着Windows版本越来越高,传统的修改MUI文件方法已经无效。今天再深入讨论下。我们并没有去破坏、修改、JH、传播什么的,只是了解下它的过程,纯粹自己玩。理解本文章需要一定的编程基础。
请勿使用多线程下载工具下载论坛附件!
一、LoadStringW函数
windows在窗体上显示的字符串大部分是从mui文件里提取,比如上面的① 里面,就是winver.exe的同名文件winver.exe.mui里提取。
请勿使用多线程下载工具下载论坛附件!
怎么取呢,就是通过user32.dll里的一个函数LoadStringW,可以去MSDN了解下这个函数的具体定义,各个参数分别代表什么。
比如我要取出101中的"Windows",通过代码实现就是:
- wchar_t lpBuff[128];
- HINSTANCE handle = LoadLibraryW(L"C:\\Windows\\System32\\zh-CN\\winver.exe.mui");
- int ret = LoadStringW(handle,101,lpBuff,128);
复制代码 这个lpBuff缓冲就是放读取到"Windows"字样。
知道这个原理,我们就可以对一些不想要的字符串进行拦截处理。比如这里,当读取资源102的时候,把"评估副本,过期时间"给清空掉。
拦截方法大致是这样,具体代码看我的github。
- int WINAPI myLoadStringW(HINSTANCE hInt, UINT uid, LPWSTR lpBuffer, int sizeBuffer)
- {
- int res= DLoadStringW(hInt, uid, lpBuffer, sizeBuffer);
- if (uid == 102)
- {
- memset(lpBuffer, '\0', sizeBuffer);
- }
- return res;
- }
复制代码 memset就是用来清空当读到资源id102的时候的内容。
二、BrandingFormatStringForEdition函数
图中的②处的一整套字符串也是通过上面的LoadStringW从shell.dll.mui中读取。
请勿使用多线程下载工具下载论坛附件!
但是与上面不同的是这里带了个变量:"%WINDOWS_LONG%",这个就是用来获取Windows版本名称的。从哪里来的呢,通过调试发现是从winbrand.dll的函数BrandingFormatStringForEdition调用而来。
过程就是:上代码
- wchar_t lpBuffer[128] = L"%WINDOWS_LONG%";
- wchar_t* result = BrandingFormatStringForEdition)(lpBuffer, EditionId, 128);
复制代码 这里的EditionId就是平时说的skuid,版本ID,你想显示什么都可以在这个EditionId上动手脚。
但这里只是想把"Insider Preview"字样去掉:
- wchar_t* WINAPI myBrandingFormatStringForEdition(const wchar_t* lpBuffer, int EditionId, unsigned int size)
- {
- wchar_t* res = pBrandingFormatStringForEdition(lpBuffer, EditionId, size);
- if (wcsstr(res, L" Insider Preview") != 0)
- {
- //省略替换的代码
- }
- return res;
- }
复制代码 类似的还有"%MICROSOFT_COMPANYNAME% %WINDOWS_GENERIC%"、"%WINDOWS_COPYRIGHT%"等等。
三、去除过期时间字样
剩下就是图中的③,日期加时间。
与时间有关的函数就那么几个:FileTimeToSystemTime、FileTimeToLocalFileTime、GetTickCount、GetDateFormat、GetTimeFormat这些。
不管它的通过什么算法获取过期时间或者怎么判断系统当前是否已经过期,你总得定义输出的格式。只要把GetDateFormat、GetTimeFormat拦住,你怎么修改格式都可以。甚至消除掉:
- int WINAPI myGetDateFormatW(LCID Locale, DWORD dwFlags, const SYSTEMTIME* lpDate, LPCWSTR lpFormat, LPWSTR lpDateStr, int cchDate)
- {
- int res = DGetDateFormatW(Locale, dwFlags, lpDate, lpFormat, lpDateStr, cchDate);
- memset(lpDateStr, '\0', cchDate);
- return res;
- }
复制代码
大致就是这样。设置界面中的系统版本显示原理跟这个差不多。
通过拦截的方法我更新了下"去除水印及弹窗"工具:
去除水印及弹窗1.3.zip
(1.22 MB, 下载次数: 58)
|
-
2
查看全部评分
-
|