(运维) 强制让不兼容 XP 的 Apache 2.4.39 工作在 XP 上

Posted by

on

Tutorials on how to get your Apache 2.4 works on your Windows XP and 2003

起因

笔者的一台服务器要到期了,实在无力续费,一位朋友允许我共享他的服务器,然而上面跑的是 Windows Server 2003 x86 (NT 5.2)。在这样一款老旧的系统下,想要愉快使用 Reverse Proxy,HTTP/2 等新技术时才发现,IIS6.0 直接淘汰,Apache 与 Nginx 均早已丢弃对 XP/2003 的支持。于是就想到破罐子破摔,强行让 Apache 跑起来。

步骤

1. 首先在 Apache Lounge(一个国外专门做 Apache Windows 二进制的第三方,现在其二进制文件已被 Apache 官方与 PHP Windows 官方所采纳,可以说很官方了) 下载截至目前最新版本的 Apache 2.4.39 x86 VC15。

Apache 2.4 Binaries
Apache 2.4 Binaries

2. 在目标系统上安装 Microsoft VC Runtime Redistributable(在微软官网下载)。

3. 假设已经写好所有的配置文件。

4. 直接运行 httpd.exe,发现提示 “不是有效的 Win32 应用程序”。按照笔者 2013 年所写的 《解决VC11程序在XP下“不是有效的Win32应用程序”问题》 的思路,对 Apache\bin 下的所有二进制文件的 PE 头进行修改(重点字段:MajorOperatingSystemVersion, MinorOperatingSystemVersion, MajorSubsystemVersion, MinorSubsystemVersion)这四个字段决定映像文件是否被允许在当当前 Windows 版本下运行。我们只要修改其版本为 5.1(XP) 或 5.2(2003)。

5. 其实到这边已经可以让 Apache 运行起来了,然而笔者因为配置了 mod_ssl 的原因,导致 Apache 无法启动。初步排查,系统提示“系统找不到指定的程序。”,对应 GetLastError(127)。推测是 mod_ssl.so, libssl, libcrypto 等依赖无法正确加载。

6. 通过 Dependency Walker 工具查找到原来是新版的 OpenSSL 库调用了 bcrypt.dll 中的 BCryptGenRandom()。很庆幸的是,OpenSSL 仅仅使用了这一个 API。根据 MSDN 对此 API 的原型:

NTSTATUS BCryptGenRandom( BCRYPT_ALG_HANDLE hAlgorithm, PUCHAR pbBuffer, ULONG cbBuffer, ULONG dwFlags );

第一个是算法句柄,第二个和第三个是输入缓冲区及其大小,最后一个是操作标志。笔者立即想到制作一个 Fake DLL,手动实现此 API。通过查阅资料,OpenSSL 在 1.1.x 系列开始,确实使用此 API 来获得随机数。

7. 在设置好 Fake DLL 后,Apache 已经成功运行起来了。It works!

参考

1. BCryptGenRandom function, MSDN, https://docs.microsoft.com/en-us/windows/desktop/api/bcrypt/nf-bcrypt-bcryptgenrandom

2. OpenSSL v0.9.8a随机数发生器分析之三——熵采集, CSDN, https://blog.csdn.net/samsho2/article/details/83510729


2 responses to “(运维) 强制让不兼容 XP 的 Apache 2.4.39 工作在 XP 上”

  1. 我认为应该强制让使用XP的运维更新系统才是正道

Leave a Reply

Your email address will not be published. Required fields are marked *