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

一个 2025 年 7 月发布的安装包,拆开一看,内核停留在 2008 年。
1、起因:只是想看看能不能搬到 Linux
事情很简单。我手上有一个 Windows 安装包 AxMath_Setup_Win_20250713_EN.exe(AxMath,一款小众的数学公式编辑器),我是它的正版注册用户,但我想着能不能在Ubuntu下,用非Wine的方式、非虚拟机的方式使用它呢?这就涉及把它移植到Ubuntu的问题了——如果它是基于Electron之类跨平台的框架开发的,那还真有可能。
文件名里写着 20250713,也就是 2025 年 7 月发布的版本。
所以就把它拆包看看。
文章来源:https://www.codelast.com/
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.dlllibeay32.dll / ssleay32.dll / libcurl.dllMicrosoft.VC90.MFC 这个目录名就是线索:VC90 = Visual C++ 2008。也就是说,这个 2025 年的软件,跑在 2008 年的运行时上。
再用 objdump 一验,实锤:
| 32 位 | ||
| 9.0 | ||
mfc90u.dll | ||
| 2025-07-13 | ||
| 1.0.2d(2015-07-09) | ||
| 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 → ExcelAxMath.ppam → PowerPointWPS/STARTUP/AxMath.dotm → WPS3.3 轻量应用根本用不上 64 位的好处一个公式编辑器,内存占用远不到 2GB。64 位最大的优势(大内存寻址)在这儿毫无意义。
文章来源:https://www.codelast.com/
4、安全问题
技术栈老,本身只是"不优雅"。但当我们把范围从"好不好看"换成"安不安全",问题就严肃了。
4.1 授权走的是明文 HTTPRegister.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 承载漏洞的库没开内存防护
Register.exe | ||
libcurl.dll | ||
libeay32.dll | 0x0000 | 无 ASLR、无 DEP |
名词解释:
ASLR(Address Space Layout Randomization,地址空间布局随机化):每次程序启动时,把代码、数据、DLL 等加载到随机的内存地址。这样攻击者就无法预知某个函数或数据的固定地址,构造可靠的利用(尤其是 ROP 链)会变得困难。 DEP(Data Execution Prevention,数据执行保护,即 NX):把内存里的数据区标记为"不可执行"。即使攻击者把恶意代码写进了内存,CPU 也会拒绝执行它,从而挡掉一大类"写入即执行"的攻击。
一旦 libcurl(7.45.0 存在越界写类漏洞,如 CVE-2016-8617)或 OpenSSL 触发内存破坏,这个"裸奔"的 DLL 会让利用门槛大幅降低。
文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤
转载需注明出处:codelast.com
感谢关注我的微信公众号(微信扫一扫):

以及我的微信视频号: