涼宮ハルヒの憂鬱

ネタバレ
先日コンピ研とのゲーム対決がアニメでも放送されました。
以前からハルヒの作者は、プログラマらしい片鱗を匂わせています。
アニメ版ではカットされましたが、長門vs朝倉のシーンでは長門の呪文が(インチキ)SQL文で、プログラマ連中の笑いを誘いました。
 
そんな長門が大活躍するゲーム対決。
対決に使われたゲームは、宇宙空間で5隻vs5隻の艦隊が戦うコンピ研自作ゲームです。
AOEなどと同じで「策敵していない範囲は見えない」というルールがストーリーの肝でした。
コンピ研は、策敵せずとも視界を確保できる「策敵OFFモード(策敵する必要がOFFという意味)」という機能を自分たちのみつけていました。
それをゲーム対戦中に長門がハックし、ONに切り替えさせ(自分たちと対等の条件。策敵が必要な状態にしたわけですね)、かつOFFにできないようにロックしてから、正々堂々倒したわけです。
 
さて、具体的にそれを行なった際の描写についてです。
長門がすさまじい速度でキーボードを叩いているシーン。
長門のPCには無数のコンソールウインドウが開いたり閉じたりし、ウインドウの中はプログラムらしき(ぱっと見、CかC++)ソース文が流れていました。
エディタが無い。
肝心の入力場所が無い。まさかコンソールに直接打っていたのでしょうか。
キョンからの指令により「人間技のみで戦え」といわれていましたので、電子的直接干渉で操作していることは無いはずです。すべてキーボードとマウスでの操作と考えられます。
 
ところで、コンピ研のゲーム(かつ、コンピ研のみが持つ実効ファイル)に「策敵OFFモード」があることが分かったのはゲームが開始した後のはずです。
となると、長門が事前にハックプログラムを作っていたことは考えられません。
(後述しますが、これについては否定の可能性がでてきます)
 
コンソールを流れていたプログラムですが、きちんとインデントが行なわれていました。
直接コンソールか打ち込んだにしては不自然です。というかコマンドプロンプトにインデント機能はありません。
すでにソースはエディタで入力した後であり、画面に移っていたのはコンパイル中の画面だったのでしょうか。
いえ。違います。
その時まだ長門は物凄い勢いでキーボードを打っていました。どこにエディタがあったのでしょうか。
そうか!viあたりか!
いや待て。コンソールが出たり消えたりした都合上、アクティブなWindowがころころ入れ替わってしまっています。これではエディタがあったとしても打てない。
それと長門がわざわざ改行なり(自動で付加されるでしょうが)インデントを行なっているのは不自然です。改行やインデントは、あくまで「普通のプログラマ」がソースを見やすくするためにのみ必要なものです。
 
さて、コンパイルが終わったのか、画面上にダイアログボックスが出た画面。
長門キョンに「ハックを行なってよいか」を問います。そしてキョンは色々思慮したのちYesと答えるわけです。
 
ここからは長門がプログラムを打つ必要はないでしょう。
プログラムが走り、コンピ研側の実行中なプログラムが書き換えられたわけです。
どうやったのか。
 
あくまで通信経路を通じてのハックです。
(おそらく)Windowsの致命的なセキュリティーホールでも利用しない限り、ゲームのSocket通信を通じてしか相手PCに干渉できません。
コンピ研ともなれば不要なポートは閉じているでしょうし(LAN内部からの攻撃に対しては油断しているか?)、おそらくゲームの通信制御部に存在したバッファオーバーフロー系のバグを利用したのでしょう。
こら、コンピ研。通信ゲーム作るならバッファオーバーフローくらいきちんと対策しなさい。
よかったね長門。最近のCPUはバッファオーバーフローに対応したモードをハードレベルで持ってるらしいですよ。コンピ研のPCのCPUは最新ではなかったと。
さて、そのバグを利用して相手のPCで任意のコードを走らせたとします。
 
次に問題になるのは「策敵OFFモード」を司るフラグが、メモリー上のどこにあるかです。
何せSOS団側に渡された実行ファイルには、策敵OFFモード自体ないのです。
画面の演出を考えるに「正しく策敵ONモードに切り替えた」ようです。
「このPCで最前面に出しているWindowへの描画を横から分捕り、描画を反映させない」というのならまだ楽そうなのですが…。
まさかコンピ研は、モードのON/OFF機能だけ削除して、フラグ自体はSOS団側の実行ファイル内にも存在させていたのでしょうか。
相手を侮っていたのなら十分ありえます。
単にON/OFF機能の部分だけコメントアウトしたのであれば、実行ファイルのなかにモードフラグのメモリー上配置個所は残ってしまうわけです。
そうですか。小説でそれっぽい描写がちょっとだけありましたが、長門はもらったEXEを逆アセして解析したんですね。そして策敵OFFモードの存在自体も対決が始まる前から知っていたと。
EXEファイルを逆アセして読破するのは、人間技とは言わない気がしますが。
で、そのモードフラグを強制的に書き換え続ける(OFFモードに戻せないようにね)コードを送りつけたわけですか。
あれ? それならばハックプログラムは事前に作れたはずです。
ゲーム中にキーボードを全力で打ちながら作る必要は無いはず。
 
そもそも、Windowsは他プロセスが利用しているメモリーへのアクセスが、厳密に禁止されていないからこんなことになるのです。
マルチスレッドOSなのに重大な欠陥だと思いませんか。

<追記>
長門のコンソールに出ているプログラム。
MessageBox(NULL, TEXT("??????"), TEXT("Error"), MB_OK);
return(FALSE);
BOOL CheckParam??????(DWORD dwPID)
などなど。
C確定ですね。
何故かハンガリー記法まで守っています。実に私好み。
しかし何故メッセージボックスなんぞ…。
 
コンソールの名前がmainやsub_02などになっています。
おそらくソースファイルの名前ですね。
とりあえずC/C++の実行ファイルには、変数の名前などは残っていません。
これは逆コンパイルした結果などではなく、間違いなく長門がリアルタイムに打ったものでしょう。
 
おっと!mainコンソールにmain関数発見。
void main()
{
MessageBox(NULL, TEXT("?????!!"), _TEX
GetProcessList();
}
短いmainだな。最初のMessageBoxが);で閉じられていないのが不自然。
まぁこれがキョンに問い掛けている時に画面に出ていたダイアログなんでしょうね。
ボタンが1個しかないので、MB_OKだと思われます。
っていうか長門。「許可を」とか問い掛けておきながら、OKボタンしかつけないとはどういう了見だい。
コンパイラbcc32なのが画面から確定。
 
しかしこのプログラム郡。異様にMessageBoxの記述が目立つんですが…。
Process32Nextを発見。やはりプロセスサーチを行うプログラムのようですね。
CheckProcessModules。これは自作関数っぽいですね。プロトタイプ宣言も発見できました。
CheckProcessList。これも自作関数。プロトタイプ宣言を発見。
InjectHook。自作関数。フック注入。Hookは悪意的なプログラムではおなじみですが、DLL化しないでのグローバルフックは基本的に無理なはず。
 
全般的にProcessという名前を含んだ変数、関数が多くでてきます。
そういうプログラムであるという演出ですね。
結構プログラム分かってる人を連れてきた感じ。
 
#include
#include <???32.h>
#include
ふむ。コンソールアプリケーションなのにwindows.hですか。MessageBoxとかも使ってるからかな。
だがこのinclude。実際には

do
{
{
#include
#include <???32.h>
#include

って書いてあるんですよね。
ヘッダファイルをdo/whileでぶんまわして何がしたいんだ長門