TLTR
我想将 Linux 内核头文件 vs. 4.19 加载到 Ghidra,以便它识别内核结构和函数签名。
详细描述
我正在尝试对 Linux 内核模块(内核版本 4.19)进行逆向工程。Ghidra不正确地识别所有的函数名,如:open
,misc_register
等等,但不能确定其确切的签名。
我们以copy_from_user()
带有签名的函数为例:
unsigned long copy_from_user (void *to, const void __user *from, unsigned long n);
这是 Ghidra 的看法:
undefined _copy_from_user (void)
我相信它不会是我逆向工程的最后一个内核模块,所以我想学习如何将所有丢失的内核结构加载到程序中。
此外,我知道我可以手动编辑函数签名,但是我还需要手动添加大量结构(例如结构文件),这将非常无效。
到目前为止我尝试过的
(我是 Ghidra 的超级新手,如果您知道加载 Linux 内核头文件的更好方法,请分享。)
我已经从 Debian 存储库下载了标头:
$ wget linux-headers-4.19.0-6-common_4.19.67-2+deb10u2_all.deb .
$ ls
linux-headers-4.19.0-6-common_4.19.67-2+deb10u2_all.deb usr
$ ls /usr/src/
linux-headers-4.19.0-6-common
我将所有文件的全部内容提取并复制到all_headers.h
(Ghidra 不想接受目录本身。我也找不到有关从 Makefile 加载文件的任何信息)
$ cat `find . | grep .h` > all_headers.h
$ cat all_headers.h | wc -c
29824650
我提供了 all_headers.h 来解析,但 Ghidra 只添加了大约 20 个定义并且没有函数签名。