有些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
感谢关注我的微信公众号(微信扫一扫):

以及我的微信视频号:
