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:正確にはパフォーマンスの大幅低下