夜雨聆风学习资料网

ARTICLE · 1099847

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

有些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.dll

Microsoft.VC90.MFC 这个目录名就是线索:VC90 = Visual C++ 2008。也就是说,这个 2025 年的软件,跑在 2008 年的运行时上。

再用 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   → ExcelAxMath.ppam   → PowerPointWPS/STARTUP/AxMath.dotm → WPS

3.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 承载漏洞的库没开内存防护

文件
DllCharacteristics
含义
Register.exe
0x8140
ASLR + DEP
libcurl.dll
0x0140
ASLR + DEP
libeay32.dll0x0000无 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

感谢关注我的微信公众号(微信扫一扫):

以及我的微信视频号:

相关学习资料