Posts
记无源码给闭源内核写模块
pre
目标主机没有内核源码,只确定内核大概版本,确定是它修改了内核,和引入了xenomai实时内核.
模块编写
开发很顺利,正向开发就可以
问题
1.disagrees about version of symbol module_layout
这个内核版本驱动版本号和自己开发的module_layout
版本号不一样导致的,解决办法有2:
* 找一个内核能加载的内核ko文件,找到____versions
的section ,第一个unsigned int 即为对应内核的版本号,将自己写的内核模块的版本号,手动改为这个版本,即刻加载模块。
* 将内核的所有版本号导出,此办法分析对应内核的__stop___ksymtab_unused_gpl
的符号, 然后执行一下python脚本即可将所有符号的版本号导出, 导出后找到module_layout
修改对应的版本即可。
print("0x%x"%here())
addr=here()
name=ida_name.get_ea_name(addr)
#print(name)
while(name!="__stop___kcrctab_unused_gpl"):
name=ida_name.get_ea_name(addr)
print("0x%x,%s::%x"%(addr,name,idaapi.get_dword(addr)))
# print(name)
addr=addr+4
2.问题二
: disagrees about version of symbol __alloc_pages_nodemask 0x98b834db
: Unknown symbol __alloc_pages_nodemask (err -22)
: disagrees about version of symbol page_address 0xb79a442e
: Unknown symbol page_address (err -22)
: disagrees about version of symbol mem_map 0x41439568
: Unknown symbol mem_map (err -22)
成功加载后,发现dmesg
的错误信息如上:
这也是版本号不一样的问题,通过问题一 解决办法2的方法找到所有函数的version数据然后填写到自己开发的模块中,然后进行加载即可解决.
总结
内核没什么复杂的,复杂的地方在于管理各个模块之间的运行关系,本质还是很基础性的。