totekuh/kpoke
GitHub: totekuh/kpoke
轻量级嵌入式 MIPS Linux 内核内存检查工具,在无依赖、资源受限的 IoT 环境中实现内核级读写和调试。
Stars: 0 | Forks: 0
# kpoke
嵌入式 MIPS Linux 的内核内存检查工具。零依赖 —— 使用原始系统调用,无 libc,静态二进制文件小于 12KB。
专为路由器和 IoT 设备构建,适用于没有工具链、没有 gdb、没有 `/proc/slabinfo` 且文件系统为只读 squashfs 的环境。上传,运行,即可探测内核。

## 两个二进制文件
| Binary | Size | Description |
|--------|------|-------------|
| `kpoke` | ~10KB | 独立 CLI —— 每次调用执行一条命令 |
| `kpoked` | ~12KB | TCP 守护进程 —— 通过网络进行交互式会话 |
## 命令
```
read [count] Read dwords from kernel memory
walk [max] Walk circular doubly-linked list (Linux list_head)
slab Pretty-print struct kmem_cache (SLAB allocator)
pages Dump all slab objects with 2-dword fingerprints
write [count] Write dword(s) to kernel memory
flush Flush I+D cache (required after writing code)
```
所有地址接受 kseg0 (`0x8xxxxxxx`) 并自动转换为物理地址以供 `/dev/mem` 使用。如果 `/dev/mem` 不可用,会创建 `/var/tmp/devmem` 作为字符设备。
## 构建
```
make # build kpoke with dockcross (docker required)
make daemon # build kpoked (TCP daemon)
make local # build kpoke with local mipsel-linux-gnu-gcc
make strip # build + strip symbols
make help # show all targets
```
首次使用?运行 `make setup` 拉取 dockcross 镜像,或运行 `make setup-local` 安装 apt 交叉编译器。
## 用法
将二进制文件上传到 MIPS32 LE 目标机并在其上运行。
### 独立 CLI
```
kpoke read 0x83dbe400 16
kpoke walk 0x80344a44 0x44
kpoke slab 0x83fb5e00
kpoke pages 0x83fb5e00
kpoke write 0x83dbe40c 0xdeadbeef
kpoke flush 0x83dbe400 256
```
### TCP 守护进程
```
# 在目标上:
kpoked 4446 &
# 从网络上的任何机器:
$ nc 192.168.240.1 4446
read 0x80000000 4
0x80000000: 0x3c1b8035
0x80000004: 0x401a4000
0x80000008: 0x8f7be000
0x8000000c: 0x001ad582
slab 0x83c809c0
name: bridge_fdb_cache
buffer_size: 00000020 (32)
...
walk 0x80371258 0x44 3
#0: 0x83c809c0
#1: 0x83c80a20
#2: 0x83c80a80
total: 3
```
每次连接支持多条命令。可交互或脚本化:
```
printf "read 0x80000000 4\nslab 0x83c809c0\n" | nc -w 2 192.168.240.1 4446
```
## 工作原理
- 使用 MIPS32 LE 汇编编写,通过原始 Linux 系统调用运行
- 通过 `/dev/mem` 访问内核内存(如果真实的 `/dev/mem` 不可用,则在 `/var/tmp/devmem` 创建字符设备)
- 自动将 kseg0 虚拟地址转换为物理地址
- 理解 Linux 2.6.x SLAB 分配器结构体(`kmem_cache`、`kmem_list3`、`slab`)
- `kpoked` 为每个连接 fork,将 socket dup2() 到 stdout,逐行读取命令
- 无 libc,无动态链接器,无依赖 —— 仅纯静态 ELF
## 目标平台
MIPS32 小端模式(MediaTek MT7628、MT7621 等)。Linux 2.6.36+。
`slab` 和 `pages` 命令需要带有 `NR_CPUS=1` 的 SLAB 分配器(结构体偏移量已硬编码)。所有其他命令(`read`、`write`、`walk`、`flush`)可在任何带有 `/dev/mem` 的 Linux 内核上运行。
## 许可证
MIT
标签:/dev/mem, IoT安全, kmem_cache, Linux内核, MIPS架构, Raw Syscall, TCP守护进程, Web报告查看器, 云资产清单, 内存检查, 内存读写, 内核SLAB, 内核调试, 固件分析, 安全报告生成, 嵌入式安全, 无Libc, 漏洞分析, 裸机编程, 路径探测, 路由器安全, 轻量级工具, 逆向工程, 静态编译