返回资讯中心
外部精选
软件工程
#开发者实时流

研究者用QEMU模拟L-1虹膜扫描仪,还原虹膜识别全流程

来源标题:L-1 Identity Solutions Pier 2.3 Emulation: How the Iris Scan Works

安全研究者Robert Zaage为L-1 Identity Solutions的PIER 2.3手持虹膜扫描仪编写了硬件模拟器,在QEMU中运行原版PR167.EXE。模拟器完整复现摄像头、FPGA帧抓取、LCD和键盘,演示了从开机、录入虹膜到次日重新识别的完整流程。他还发现Xilinx Spartan-II FPGA并未承担图像滤波、分割或小波变换等处理工作。

Hacker News 最新phirdev2026/11/7 · 今天24 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

2026-10-28 作者:Robert Zaage 阅读时长 13 分钟 #生物识别 #逆向工程 这是关于 SecuriMetrics / L-1 Identity Solutions PIER™ 2.3 手持式虹膜扫描仪三篇文章中的第三篇。 第一部分是硬件拆解,第二部分介绍其 CompactFlash 卡上的软件。 这篇文章讲的是扫描本身:图像如何从摄像头变成 IrisCode,以及设备如何判断它正在看的是谁。 为了不再拆开设备就能观察这个过程,我为 PIER 的硬件写了一个模拟器。 它在 QEMU 中运行卡上原始的、未经修改的 PR167.EXE,包括摄像头、FPGA 帧采集器、LCD 和键盘。 本文中的每一张屏幕截图都来自该模拟器。 视频展示了一个完整流程:开机,将一只眼睛注册为 "Jane Doe",关机,然后在第二天的新的会话中识别同一只眼睛。 启动过程加速了四倍;其余部分在模拟器中都是实时运行。 CPU 旁边是一颗 Xilinx Spartan-II XC2S100(见第一部分)。 在一台进行虹膜识别的设备中,我原本以为 FPGA 会承担繁重的图像处理工作:滤波、分割,或许还有用于生成 IrisCode 的小波变换。 但它这些都不做。 这颗 FPGA 是一个帧采集器。 它接收来自摄像头的像素流,以总线主控方式通过 PCI 将每一帧写入 CPU 的内存,然后发出中断。 这一点从固件中可以清楚看出(寄存器细节见下文): 固件中还包含开发者用于 FPGA 的 PCI 启动测试:目标测试和总线主控测试、向 FPGA 写入并读回的数据斜坡测试、中断测试以及吞吐量测试。 这些测试都不涉及图像处理。 事后看来,这是合理的。 XC2S100 有 2,700 个逻辑单元、40 Kbit(5 KB)的块 RAM,没有专用乘法器模块,只有一些进位逻辑可辅助用逻辑单元搭建乘法器。 一帧图像是 300 KB,所以 FPGA 连一帧都存不下;它的块 RAM 只够在数据发往 PCI 的途中缓冲几行。 Élan SC520 有 PCI 总线但没有摄像头接口,所以必须有东西把传感器的像素时钟转换成 PCI 写操作,而一颗小型 FPGA 是实现这一点的廉价方案。 其余一切都在 133 MHz Am5x86 核心上以软件方式运行,并利用其浮点单元。 应用程序的符号表展示了处理流水线:图像处理(IMGPROC)、瞳孔和虹膜定位(PUPCENTR、IRISLOCA)、眼睑检测(EYELIDSP、eyelidspline2pi)、对焦度量(FFOCUS、framefocus2pi、checkFocus)以及注册和识别工作流(GETICODE、XENROLL、XRECOG)。 编码和匹配核心是单独的 IRIS2PI.DLL,它导出 _TWOPI_ENROLL、_TWOPI_FOCUS 和 _TWOPI_RECOG(见第二部分)。 这些名称中的 "2pi" 与 L-1 对其算法的称呼相符,即 "L-1 Daugman 2Pi 算法"。 摄像头是第一部分中描述的 OV7120,一款 640 × 480 黑白传感器,配有 16 mm 镜头。 眼睛由两种近红外波长的 LED 照明(MACHINE.INI 中的 LedLow=780 和 LedHigh=860,单位大概是 nm)。 在近红外光下,即使是深棕色虹膜也会显现出纹理,而两个 LED 会在角膜上形成小的明亮反光。 当操作员按住 F2(或将手指放在触摸屏上)时,设备会将帧流式传输到 LCD,并对每一帧进行评估。 并非每次采集都会被接受。 在早期测试中,我的合成眼睛在虹膜和巩膜之间的对比度太低,模糊帧也太多。 设备随后在其调试串口(COM2)上打印 ENROLL: WEAK_LIMBUS 和 ENROLL: ERROR_POOR_FOCUS,显示 "Fail POOR IMAGES",然后自行重新开始。 固件中的其他失败消息还有 "LOW TEXTURE" 和 "TOO FEW IMAGES"。 配置表明最多采集六张图像为一组,并要求至少有张好图;这些设置在 NET167.INI 中被注释掉了,但预览等待的是三张。 软件从最佳帧中找到瞳孔、虹膜外缘(角膜缘)和眼睑。 在 Daugman 的方法中(L-1 的算法正是以此命名),虹膜环随后被展开成矩形("橡皮图" 归一化),并用二维 Gabor 小波进行滤波。 每个滤波器响应的符号成为 IrisCode 的一个比特;Daugman 的代码有 2,048 个这样的相位比特(256 字节),外加同样多的掩码比特,用于标记被眼睑、睫毛或反光遮挡的比特。 结果屏幕会在图像上绘制分割结果:围绕瞳孔和虹膜的圆圈。 要识别一个人,新的 IrisCode 会与每一个已存储的 IrisCode 进行比较。 度量标准是汉明距离:不同比特的比例,只统计在两个编码中都有效的比特,并在多个旋转角度中取最佳值,以容忍头部倾斜。 同一只眼睛的两张图像通常有 10–30% 的比特不同;不同眼睛的编码则大约有一半不同,就像抛硬币一样。 在 Daugman 2004 年的论文中,判定标准是 "略低于 0.33"。 在空数据库的情况下,注册 "Jane Doe" 的过程如下: 之后,卡副本上的两个数据库文件各自正好增加了一条记录:RECFIL1K.F02 中增加 128 字节(姓名、眼睛、ID),MASTER1K.F02 中增加 1,024 字节(虹膜模板,见第二部分)。 自软件版本 1.66 起,"长编码" 是默认设置(hhLongCodes=1);较早的短格式使用 64 字节记录。 我收到的这张卡运行在联机模式(hhTetheredMode=1)。 在该模式下,设备会跳过表单:注册以 "Enroll: SUCCESSFUL" 结束,但不会向卡中写入任何内容。 数据库文件的大小和日期保持不变,仅靠设备本身进行识别也找不到这个人。 据推测,主机 PC 会通过网络收集注册数据,使用第二部分中描述的协议。 为了进行演示,我在副本的 NET167.INI 中设置了 hhTetheredMode=0,这样设备就会询问人员数据并自行存储记录。

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →