いろきゅうの(元)はてなダイアリー

はてなダイアリーから移行中…

YJローゼン第14話を見てソフト屋のおいらが思ったこと

BIG-JUMくんが DoS を食らった。 案の定落ちた*1




だから貧弱なサーバーに突然大量のリクエストを送るなとあれほど(ry

薔薇乙女達は田代砲化する。ちぃおぼえた。


  • BIG-JUMは死んで良いよ(嫉妬しながら
  • きら子さんやっぱいいなぁ……

今回もソース書いてみたんだけれども

規模がでかすぎで超面白く無ぇ orz

興味本位でコード化してみたんですけれども、今回関係してくるドールが多かったのでコード量が増えてしまうわ、プロセス間通信が発生してしまって流れが複雑になるわ……と散々でした。 打ってて辛かったです。(ならやるなよ

でも、折角なので載せておきます。更新量が稼げるしね!

↓↓↓↓↓↓以下ネタバレ↓↓↓↓↓↓



















CM:ロロナのアトリエ はいい…心が洗われる…



































勢いだけで書いた。コンパイルは通らない。今は(いろんな意味で)反省している。

// big-jum.exe
const UINT RM_REQUEST_RECV_CONTRACT = 0x00169023;
const UINT RM_REQUEST_CONTRACT      = 0x02020202;

struct RMRING
{
	......
};


// 第14話 entry point
void tail14()
{
	RMSOCKET hShink = GetRMSocket(_T("doll://rozen-maiden/shinku"));
	RMRING   sRing  = {0};

	// ↓実は API HOOK されていた!
	::send(hShink, &RM_REQUEST_RECV_CONTRACT, sizeof(RM_REQUEST_RECV_CONTRACT), 0);
	// コード的にはひどすぎるけどめんどいからコレでいいや…
	if(::recv(hShink, &sRing, sizeof(RMRING), 0) == sizezof(RMRING))
	{
		if(ImplementMaterial(my, &sRing) != 0)
			throw new StoryException(_T("お話が進みませんでした"));	
	}
}


// メッセージポンプとか関係なしに、バンバン呼ばれちゃう仕様
// そしてマルチスレッド未考慮
RMAPI LRESULT JumProc(RMHUMAN hBigJum, UINT msg, WPARAM wp, LPARAM lp)
{
	switch(msg)
	{
	case RM_REQUEST_CONTRACT:
		{
			RMING* psRing = (RMRING*)wp;
			GlobalFuncfion(psRing);
		}
		break;
	case RM_REQUEST_ENERGIE:
		{
			// ignore...
		}
		break;
	}
}

// 排他ロックしていなくて死亡...
void GlobalFunction(RMRING* psRing)
{
	g_hogehoge = psRing->hogehoeg;
	g_...
	g_...
}
// BigJumHook.dll

// Hook send() function ...
//  ま た お ま え か !
int sendKirakisyoHooker(RMSOCKET socket, const BYTE* buff, int len, int flg)
{
	if((static_cast<int*>buff) == RM_REQUEST_RECV_CONTRACT)
	{
		// 全体に告知
		::PostMessage(RMM_BROADCAST, RM_CONTRACT, HUMAN_BIG_JUM, 0);
	}

	return (*fnOrgSend)(sockete, buff, len, flg);
}
// suiseiseki.exe

RMAPI LRESULT RMProc(HDOLL hDoll, UINT msg WPARAM wp, LPARAM lp)
{
	switch(msg)
	{
	case RM_REQUEST_RECV_CONTRACT:
		{
			::PostMessage(hBigJum, RM_REQUEST_CONTRACT. &myRing, 0);
		}
	}

	return 0;
}
// kirakisyo.exe

RMAPI LRESULT RMProc(HDOLL hDoll, UINT msg WPARAM wp, LPARAM lp)
{
	switch(msg)
	{
	case RM_REQUEST_RECV_CONTRACT:
		{
			::PostMessage(hBigJum, RM_REQUEST_CONTRACT. &myRing, 0);
		}
	}

	return 0;
}
// shink_replica.exe

RMAPI LRESULT RMProc(HDOLL hDoll, UINT msg WPARAM wp, LPARAM lp)
{
	switch(msg)
	{
	case RM_REQUEST_RECV_CONTRACT:
		{
			::PostMessage(hBigJum, RM_REQUEST_CONTRACT. &myRing, 0);
		}
	}

	return 0;
}

// 別スレッド
int Communicator(RMSOCKET hSocketBigJum)
{
	const size_t SIZE = 1024;
	BYTE  buff[SIZE]  = {0};
	int   read;
	while(true)
	{
		read = recv(hSocketBigJum, buff, SIZE, 0);
		if(read < 0)
			break;

		switch(MsgAnalyzer(buff))
		{
		case RM_REQUEST_RECV_CONTRACT:
			{
				if(IsValidMyStatus())
					send(hSocketBigJum, &myRing, sizeof(myRing), 0);
				else
					send(hSocketBigJum, REJECT, 1, 0);
			}
		}
	}
}
// suigintou.exe

RMAPI LRESULT RMProc(HDOLL hDoll, UINT msg WPARAM wp, LPARAM lp)
{
	switch(msg)
	{
	case RM_REQUEST_RECV_CONTRACT:
		{
			::PostMessage(hBigJum, RM_REQUEST_ENERGIE. &myRing, 0);
		}
	}

	return 0;
}

きら子さんのHOOKっぷり(発音:乗っ取りっぷり)は異常。

*1:正確にはパフォーマンスの大幅低下