本项目是基于我同事的项目 Better-printk-IDA9 的 Fork 版本,原作者为 ZjW1nd。
原版 README 链接:
由于hexray提供的idaapi版本代差过大,此版本仅适配ida9及相近版本,日后可能会做其他版本的适配
在原版功能基础上,本 Fork 增加了以下功能:
- 支持
printk参数为局部变量的情况- 自动回溯变量赋值链,提取字符串地址
- 兼容
v0 = v1; v1 = 0x1234; printk(v0);这种多层赋值形式、例如下方的情况
{
v11 = 1024;
if ( a3 < 0x400 )
v11 = a3;
_check_object_size(v9, v11, 1);
if ( !copy_to_user(a2, v9, v11) )
goto LABEL_7;
v11 = -14;
v13 = &unk_6DF;
}
else
{
v11 = -12;
v13 = &unk_68B;
}
printk(v13);- 支持多个可能字符串地址的解析
- 如果变量在函数中多次被赋值不同地址,全部解析并提取字符串,如下所示,您可以在调试信息里找到它
[better_printk] Found printk @ 0x133, extract: KERN_INFO, "[kbook:] Failed to copy data back to user space!\n"
[better_printk] Found printk @ 0x133, extract: KERN_ALERT, "[kbook:] RUN OUT OF ALL MEMORY!\n"- 优化了部分
printk被解析成_printk时无法提取字符串的bug- 如下所示
.text:0000000000000100 loc_100: ; CODE XREF: kbook_read+19↑j
.text:0000000000000100 mov rdi, offset unk_6B4
.text:0000000000000107 call _printk ; KERN_ERR, "[kbook:] You should firstly get a book!\n"Get Value kmalloc_caches:3�
3264�
0xcc0
[better_alloc] kmalloc_trace @size=8 @flag=GFP_KERNEL| @ 0x1129Get Value kmalloc_caches:10
3520�
0xdc0
[better_alloc] kmalloc_trace @size=1024 @flag=GFP_KERNEL|__GFP_ZERO| @ 0x3ff42- 更多复杂表达式和函数的参数解析
- 一键识别fops
- 支持导出dump功能,导出会规范伪代码的格式并合并cold代码,使您可以直接dump出更加标准、近c的代码直接用于您的LKM
如果您对ida插件编写和kernel pwn感兴趣,也欢迎联系我!

