第1回ローレイヤー勉強会

行ってきた。
kanaiさん面白い場を提供していただきありがとうございました。
以下自分用メモ。

Linux Kernel Hacking

http://d.hatena.ne.jp/rootkit/20081125/1227639297
最初の一歩のやり方ってなかなかわからないもんです。あと、他の人が使っている便利テクニックを鑑賞できるというのも良いですね。

vmlinuxについて

gdbで)カーネルのシンボリックデバッグをするときに使う。要するに非圧縮のELFファイル。
カーネルのビルドってLinuxだと当たり前の作業ではあるけど、スムーズにできるようになるまでには知識が必要で、make zImageとは何ぞやとか色々謎がある。
http://d.hatena.ne.jp/takihiro/20080617/1224331959
512KBの壁とか色々ありますなあ。ブート周りも変なテクニックが満載で面白そう。

カーネルモジュールのビルド方法

自分のモジュールを、ソースチェインに組み込まずにビルドする方法は
make -C /lib/modules/2.6.18-prep/build/ SUBDIRS=~/hello modules
という感じらしい。初めて知った。

syscall hackについて

最近のカーネルではsys_call_tableがexportされていない。
そういう場合に、sysenter(またはint 80h)のエントリーポイント(system_call)を逆汗し、call命令を見つけてsys_call_tableを得るという方法もあるらしい。最近のマルウェアはできることは何でもやるみたい。

Windowsカーネルハック

http://d.hatena.ne.jp/egggarden/20081123
資料が100ページ以上あるとか…そのまま本にできそうな内容。

サービスについて

Windows NT系はドライバも常駐プログラムもどっちもサービスとして登録するわけだけど、これはマイクロカーネルだった頃の名残りなのかな。

サービスのロード方法

基本はCreateService()で、以前は裏技としてNtSetSystemInformation()でもいけた。
どうやるのか不明だが、「このデバイスのドライバはコンピュータの再起動時にアンインストールされます。そのデバイスに行った変更は保存されません」と表示されるものがある。ドライバの詳細も表示されず、メモリ上にのみ存在させることができるようだ。要調査。

カーネルバージョンの取得方法

非推奨だがNtBuildNumberで取れる。なんかずるいけど手っ取り早くて確実な方法。

C++でドライバ

「いちいち型を指定するのがめんどいのでマクロ」と言っていたのでソースを見たらHOOK_SYSCALLがテンプレートになっていて感動した。

フックについて

InterlockedExchangeの戻り値を代入する方法。
これが安全かどうかという質問があったのだが、交換処理自体は安全だが、戻り値を代入する命令の前でコンテキストスイッチ(あるいは別のプロセッサによる実行)が起きる可能性がある場合は使えないのではないかと思われる。

参考書籍について

インサイドWindows(原書はInside WindowsまたはWindows Internals)とAdvanced Windows(原書はWindows Via C/C++)があるのだが紛らわしい。どっちも持ってなくてすいません。
カーネルの話のみであれば、WDMデバイスドライバプログラミング完全ガイドの方がよいかも。

その他

rootkitというidは素敵すぎるって言ったら目の前にご本人がいて恥ずかしい思いをした。
あと、なぜ冷やし中華なのか結局わからず。次回に期待。