在智慧停车场项目中,摄像头车牌识别数据的加密传输是常见的安全要求。但当设备厂商提供的 SDK 文档不完整、技术支持响应缓慢时,集成方往往会陷入"有硬件、有数据、但读不懂"的困境。这个项目正是在这种背景下启动的:现场部署的臻识相机在开启加密模式后推送了 Base64 格式的密文车牌数据,而厂家没有提供 Linux 端的解密 SDK 文档和示例代码。如果无法解密,整个车场的车牌识别数据将不可用,涉及多条车道和上万条过车记录。项目中需要在没有源码、没有文档、没有厂家支持的情况下,从设备端提取解密能力,保障停车场业务系统的正常运行。
项目包含从协议分析到最终控制的全链路工具集。加密协议分析模块:从盒子端定位 libVzLPRSDK.so 原生库,通过 strings/nm 提取加密符号表(AesCtrDecrypt/GetEncryptKey/SetEncrypt 等),分析 Base64→AES→Base64 的加密流程。密钥提取模块:从运行进程的 /proc/pid/maps 中定位 g_key 全局变量地址,通过 /proc/pid/mem 读取 AES 密钥,并编写了多种密钥派生方式的尝试脚本。.NET 层分析模块:对盒子主程序 IOT.PARKING.SERVER.dll 进行 IL 字节码扫描,定位 C++/CLI 包装类 LprEncryptModule 的调用链。道闸控制模块:使用 Python ctypes 直接加载 libVzLPRSDK.so,调用 VzLPRClient_Open/SetIOOutputAuto 实现远程开关闸控制,无需重新编译 C++ 代码。配套产出了 7 个辅助工具:反汇编脚本、IL 扫描脚本、解密脚本框架、SSH 查询脚本、字符串提取脚本等。
我独立完成了这个项目的全部逆向分析工作。核心技术栈包括 Python(ctypes 调用原生库 + 反汇编 + 解密脚本)、反汇编工具(capstone + pyelftools)、.NET 分析(dnfile + pefile)、以及标准 Linux 调试工具链(nm/strings/gdb)。实现路线分为四层:第一层从盒子上提取 libVzLPRSDK.so 并下载到本地,用 strings/nm 定位加密相关的符号表,确认了 AES-CTR 解密函数和密钥派生函数的入口;第二层分析 .NET 主程序,定位 LprEncryptModule 类与原生库的 P/Invoke 调用关系,确认了加密模式配置为 VZ_LPRC_ACTIVE_ENCRYPT;第三层通过进程内存读取法尝试提取运行时的 g_key,获得了 16 字节的 AES 密钥样本;第四层编写 Python ctypes 绑定,直接调用原生库的开关闸接口,验证了 SDK 调用链的完整性。实现上的难点在于密钥是动态协商的而非静态派生——尝试了 4 种 PUID 派生方式(MD5/SHA256/ASCII/去横杠)均失败后,通过反汇编确认了密钥需要通过 HTTP 请求从相机 /login.php 协商获取,为后续完整解密指明了方向。
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!

下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态
评论