Windows 2000 拡張カーネルの技術紹介 2018年6月10日 黒翼猫
前身のKDWについて Known Dlls Wrapper の略 ちょクロシステムのlistexp2.exe を使ってKnownDllsのラッパーを作り、元のファイルを置き換えて、システムAPIを乗っ取る仕組みだった。 そのため、ウィルスに誤検出されたり、パフォーマンスが落ちる問題があった。
PEMaker 誕生 オリジナルのDLLを直接書き換えて拡張しようという思想。 まず、DLLファイルの仕組みを独自に解析(Windows 95バイブルなどにPEファイルのヘッダ形式などは書かれていたが万能ではなかった) まず、バイナリを書き換えるツールを作ろう!
PEMakerとは セクションテーブル・関数テーブル・再配置テーブルを追加したり・データディレクトリを編集したりできるバイナリ改造補助ツール
実際にDLLの書き換え① コードを微変更する場合は、隙間を探してJMPで飛ばして解決 少し足りない場合は各セクションテーブルの終わりに数百バイト~数K程度のすきまがあるのでそこにコードを埋め込む セクションテーブルの実アドレスが64K境界的に余裕がある場合は、セクションテーブルを移動させて数K~数十Kのコードを埋め込める それでも足りない場合は、新しいセクションテーブルを作ると数十K~数百Kのコードが埋め込める
実際にDLLの書き換え② 埋め込みたいコードをVC++ で書く バイナリエディタで埋め込む コールアドレスの埋め込み 埋め込んだコードの再配置テーブルを追加 エクスポートテーブルや関数テーブルを修正 バイナリエディタで微修正 チェックサムを書き込む
実際に非対応ソフトを動かす
苦労話 NTDLLやDriverを改造してチェックサムを書き換えなかった場合にBSoDになるのを知らなかった。 XPと関数名が同じなのに、引数が違うケースがあった。 カーネルモード呼び出しに無知だったためXPと同じ処理をしたらシステムクラッシュ。 非公開APIが思ったより多かった。 Windows 2000に実装されてるはずの機能がないケースが少なくない! OSによってロード推奨アドレスがあって、コードが大きくなりすぎて、固定アドレスが推奨されている関数が再配置されてクラッシュするケースがあった。
動かしたアプリ例 iTunes 11.x Chrome 54 Firefox 52 Media Player 11 WireShar 2.2.8 Skype 7 MPC Be CrystalDiskInfo 7.6 Nox Player 星界神話 ランス9 Office 2007 IME 2010 一太郎 2016
やってみて分かったこと XPで直ってるのにWindows 2000自体に未修正の不具合が沢山ある。 MSI.DLLやSHLWAPI.DLLはXPと2000で同じDLLを共用していて、内部でバージョンチェックして分岐処理をしている。しかも、扱っている構造体のサイズが違う Windows 2000に実装されてないはずの機能が実装されてることも少なくない。 Windows 2000でそのまま動くアプリが、バージョンチェックだけではじかれて、XPの新技術として紹介されているケースが沢山あった
その他の技術について Windows NT 5.xだけにある、OSバージョンを好きな数字に偽装する隠し機能の発見。 上位OSのアプリを動かそうとすると「有効な Win32 アプリケーションではありません」と言われる問題の回避。 Windows 2000でDirectX10のゲームを動かしてみる実験。
資料 ちょクロシステム http://www.chiyoclone.net/details.html 黒翼猫のコンピュータ日記 2nd Edition http://blog.livedoor.jp/blackwingcat/ windows2000 実験室 https://www7.atwiki.jp/win2000/