vermagicとmodversionsを偽装する方法(Dirty Hack、備忘録)

LinuxではKernelをコンパイルした際、異なるversionのmoduleをインストールして不具合が起きないようにチェック機構を設けている。

これは通常、正しいversionのlinux-headerを指定することで解決するのが筋である。しかし、Raspberry Piで同じことをやろうとしたがなかなかうまく行かなかった。

次善の策としてはmodprobe -fでチェックを無視できるはずなのだがこれも上手く動かない(無視されてるらしい?)

そこで無理やりどうにかすることを考えた。

kernel/module.c

moduleに関する処理はkernel/module.c中にある。これを読んだ。

チェックはsetup_load_info中のcheck_modstruct_versionで行われる

github.com

これはkernel optionでCONFIG_MODVERSIONSが有効であった場合、常に1を返す(チェックが無い)。 CONFIG_MODVERSIONSが無効であった場合、該当するkernel module中から.modinfoと__versionsというsectionを探し正しい値かどうかを確かめる。

そこで.modinfoと__versionsを正しいmoduleから引っ張ってきて差し替える。

具体的にはobjcopy --only-sectionで正しいmoduleから抜き出し、objcopy --remove-section --add-sectionで差し替え、objcopy --set-section-flagsでsectionのflagを調整する。

どう考えてももっと良い手法があるはずだけどRaspberry Piは色々めんどい。