[原创] 有些Windows软件的技术栈真的好老

有些Windows软件的技术栈真的好老

一个 2025 年 7 月发布的安装包,拆开一看,内核停留在 2008 年。

1、起因:只是想看看能不能搬到 Linux

事情很简单。我手上有一个 Windows 安装包 AxMath_Setup_Win_20250713_EN.exe(AxMath,一款小众的数学公式编辑器),我是它的正版注册用户,但我想着能不能在Ubuntu下,用非Wine的方式、非虚拟机的方式使用它呢?这就涉及把它移植到Ubuntu的问题了——如果它是基于Electron之类跨平台的框架开发的,那还真有可能。

文件名里写着 20250713,也就是 2025 年 7 月发布的版本。

所以就把它拆包看看。

2、拆开之后:考古现场

安装包是 NSIS 自解压格式,用 7z 一把就解开了:

7z x AxMath_Setup_Win_20250713_EN.exe -o extracted

里面的东西很有意思:

AxMath.exe        主程序
AxSnap.exe        截图/OCR 工具
Register.exe      授权注册
AxLaTeX.dll       LaTeX 渲染
AxBDH.dll         Office 桥接
Microsoft.VC90.MFC/mfc90u.dll      ← 注意这个
gdiplus.assembly/GdiPlus.dll
libeay32.dll / ssleay32.dll / libcurl.dll

Microsoft.VC90.MFC 这个目录名就是线索:VC90 = Visual C++ 2008。也就是说,这个 2025 年的软件,跑在 2008 年的运行时上。
文章来源:https://www.codelast.com/

再用 objdump 一验,实锤:

项目 实测值 含义
PE 架构 PE32 (x86) 32 位
MajorLinkerVersion 9.0 Visual Studio2008 的链接器
附带运行库 mfc90u.dll MFC 9.0 = VC++ 2008
主程序时间戳 2025-07-13 编译日期很新
捆绑 OpenSSL 1.0.2d(2015-07-09) 早已 EOL
捆绑 libcurl 7.45.0(2015) 十年前的东西

一边是 2025 年的时间戳,一边是 2008 年的工具链和 2015 年的第三方库。

3、2025年的软件版本竟然还是32位的

很多人的第一反应是:2025年的版本还是32位的?但对这类软件来说,这几乎是必然的。

3.1 迁移成本和收益不成比例 一个 MFC 老代码库要从 32 位迁到 64 位、从 VC9 迁到新工具链,构建脚本、第三方依赖、COM 注册……全都得动。而 32 位程序在 64 位 Windows 上靠 WOW64 照样跑,用户完全无感,对小软件团队来说没动力迁移。

3.2 Office 加载项的"位数枷锁" AxMath 的核心价值是嵌进 Word / Excel / WPS。它的 COM 组件必须和宿主 Office 的位数一致,而 32 位 Office / WPS 装机量巨大——跟着做 32 位最省事。解包里能看到一堆加载项:

AxMath.dotm   → Word(含 VBA 宏)
AxMath.xlam   → Excel
AxMath.ppam   → PowerPoint
WPS/STARTUP/AxMath.dotm → WPS

3.3 轻量应用根本用不上 64 位的好处 一个公式编辑器,内存占用远不到 2GB。64 位最大的优势(大内存寻址)在这儿毫无意义。
文章来源:https://www.codelast.com/

4、安全问题

技术栈老,本身只是"不优雅"。但当我们把范围从"好不好看"换成"安不安全",问题就严肃了。

4.1 授权走的是明文 HTTP Register.exe 里的联网地址是(注意是 UTF-16 宽字符存的,普通搜索搜不到):

http://www.axmath.cn:6150/@@@     ← 授权服务器
http://121.199.3.143:6150/@@@     ← 硬编码备用 IP

激活码、机器指纹,就这么明文发出去了。在公共 WiFi 下,同网段的攻击者抓个包就能拿到激活码——不需要任何漏洞利用技巧。

4.2 2015 年的 OpenSSL 1.0.2d 这个版本之后修的所有 CVE 它都带着。比如 CVE-2016-2107(AES-NI padding oracle),中间人可以利用它解密 HTTPS 会话——也就是说,"用了 HTTPS"在这个版本上并不等于安全。

4.3 承载漏洞的库没开内存防护

文件 DllCharacteristics 含义
Register.exe 0x8140 ASLR + DEP
libcurl.dll 0x0140 ASLR + DEP
libeay32.dll 0x0000 无 ASLR、无 DEP

名词解释:

  • ASLR(Address Space Layout Randomization,地址空间布局随机化):每次程序启动时,把代码、数据、DLL 等加载到随机的内存地址。这样攻击者就无法预知某个函数或数据的固定地址,构造可靠的利用会变得困难。
  • DEP(Data Execution Prevention,数据执行保护,即 NX):把内存里的数据区标记为"不可执行"。即使攻击者把恶意代码写进了内存,CPU 也会拒绝执行它,从而挡掉一大类"写入即执行"的攻击。

一旦 libcurl(7.45.0 存在越界写类漏洞,如 CVE-2016-8617)或 OpenSSL 触发内存破坏,这个"裸奔"的 DLL 会让利用门槛大幅降低。
文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤ 
转载需注明出处:codelast.com 
感谢关注我的微信公众号(微信扫一扫):
wechat qrcode of codelast
以及我的微信视频号:

发表评论