拓冰建站拓冰建站
首页 / 资讯中心 / 正文

IT8519 EC固件逆向实战:从EC.rar到8051反汇编与看门狗分析

简介本资源为ITE公司IT8519型号嵌入式控制器EC的完整固件开发工程包面向汽车电子、工业控制领域的嵌入式工程师及ECU固件维护人员用于ECU底层驱动开发、故障诊断代码分析与固件升级调试。压缩包含444个文件总大小2.52MB涵盖170个头文件h、115个目标文件o、68个C源码c、15个可执行工具exe及配套批处理bat、汇编s、链接脚本org、Makefilemak等构成典型的ECU交叉编译工程结构内容预览显示存在oemcfg.c.bak、libchip.a、LIBHFP.A等核心模块表明包含OEM配置层、芯片驱动库与通信协议栈。目前已有610人学习下载可直接用于IT8519平台固件逆向分析、错误码映射对照、启动流程梳理及多项目兼容性验证是理解ITE系列EC架构与实操调试的重要参考工程。 EC这个东西平时基本没人会注意它但你要搞笔记本维修、主板设计或者固件分析早晚得跟它打交道。最近我手上拿到一个名为“EC.rar”的工程包从文件名看就是一个 EC 相关的代码/固件集合里面涉及 IT8519、ITE EC、EC code 这些关键词。实际上这名字是个典型的上传者随手命名的包想要靠一个文件名搞清楚里面的东西不现实但反过来想IT8519 是联阳ITE一颗非常常见的 EC 控制芯片如果摸清它的固件结构、地址空间和信息提取套路不管是分析一个 RAR 包里的文件还是从 BIOS 升级包里拆 EC 固件都能少走不少弯路。这篇文章我会从“拿到一个 EC 相关资源包之后怎么办”这个实际场景切入把 IT8519 和 ITE 系 EC 的架构、固件形态、寄存器入口、典型功能比如看门狗以及反汇编分析这些事一次讲透。适合正在做 EC 固件逆向、笔记本主板维修、BIOS 定制或者是想搞懂“EC 到底在干什么”的开发者。1. IT8519 这类 EC 芯片在整个主板里管什么很多人会把 EC 和 Super I/O 搞混这不怪大家因为 ITE 自己的产品线就横跨这两个方向。IT8519 是一颗面向笔记本和平板类产品的 Embedded Controller而 IT8786E / IT8728F 这类主要是台式机主板上的 Super I/O。前者跑固件程序后者更多是靠寄存器配置完成固定功能。但 EC 和 SIO 在物理上都挂在 LPC 或 eSPI 总线上用的端口访问方式也非常接近所以网上资料经常串。EC 全称 Embedded Controller它的职责一句话概括在主机 CPU 还没起来的时候先把整个平台的“后勤系统”管起来。具体包括这几大块电源时序控制适配器插入检测、电池充放电、开机按键触发、S5/S3/S0 状态切换。温控策略读 CPU/主板热敏电阻的 ADC 值根据温度调风扇 PWM。键盘矩阵扫描笔记本内置键盘每一行每一列都由 EC 直接扫描按键事件由 EC 上报给系统。电池管理和电池内部的电量计芯片通信SMBus/I2C把电量、充放电状态汇报给 ACPI 层。ACPI 嵌入式控制器接口操作系统通过标准化的 EC 端口通常 0x62/0x66读写 EC RAM 和发命令实现亮度调节、电池信息读取、Fn 键等功能。这里的核心逻辑是EC 是一个独立的 8051 内核单片机它有自己的 Flash、RAM、GPIO 和外设。它不依赖主 CPU 就能独立运行。你在开机瞬间看到键盘灯闪一下、风扇转一下都是 EC 固件在干活。回到 IT8519 这颗料它的型号决定了内部资源基于 8051 指令集、内置一定容量的 Flash/ROM、支持 LPC/eSPI 接口、内置多组 GPIO 和 PWM 输出通道。笔记本主板用 EC 时厂家会把这颗芯片的 GPIO 全部重新定义同一个 IT8519在 A 厂商的图纸上是这样接在 B 厂商的图纸上又是那样接。也就是说EC 芯片本身是硬件但它所有引脚的行为完全由外面那个 EC code固件决定。这也解释了为什么 IT8519 的“代码”那么难找——同一颗芯片不同机型的固件完全不能互刷刷错轻则功能异常重则直接不开机。为什么这个话题下经常看到 ITE-EC、ITE EC code 这样的关键词因为联阳的 EC 虽然也在公开渠道放 datasheet但真正能指导开发的参考代码、初始化序列、固件工程模板都是签了 NDA 才给的。这就导致大家拿到的很多资料是泄露版的“EC.rar”、某个 BIOS 包提取出来的 EC binary或者某位工程师自己整理的反汇编工程。文件名越简短里面内容越杂反而越需要自己有一套完整的分析流程。2. 拿到 EC.rar 或 EC 固件包后第一步不是反汇编我见过不少人拿到一个 EC 相关的压缩包解压后看到一堆 .bin .hex .c立刻就往 IDA 里拖。这是一条弯路。EC 分析和纯软件逆向不一样你首先要确认的是“这个固件跑在哪颗芯片上”“这个工程的编译工具链是什么”“里面有没有能直接借鉴的初始化序列”。所以往下走之前先把文件解剖这一步做扎实。2.1 文件类型识别不要相信扩展名解压一个 EC.rar 之后正确的第一步是用工具看文件真实类型。EC 固件的常见形态有文件扩展名真实内容可能是什么判断方法.bin裸的 Flash 镜像可能带 512B/4KB 头部binwalk看熵分布hexdump看头部是否像向量表.hexIntel HEX 文本格式第一行如果是:10000000...就是标准 HEX.efi / .fdBIOS 镜像中的模块UEFITool 解包后定位.c / .h参考代码、寄存器定义直接看内容.rom可能是 EC 固件或 VGA ROM用字符串、8051 指令密度判断.txt / .pdf规格书、调试笔记最容易被忽略但往往最有价值我这次拿到的目录里有几个无关紧要的文本文件里面记录了一些调试用的端口地址和命令码这些东西比二进制还值钱。所以做压缩包整理时千万别只盯着代码文件。2.2 判断 EC 固件在压缩包里的位置如果这个压缩包是从某个 BIOS 升级包里提取出来的那么 EC 固件的存放位置有规律可循。最常见的两种形态独立 EC ROM 文件很多笔记本 BIOS 升级包会包含一个单独的 EC 固件文件文件名里有 EC 字样。这种最省事可以直接拿来分析。嵌入在 BIOS 固件中用 UEFITool 打开整个 BIOS 镜像搜索 GUID 或字符串EC、ITE、ECPD能找到 EC 固件对应的卷。还有一个更底层的方法是直接通过硬件读取。台机主板可以用 flashrom 外部 SPI 编程器读 BIOS Flash笔记本则需要用 clip 夹到 EC Flash 芯片上。IT8519 的固件通常存放在一颗独立的 SPI NOR Flash 里比如 1MB 或 2MB 容量。用编程器读出后再看开头是不是 8051 风格的中断向量表——注意这里不是 x86 的 IVT而是 8051 在地址 0x0000 开始放跳转指令的模式。2.3 确认芯片型号和工程归属IT8519 这个型号在不同批次、不同封装下寄存器映射和固件入口可能有细微差异。如果压缩包里还有主板型号、BIOS 版本号、EC 固件版本号一定要先记录下来。我一般会列一个信息清单包括EC 芯片完整型号丝印上的全部字符对应主板/机型BIOS 版本和 EC 固件版本提取来源BIOS 包路径、编程器读取方式Flash 容量和型号这些看似繁琐但后续分析中随时要用。比如你在追一个风扇转速的问题最后发现固件版本不同PWM 温度表完全不同如果没有记录版本号返工是必然的。3. IT8519 的地址空间与寄存器入口当你确认要分析的固件就是 IT8519 之后下一步是建立“地址空间概念”。没有这个基础看着反汇编代码也是云里雾里。3.1 8051 内核的基本内存模型IT8519 内部是增强型 8051 核。标准 8051 的地址空间分四块程序存储器Code Space64KB通过 PSEN 读取。IT8519 内部的 Flash 就映射在这里。内部数据存储器Internal RAM256 字节低 128 字节是普通 RAM高 128 字节只能间接寻址访问实际上也是寄存器组映射区。外部数据存储器External RAM64KB用 MOVX 指令访问。EC 的很多控制寄存器、Mailbox 内存、电池管理数据都放在这一块。特殊功能寄存器区SFR128 字节直接寻址用于访问定时器、串口、IO 控制寄存器。对于做固件分析的人来说最核心的是搞清楚 Code Space 里的程序流以及 External RAM 里那些寄存器和主系统怎么交互。3.2 EC 与主机通信的端口机制2E/2F 和 62/66IT8519 和主机 CPU 通信有两个层次。第一层是配置层通过标准的 Index/Data 端口访问通常就是 0x2E/0x2F。这组端口和 Super I/O 的配置端口一模一样。换句话说主机可以通过发送配置命令来选择访问 EC 的哪一个逻辑设备LDN然后通过 Data 端口读写该设备的配置寄存器。EC 自己在固件里也会初始化这些逻辑设备比如键盘控制器KBC、ACPI 控制器、GPIO 控制器。第二层是数据交换层也就是 ACPI Embedded Controller。操作系统通过 IO 端口 0x62数据口和 0x66命令/状态口访问 EC RAM。IT8519 内部有一段 RAM 专门用于和主机交换数据BIOS 和 OS 通过 0x62/0x66 读写的就是这一段。EC 固件的主循环里会有处理 0x66 命令的代码比如读 EC RAM、写 EC RAM、查询状态这部分在反汇编时会看到大量IN AL, DX/OUT DX, AL指令配合 0x62/0x66 端口判断。从分析角度我会优先在 IDA/Ghidra 里搜索访问 0x62 和 0x66 的代码片段因为这些是主机交互的核心通过它们能快速定位命令分发函数。同理搜索 0x2E/0x2F 的访问也能帮你找到逻辑设备初始化代码。3.3 用 IO 命令验证 EC 是否存在在还没有反汇编之前可以先在真机上验证这颗 EC 的响应行为。用一个小工具直接对 0x2E/0x2F 端口操作// 读取 IT8519 EC 的 ID 寄存器假设 LDN 是 0x07 或类似配置 // 本代码仅用于演示 EC 配置端口的访问方法 #include stdio.h #include stdint.h #ifdef _WIN32 #include windows.h #include winio.h // 实际运行时需要 WinIO 或其他驱动获取 IO 权限 #endif void write_io_port(uint16_t port, uint8_t value) { // 伪代码写 IO 端口 __outbyte(port, value); } uint8_t read_io_port(uint16_t port) { // 伪代码读 IO 端口 return __inbyte(port); } uint8_t read_ec_reg(uint8_t index) { write_io_port(0x2E, index); return read_io_port(0x2F); } int main() { // 进入配置模式IT 系列常用 0x87 write_io_port(0x2E, 0x87); // 读取 Chip ID 寄存器 uint8_t chip_id read_ec_reg(0x20); uint8_t chip_rev read_ec_reg(0x21); printf(Chip ID: 0x%02X, Rev: 0x%02X\n, chip_id, chip_rev); // 退出配置模式0xAA write_io_port(0x2E, 0xAA); return 0; }不过要注意IT8519 的运行模式和 Super I/O 不完全一样有些 EC 固件把配置端口重映射到了其他地址甚至关闭了外部访问。如果真机上读不到不一定代表芯片有问题可能只是固件没有开放这组端口。4. 从“IT8786E/IT8728F 看门狗”反推 IT8519 的 WDT 实现最近热词里反复出现“电脑主板 superio it8786e/it8728f 实现看门狗功能及操作 EC 的源码”这说明很多人实际碰到的问题是如何在主板设计里用看门狗做系统异常复位。虽然 IT8786E/IT8728F 是 Super I/O 而不是 EC但它们的看门狗实现思路和 IT8519 有很强的参照性。4.1 Super I/O 看门狗的基本套路IT8786E 的 WDT 配置本质上就是进入配置模式 → 选择 WDT 逻辑设备 → 设置计数器和事件类型 → 退出配置模式。典型步骤如下向 0x2E 写 0x87 进入配置模式有些型号要求连续写多个 0x87。选择逻辑设备IRQ 路由到 WDT 对应的 LDN。在 LDN 的配置寄存器里设置 WDT 的基数地址、计数器初值、超时动作复位、SMI、SCI 等。向 0x2F 写 0xAA 退出配置模式。在运行态写 WDT 的计数寄存器启动看门狗并定期“喂狗”。用 C 写出来的核心逻辑类似这样void enter_config_mode(void) { outb(0x2E, 0x87); outb(0x2E, 0x87); // IT87 系列有些需要两次 } void select_ldn(uint8_t ldn) { outb(0x2E, 0x07); // 选择 LDN 寄存器 outb(0x2F, ldn); } void exit_config_mode(void) { outb(0x2E, 0xAA); } void it8786_wdt_init(void) { enter_config_mode(); select_ldn(0x08); // 假设 WDT LDN 为 8 // 设置 WDT 基地址、计数器初值具体寄存器参考 datasheet exit_config_mode(); }说实话这类代码在嵌入式重启机制里很常见。它解决的核心问题是系统死机时没人管导致设备长时间无响应。WDT 就是一台“独立的监工”你不按时来汇报它就重启你。4.2 IT8519 的看门狗逻辑有什么不同IT8519 作为 EC它可以有两种看门狗角色角色一作为被监控方。EC 固件自己也有一个内部看门狗定时器防止 EC 程序跑飞。EC 主循环里定期喂狗一旦循环卡死EC 自动复位。这个相当于 EC 自己的“救命稻草”。角色二作为系统的看门狗。系统 OS 通过 ACPI EC 端口定期向 EC 写入一个“心跳”值EC 固件在 0x62/0x66 的处理函数里更新一个计时标记同时 EC 主循环检查这个标记是否超时。如果几秒内没有新心跳EC 可以触发 SMI、SCI或者直接拉一个 GPIO 去复位系统。在反汇编代码里角色二的表现形式会很有辨识度你会看到主循环里有一个计数器递减如果减到 0则调用一段 GPIO 控制代码同时 0x62 的接收分支里会把计数器重置回初值。如果你是用 Ghidra/IDA 看 IT8519 的 EC 固件可以这样定位看门狗相关代码搜索立即数比如超时阈值几秒对应多少次循环计数。搜索对 0x62 读/写相关的中断/事件分支。搜索 GPIO 输出寄存器看哪一位接的是复位信号。有朋友问我“既然 IT8786E 都能直接实现 WDT为什么还要 EC 去做”关键区别在于触发条件。Super I/O 的 WDT 纯粹是硬件层面的超时复位它不会区分系统是卡在 ACPI 还是卡在驱动层。而 EC 的心跳式看门狗可以和上层软件做配合比如系统在进入睡眠前主动停掉心跳避免 EC 误判死机而强制唤醒。这种智能判断是 EC 方案的价值所在。4.3 定位 EC 固件中的看门狗代码段假设你手上没有源码只有一份 EC 固件的二进制怎么在反汇编结果里快速找到 WDT 逻辑我给一个可复用的思路先找主循环。8051 程序的主循环通常在启动代码的 LJMP 之后特征是一段初始化代码结束后进入死循环循环体里有多个函数调用和条件跳转。在主循环里找计数器递减的片段。看门狗超时逻辑一定是“某个内存单元减一若为零则跳转”。找到清零/重置这个内存单元的代码。谁在重置它就是谁在喂狗。顺着喂狗代码的调用链往上找看它是不是 0x62 端口命令处理函数。这种方式比大海捞针式搜索有效得多。而且你会发现EC 固件的代码风格高度依赖编译器和库函数某些跳转表和函数命名习惯在你分析第二遍时会形成很强的肌肉记忆。5. 把 EC.rar 里的二进制拆成可读函数8051 反汇编实战最后一定要聊实际反汇编的操作细节因为很多人卡在这里拿到固件、知道它是 8051但 Ghidra 反编译出来的代码看起来不像普通的 ARM/x86 那么直观。5.1 Ghidra 8051 处理的坑Ghidra 对 8051 的支持其实是可用的但有几个坑需要提前规避。第一中断向量表的识别。很多 EC 固件在 flash 0x0000 处放了完整的 8051 中断向量表但向量地址是绝对跳转地址Ghidra 未必会自动识别成函数。我习惯在 0x0000、0x0003、0x000B、0x0013、0x001B、0x0023、0x002B、0x0033 这些典型位置逐个按L键定义地址然后跟随跳转。第二SFR 寄存器定义。Ghidra 内置了标准 8051 的 SFR 名称P0、P1、P2、P3、TMOD、TCON、SBUF、IE 等但 EC 芯片不是标准 8051它把很多外设映射到扩展 SFR 区域或是通过 XRAM 访问。你在分析时会看到大量MOVX DPTR指令这些地址往往是 EC 的外设寄存器在 Ghidra 里默认是裸数据。建议先根据 IT8519 datasheet 或者网上能查到的 register map在 Ghidra 里定义 RAM 区域并填上名称。第三Bank 切换。有些 EC 固件超过 64KB 限制会通过分页寄存器来做 Bank 切换。IT8519 如果外挂了更大的 Flash代码里会频繁操作一个分页寄存器然后跳转到不同 Bank。Ghidra 对这种动态切换支持有限需要你手动标记。做 EC 分析时发现一个函数在 A Bank 调用、实际执行在 B Bank这种情况我遇到过多次。5.2 推荐的分析流程我自己的习惯是用ripr工具如果版本合适或者先从固件头部读取“跳转表”把明显的函数入口标出来。然后按以下顺序看复位向量跳转到的初始化函数通常会调用一堆 8051 外设初始化比如定时器、串口、中断使能。这部分能帮你确认固件使用的是哪些外设。中断服务函数定时器中断、外部中断处理。很多时间敏感的工作在这里完成。主循环无界循环通常有状态机逻辑。特别注意高地址区域的查表函数EC 里的温控表、PWM 占空比表往往是一张张常量表被主循环里的查找函数引用。在看代码的时候还应该顺手做一件很关键的事记录字符串。EC 固件里虽然不像应用程序那样有一大堆提示文字但调试版本通常会留有模块名、版本号、功能开关的 ASCII 字符串。这些字符串可以帮你快速定位代码所在功能块。比如我分析过一个 EC 固件在里面找到BAT、AC、FAN这类短字符串顺着引用关系就找到了电池和风扇的核心代码位置。5.3 模拟器和逻辑分析仪的配合如果只是静态分析有些动态行为你永远猜不到。比如一个 GPIO 拉低了但有多个代码路径都可能操作它。这种时候用模拟器比如 Keil C51 的 uSim 或其它 8051 模拟器加载固件在关键端口操作上打断点能极大提高效率。更硬核的做法是直接上逻辑分析仪。EC 芯片运行时会用 SPI 读取外部 Flash 里的代码和数据。你可以把逻辑分析仪的通道夹在 SPI Flash 的 CLK、CS、MOSI、MISO 上捕获 EC 正在执行的指令流拿捕获到的数据和固件反汇编对照。这个玩法有点繁但在解不开某些高度混淆的 EC 固件时是唯一的出路。我最后一次提这个是因为 IT8519 这个级别的 EC网上流传的代码满天飞但真正能验证细节的人并不多。如果你从某个群里拿到一份“EC.rar”里面有一个叫ec.c的文件看起来注释齐全、逻辑清晰那大概率是从某个 ODM 泄出来的产物。这种代码价值非常高可以直接借它理解整个 EC 的功能模块划分。但如果你拿到的只有二进制也别慌坚持“先确认芯片、再找通信入口、再定位主循环、最后追关键外设”这条路EC 逆向真没有传说中那么玄。我个人在实际分析中最大的体会是EC 代码和你平常写的应用层代码完全是两种生物。它没有操作系统兜底所有资源和时间窗口都得自己抠。拿到一份 EC 工程时先看它怎么省电、怎么防卡死、怎么重启比看它实现某个具体功能更有收获。这些系统级的“保命策略”才是 ITE EC 这类固件里最值钱的干货。如果你手头有类似标题的资源包建议按上面的方法先从头到尾过一遍再动手否则看半天可能只是在浪费电。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门