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数据然后填写到自己开发的模块中,然后进行加载即可解决.

    总结

    内核没什么复杂的,复杂的地方在于管理各个模块之间的运行关系,本质还是很基础性的。