Office 2016 KMS激活参考

与Windows最大的区别是,MSDN上下载的零售版镜像不能通过安装密钥的方式切换到VL版,而是需要导入.xrm-ms文件。

参考激活命令:

cd “C:\Program Files (x86)\Microsoft Office\Office16″
cscript ospp.vbs /unpkey:BTDRB
cscript ospp.vbs /inslic:”..\root\Licenses16\ProPlusVL_KMS_Client-ppd.xrm-ms”
cscript ospp.vbs /inslic:”..\root\Licenses16\ProPlusVL_KMS_Client-ul.xrm-ms”
cscript ospp.vbs /inslic:”..\root\Licenses16\ProPlusVL_KMS_Client-ul-oob.xrm-ms”
cscript ospp.vbs /inpkey:XQNVK-8JYDB-WJ9W3-YJ8YR-WFG99
cscript ospp.vbs /sethst:<<YOUR KMS SERVER HOST>>
cscript ospp.vbs /act

红米4X安装Apps2SD记录

1、解锁
按官网流程说明,在开发者选项里绑定小米账号。如果提示网络异常,将小米云的查找手机关掉再试一下。

2、线刷开发版
MIUI官网的下载中心近一个月一直再维护,从论坛找的开发版的镜像。
卡刷试了下不行,验证不通过,说是必须要最新版。
但其实后面最后还是刷了SuperSU,这样来看其实稳定版也能ROOT,可以省下备份、恢复系统设置和APP的过程。

3、开启ROOT、解锁system分区
授权管理中开启ROOT,adb root && adb disable-verity

4、安装Apps2SD、内存卡分区
我直接电脑用DiskGenius把FAT32调小,剩余空间建一个linux native分区表项,然后到Apps2SD里格式化成ext3。

5、移动APP
移动了apk、odex、data。外部data不移动,因为虚拟sd卡是fat32,符号链接重启后会出问题。个人把会从网上下载很多资源占用空间比较大的但不是很常用的APP移到了SD卡,例如各种视频APP、各种购物APP。

6、自动软重启
授权管理自启动开启Apps2SD系统唤醒,Apps2SD设置里开启未挂载时自动软重启。这样重启手机后不用手动进去点remount和重启,因为目前的系统没有找到其他能用的方式可以在开机时运行init.d脚本。所以最后强迫症,所以决定刷SuperSU用su.d方式加载。

7、线刷TWRP
要刷论坛的版本。官网最新版本无法自动解密data分区。论坛版本中有批处理,自己fastboot手打也可以。

8、SuperSU
论坛的版本patch boot失败,要刷官网最新版。官网下载链接挂了,找别的网站下个md5相同的,进TWRP刷入。
然后Apps2SD就可以用su.d的方式开机自动mount了。

参考资料:
http://www.miui.com/thread-8205780-1-1.html
http://www.miui.com/thread-12033397-1-1.html
https://blog.csdn.net/u010150437/article/details/54744454
https://twrp.me/xiaomi/xiaomiredmi4x.html
http://www.supersu.com/download

Chrome disable-directwrite-for-ui补丁

Chrome从版本41开始强制启用directwrite ui,ui界面包括主菜单、地址栏、书签栏等不再使用点阵宋体渲染,如果系统是windows classical主题,这些地方的字体会严重发虚。

通过在chrome的快捷方式中指定–disable-directwrite-for-ui启动参数可以解决这个问题。但如果是其他程序打开浏览器的第一个实例,就没法应用这个参数。同理,基于chrome的atom、visual studio code等electron应用,通常都是通过关联文件而不是快捷方式启动,所以依然会悲剧,观感非常难受,如下图。

今天决定彻底干掉这个问题。方法很容易想到,通过劫持一个dll进行注入,然后改掉GetCommandLine返回的结果。研究chrome的依赖dll后决定选择DWrite.dll进行劫持,就像游戏外挂都喜欢用d3d9.dll注入一样,优点是它们都是只需要转发一个函数即可。d3d9是Direct3DCreate9,DWrite是DWriteCreateFactory。

代码:

#include <Windows.h>

static void* pDWriteCreateFactory;

extern "C" __declspec(dllexport) __declspec(naked) void DWriteCreateFactory()
{
	__asm jmp dword ptr [pDWriteCreateFactory];
}

BOOL WINAPI DllMain(HMODULE, UINT uReason, LPVOID)
{
	if (uReason == DLL_PROCESS_ATTACH)
	{
		WCHAR path[MAX_PATH];
		GetSystemDirectoryW(path, sizeof(path));
		lstrcatW(path, L"\\DWrite.dll");
		HMODULE hModule = LoadLibraryW(path);
		pDWriteCreateFactory = GetProcAddress(hModule, "DWriteCreateFactory");

		static WCHAR commandLine[4096];
		lstrcpyW(commandLine, GetCommandLineW());
		lstrcatW(commandLine, L" --disable-directwrite-for-ui");

		BYTE* code = (BYTE*)&GetCommandLineW;
		DWORD protect = PAGE_EXECUTE_READWRITE;
		VirtualProtect(code, 6, protect, &protect);
		code[0] = 0xB8;
		*(WCHAR**)&code[1] = commandLine;
		code[5] = 0xC3;
		VirtualProtect(code, 6, protect, &protect);
	}
	return TRUE;
}

下载:

DWrite.zip

用法:

放置到chrome内核所在的目录即可。Chrome浏览器放到chrome.dll的目录(目录名是版本号的,非chrome.exe目录),vscode等electron应用放置到exe所在目录。

 

效果:

关于最近的勒索病毒,以及Windows月度汇总更新

近日闹出了基于MS17-010的勒索病毒,公司网络侥幸没中招,但还是吓得老老实实先关了445端口。

我给别人家装系统一般是会开自动更新的,但自己装系统却不怎么喜欢开,尽管我自己就是搞安全的。主要因为我自己重装系统通常是比较频繁的,而Windows7 SP1是2011发布的,6年积累的更新有两百余个,如果通过自动更新来装,按我的几百k网速和推送的尿性,估计几天都装不下来,这还不考虑公司的网络有限速机制,检测到下载流量直接封网。如果是下载一些网站打包好的合集(例如下载吧),那么你很快会发现,同时安装太多的更新会导致windows installer记录回滚状态的链表(我怀疑的)消耗高达数10G的内存,并且安装到后期每进行一步操作都要CPU满转几分钟才能在这个超级链表上加上一记录。

微软显然也意识到这个问题,所以Win10的策略是9个月滚一个版本,同时每月发布一个累积更新包。去年10月开始,Win7也引入了这个策略,根据微软官方博客上介绍,新的更新包会包含上个月的内容,博客上还说,他们会逐渐将历史补丁也加进来,也就是说未来只需要在baseline(也就是win7 sp1)上打一个当月最新的更新包就好了。

实际测试发现,首先2016年10月以后的所有补丁肯定在这个包里包含了,因为新策略实施后没有别的发布通道。但之前发布过的许多补丁还是能被windows update刷出来。也许是被逐步替换的,也就是某个文件,比如内核ntoskrnl,某年出了一个bug,然后微软通过一个补丁刷了一个版本号,然后16年10月之后的某一天又爆出一个bug,微软再刷一次版本号,那么新补丁就相当于包含了旧补丁。但对于相对“无关紧要”的文件,汇总更新里就没有,还是以单独的补丁包提供。

另外我查看了几个单独的补丁,bug标志都是“重要”,而汇总更新的标志是“严重”(critical)。个人看下来,如果一个bug是本地溢出,通常需要下载到一些特殊的文件才会触发,就会被标“重要”,而如果是远程溢出,例如smb、iis这些,能够快速通过网络传染,那就真的是躺着都能中枪,这种就会标为“严重”。

所以个人觉得,如果是需要快速重装系统,又担心被远程攻击,可以手动安装当前最新的月度安全质量汇总,把critical级别的先补上。其余的散包优先级稍低,可以交给自动更新慢慢补上。

希望微软能早日将历史上所有的补丁包都集成到月度更新中。

使用SVN让WordPress升级时合并定制的更改

因为实在是受不了阿里云每天推送wordpress有各种漏洞,决定还是尽量把wordpress升到最新版本。但个人对wordpress的代码进行过多处的修改(例如文章id复用、评论模板、主题修改等),直接升级就会被覆盖掉。所以决定引入版本管理。

服务器上直接安装TortoiseSVN,安装时建议选中命令行工具,这样就可以直接用svnserve开服务从远程连接,无需再安装VirtualSVN。

先考虑一下我们的逻辑。我的blog最后一次手动更新的版本是4.2.1,当前最新的版本为4.7.3。通常来说的逻辑应该是将当前正在跑的版本与4.2.1比对得出我自己修改过的差异,然后覆盖安装4.7.3,最后把我修改过的差异打到新版本上。方法就是先来diff一下生成patch文件,然后直接升级,最后来应用patch。

不过我们可以从反方向的角度来考虑这个问题,即将我自己修改的网站看作trunk,将wordpress官方4.2.1到4.7.3的(大范围的)更改看作分支,将这个修改集合并到我这边的主干上。这样考虑就可以很方便地用svn来进行了。以下为参考步骤。

1、创建一个仓库。建立一个/trunk/main,用于存放当前的网站。
2、建立一个/vendor/wordpress/current,下载4.2.1解压进去,提交。
3、svn复制current里的所有文件到main,更新工作集。
4、服务器上checkout当前的main,但不覆盖现有的文件,这样直接提交,将网站上的内容覆盖到main,这样main里就有了我修改过的内容。
5、删除current里的所有文件,下载4.7.3解压进去,执行一下添加所有文件,提交(乌龟会检查需要删除的文件,但未版本的文件要手动添加),这样current就滚到了最新。
6、到main里执行merge。merge来源为current,合并范围为从第2步之后current的rev,到head。这之后main就刷到了4.7.3,并且保留了我自己的更改。可能会有部分文件冲突需要手工合并。然后提交。
7、服务器上update最新的main。浏览器访问wp-admin升级数据库。

以后再遇到更新时,就直接将新版本替换到current里,然后将更改合并到main里。想方便的话还可以做个钩子让提交时服务器自动update。

20171129 4.7.3 to 4.9记录:
1、checkout current,下载4.9解压进去,执行添加所有文件(结果刚才忘了,合并后wordpress少文件打不开了),commit。
2、直接拿iis目录当working目录执行merge,来源为current,范围写current上一次的rev(刚刚commit之前的rev)到head。因为上次搞乱了line ending,选上忽略换行符合并。
3、合并顺利完成,访问正常,提交trunk。

参考文献:http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html

WordPress SSL证书登陆(Windows IIS环境)

0x00:主要是三个原因:

1、wp-login.php天天被刷密码,之前一段时间一直被迫加了一层windows登陆验证。
2、不想经常输wordpress的密码了。
3、SSL研究实验。

0x01:申请证书

自签证书虽然是可行的,但自慰并不好,也不符合安全签发标准。这里选用cacert.org给我签发了一张email证书。cacert.org是一家数十年历史的非营利组织,力求让每个人能够使用上PKI安全体系,但因为其非免费签发的性质,根证书并未得到商业系统的承认。

同时搜索到comodo签发免费的email的证书,也去申请了一张,但发现证书用途中只有电子邮件加密,没有客户端认证,故无法运用在SSL中。

如果有读者知道哪家机构还能签发免费的email兼客户端认证证书,希望能在评论中分享,不胜感激。

0x02:Windows Server设置

SSL协议中请求客户端证书时,服务端会向客户端发送一个CA的列表,只有列表中出现的CA签发的证书才会在浏览器证书选择对话框中显示。这点很重要,开始一直不明白为什么电脑上装好的证书浏览器没有提示就报证书验证失败。

另外,需要设置IIS不检查证书吊销列表,因为CACert的吊销列表太大了,网不好经常访问不到导致IIS返回403。

cscript c:\inetpub\adminscripts\adsutil.vbs set w3svc/网站ID/certcheckmode 1
(设为1为不检查吊销,0为检查)

需要做的是把cacert的根证书导入服务器,需要注意导入的是本机存储区而不是用户存储区,所以不能直接双击导入或使用certmgr.msc导入,而要打开一个空的mmc,添加管理单元时选择本地计算机。

最后就是在IIS中把wp-login.php设为接受客户端证书。

0x03:PHP部分

用phpinfo可以看到,$_SERVER[‘CERT_SUBJECT’]存放了证书使用者的信息,我们提取其中email字段即可。

以wordpress插件的形式写一段简单的代码:(参考了client-certificate-authentication插件的代码)

add_filter('authenticate', 'cert_authenticate');

function cert_authenticate($user, $username, $password)
{
	if (preg_match('/E=([^,]+)/', $_SERVER['CERT_SUBJECT'], $matches))
	{
		$email = $matches[1];
		$user = get_user_by('email', $email);
		if ($user)
			return $user;
	}
	wp_die('You must provide a certificate to login.');
}

0x04:安全性

只用验证证书中的email就可以登陆是否安全?也就是说是否存在伪造证书的可能?

上面已经提到,必须是存在于服务端CA列表中的信任机构签发的证书才能够识别,所以安全性依赖于是否有CA在签发email证书时出现漏洞,未成功验证邮箱所有权就给冒充者颁发了证书。之前wosign就被查出了类似的问题(未严格验证域名所有权就颁发了ssl证书)。

所以只要保持服务端根证书列表的权威性即没有什么大的问题。如果需要更安全,也可以在PHP中验证$_SERVER[‘CERT_ISSUER’]中的颁发机构,强制使用特定一家签发的证书。

证书风波

昨天登陆blog发现证书已在11月11日过期,随后前往wosign寻找DV证书却发现wosign不再签发免费证书。只好等下班后上startssl再看看(只有家里的电脑有startssl的登陆证书)。

最近上海出境网络又变坏了,换了好几个代理好不容易签下来,看到一行提示,大意是google已决定不再信任startcom的根证书并将于明年1月发布的新版chrome中生效。

网上搜了下相关信息才知道wosign涉嫌违规签发证书遭到调查,mozilla、google、apple停止信任wosign10月21号之后签发的证书并可能在未来完全屏蔽wosign的ca。又由于调查发现wosign之前秘密收购了其上级签发机构startcom,故startcom也受到了牵连。

所以说涉及到国际安全标准,国内机构的办事还是不值得相信。有兴趣的可以去搜一下详细的事件调查。

后来无意中了解到aliyun提供免费的symantec dv证书,就去申请了下。申请入口在云盾分类里的证书服务。

需要填写一些地址、电话等个人信息,然后通过dns验证一下域名所属。设置dns后,大概一小时后自动签发,有效期一年。

另外据说mozilla、cisco等数十家大佬赞助的let’s encrypt项目也很不错,为全面推广ssl而创立。开源,全自动验证、签发,不过为了吊销安全考虑有效期最长只有90天。linux下可以上脚本自动搞,不过我是windows,暂时没精力去研究了。

 

A simple .NET coroutine framework

(测试Evernote同步到wordpress)

(测试Evernote同步到wordpress)

public static class Coroutine
{
    private static List< IEnumerator > coroutines = new List< IEnumerator >();

    private static bool Step( IEnumerator coroutine)
    {
        IEnumerator inner = coroutine.Current as IEnumerator;
        if (inner != null && Step(inner))
            return true ;
        return coroutine.MoveNext();
    }

    public static IEnumerator Wait( Func <bool > condition)
    {
        while (!condition()) yield return null ;
    }

    public static void Start( IEnumerator coroutine)
    {
        coroutines.Add(coroutine);
    }

    public static void Update()
    {
        for (int i = 0; i < coroutines.Count; ++i)
        {
            if (!Step(coroutines[i]))
                coroutines.RemoveAt(i--);
        }
    }
}

Visual C++ 6.0 Enterprise with SP6 绿色精简版

Visual C++ 6.0 Enterprise SP6 绿色精简版
by gmsj0001 (http://lxf.me)

精简说明:
1、安装自英文原版VSE600ENU1.ISO(微软官方没有出中文版)
2、已集成SP6,版本号6.0.9782,解决停止调试不能结束进程的BUG(这次是真的,不是网上那个骗人的龙卷风版)
3、纯绿色,只打包了安装目录,没有打包和注册任何安装到C盘的COM库,有需要用到且系统没自带的需要手动安装一下
4、需要运行一下System.exe自解压包,里面是要扔到系统目录下的调试版CRT、MFC的DLL
4、去除了CRT、MFC源代码
5、去除了CRT单线程库、CRT、MFC静态库,仅保留动态库链接方式(因为各系统均自带MSVCRT.dll、MSVCP60.dll、MFC42.dll)
6、修正VCVARS32.bat中的绝对路径为相对路径
7、修改IDE字体、默认创建对话框字体为宋体9pt

压缩包仅17mb,欢迎各位玩家测试。

下载地址:http://lxf.me/www/upload/vc6_sp6_lite.7z

关于IIS6下PHP使用header设置404但实际返回200的坑

起因是发现wordpress所有该404的地方全部返回的是200,记得以前处理过一次,但服务器重新配置后又这样了,也忘了当时怎么修好的。

然后发现,自己写一个php文件用header(‘HTTP/1.1 404 Not Found’)也是无效的,经过几小时测试,偶然发现header(‘Status: 404 Not Found’)是有效的。

进一步偶然发现php.ini中的cgi.rfc2616_headers被改为了1,而默认值是0。这个值是1的话php会发送HTTP/1.1这样的文字来设置状态。显然,iis6+fastcgi并不能很好的支持。

然而为什么会手贱改为1呢,再一搜索发现是网上的iis+fastcgi+php+mysql教程全部说要改为1,这些教程都是从一个地方复制粘贴的,很多年前是照着这个教程配置的服务器。

也就是说,网上的教程是错的!网上的教程是错的!网上的教程是错的!

这个坑非常难排查!直接搜iis php header 404 200等关键字是搜不出来的!以上发现改成Status就有效和观察到ini被改过都是偶然发现的!

特此记录。