よく訓練されたニコ厨によるニコ動の仕様変更対応（nFinder編）

（7/17追記）
投稿者コメントが表示されないバグ対応を[こちらの記事](http://qiita.com/ysktn/items/8d49d7b32eb3ffa835bb)に書きました。合わせてご覧ください。

## あらすじ

7/13、全世界のニコ厨達に衝撃が走る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/fbc0c34b-8f07-2d53-b500-cb2708af1b8f.png)

<font size="150%">そう、**ニコニコ動画の標準がHTML5版になったのである。**</font>
これまでも重たいHTML5版を含め、幾多の困難に立ち向かってきたニコ厨達だったが、
今回の仕様変更による影響は非常に大きく、世界の様相までも変えうるほどであった。


**海（タイムライン）は荒れ...**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/281c6e98-f0f3-c37c-6c8a-52c9f98bc2ca.png)

**山（コメント欄）は燃え上がり...**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/25fa64f1-da63-27f3-91cd-0652325451ec.png)


**ほとんどのニコ動専用ブラウザが動かなくなった**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/6a975b6a-2c48-ca8d-0668-ba84ffac5c79.png)


---
「い゛し゛め゛な゛い゛て゛よ゛お゛ぉ゛」
「HTML5！テメェさえ居なければさァ！ボクは幸せに視聴できたんだよォ！！」
多くのニコ厨が悲しみ、怒り、声を上げるが為す術もなく、もはや救いは無いかと思われた。
しかしまだ諦めてはいけない！そんなニコ厨達のために立ち上がるものが現れたのだ！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/23b2d4bc-306a-1356-5ae4-4cd135a02e2a.png)


彼は伝説のアイテムを用いて **ニコ動専用ブラウザの力**を解放し
全ての視聴者がニコニコできる平和な世界を取り戻したのだった。

---

## 作業概要
というわけで、[dnSpy](https://github.com/0xd4d/dnSpy)というツールを用いた **.Netアプリケーションのパッチ当て** 作業の解説です。
.Net Frameworkを用いて作られたアプリケーションは逆コンパイル（exeからソースを復元する）できる事をご存知の方もいるかと思いますが、前述のdnSpyを使うことで **部分的なソース修正および再コンパイル** が可能となります。
（[このQiitaの記事](http://qiita.com/NetSeed/items/54fbf30cb21c77c05c41)でも軽く紹介されてます）

今回はニコ動の仕様変更により視聴画面のHTML5版が標準となりました。
そのため、今までと同じように専ブラがリクエストを投げても、想定（Flash版）と違う結果（HTML5版）が返ってきてしまい上手く動かなくなりました。
しかし公式ではまだFlash版の提供は続いており、**明示的にFlash版を指定するCookieを付与することで、**これまで通りFlash版を使用できます。

そこから、**専用ブラウザでもFlash版指定のCookieを付与すれば上手く動くのでは？** という仮定の元アプリケーションを修正し、無事に成功を収めました。
その際の一連の作業内容を以下にまとめます。

※ なお、今回のようなCookie付与に関しては、本記事のようにアプリ自体を書き換えるのではなく、[Proxomitron](http://proxomitron.sakura.ne.jp)や[Fiddler](http://www.telerik.com/fiddler)といったローカルプロキシを使い、リクエストの内容を外部から書き換える手法もあります。

## 作業手順

**※ 必ず事前にexeファイルのバックアップを取りましょう！**
**※ nfinder2（v2.1.0.2）が対象です！**
**※ あくまで個人利用の範囲で行い、修正版を頒布してはいけません！！！**
**※ 本作業における一切の責任を投稿者は負いません！自己責任でお願いします！** 


### 準備
まずは前述の載ってるdnSpyをダウンロードします。
[ここのダウンロードページ](https://github.com/0xd4d/dnSpy/releases)の下の方にあるリンクからzipファイルをダウンロードしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/42f1cd19-8af4-eefc-be70-0fc147fcbc72.png)


ダウンロード後は適当な場所に解凍してください。

### dnSpyの起動
解凍したフォルダにある`dnSpy-x86`を起動します。
すると、下記画像のような黒いアプリケーションが立ち上がります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/b57ae977-9eb5-3849-be09-a8bf1d5de4c0.png)


### nFinderの読み込み
メニューバーより`File` → `Open`をクリックし、`nFinder.exe`を読み込ませます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/8a0a2c95-782c-0db7-c7f5-91ed02eb049c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/e4e5912a-b0b1-544c-1318-4a1a77b0f1bf.png)

`nFinder.exe`を読み込ませると、先ほどの黒いアプリケーションの左最下部に`nFinder2`という項目が追加されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/207395a4-4181-c15f-c80d-4e0890515106.png)


### 修正対象のソースを開く
実際に修正するソースを開きます。

左のツリーを
`nFinder2` → `nFinder2.exe` → `TrinityCS` → `NetUtil`
のように辿ります。
最後の`NetUtil`をクリックすると、今回修正対象であるソースを開けます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/f514cc20-199b-d1f9-323a-f4476d78b43f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/bf2390af-4bc5-a439-aa4f-ca30a5a43314.png)


### ソースの修正とコンパイル

`NetUtil`の **146行目** 辺りに移動します。
その後、右クリックメニューより`Edit Method (C#)`を選び、編集用ウィンドウを開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/25f70294-d298-5710-eb73-95005c7c5950.png)

編集画面はこんな感じ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/2a27519c-9cbf-7d8b-51b2-ec684c44d301.png)

この編集画面の**39行目** の

```
httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
```

の前に

```
httpWebRequest.CookieContainer.Add(new Cookie("watch_flash", "1", "/", ".nicovideo.jp"));
httpWebRequest.CookieContainer.Add(new Cookie("watch_html5", "0", "/", ".nicovideo.jp"));
```

という2行を挿入します。
また、同様に

```
httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
```

の後ろに

```
cookieContainer.Add(new Cookie("watch_flash", "1", "/", ".nicovideo.jp"));
cookieContainer.Add(new Cookie("watch_html5", "0", "/", ".nicovideo.jp"));
```

という2行を挿入し、以下のようにします。

```NetUtil.cs
httpWebRequest.CookieContainer.Add(new Cookie("watch_flash", "1", "/", ".nicovideo.jp"));
httpWebRequest.CookieContainer.Add(new Cookie("watch_html5", "0", "/", ".nicovideo.jp"));
httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
cookieContainer.Add(new Cookie("watch_flash", "1", "/", ".nicovideo.jp"));
cookieContainer.Add(new Cookie("watch_html5", "0", "/", ".nicovideo.jp"));
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/eeb3acc2-87c4-9fd3-6006-cdd05c74fa4c.png)


その後、編集画面右下の`Compile`ボタンを押して修正内容を確定させます。
何もエラーが出ず編集ウィンドウが消えて、親画面の方のソースに書き換えた内容が反映されていれば成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/0e1026c5-5bbb-61a8-03f6-f91f482d3b9d.png)


### 修正版exeファイルの作成
修正が成功したら最後にメニューバーの
`File` → `SaveModule...`
をクリックし、修正したファイルを保存しましょう。

※ もしアクセスが拒否されるなどの理由で保存できない場合は一旦別名で保存してください。
　　その後dnSpyを終了させた後、名称変更するなりして元のファイルに置き換えてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/6c8ff277-4900-dcb3-9104-d49b6e212731.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/0877ef18-1090-5b5c-d857-125c4e91b55d.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/60567ba4-11c2-05bc-49bd-e308e7cd5cb6.png)

### 結果...

仕様変更後の7/14にアップされた動画も無事再生され、コメントも正常に表示されます。
（画像は一部モザイク処理を行っています）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/b6c50a3c-3e92-3614-2b24-aefda99c68cb.png)

※ もし上手く動かなかったか場合は、前回起動した場合のCookieのキャッシュが残っている可能性があります。
　以下の手順でキャッシュを消し、再度試してみてください。

1. nFinderを終了します
2. nfinderのインストールディレクトリの配下にある **`Log`** フォルダの中の **`Cookie.bin`** を削除します
3. nFinderを起動します（ニコ動へのログインのダイアログが表示されるので、IDとパスワードを入力してください）
4. 動画が再生できるようになります


## 余談（投稿者コメントについて）

[こちらの記事](http://qiita.com/ysktn/items/8d49d7b32eb3ffa835bb)に対応策を書きました。（7/17追記）

~~今のnFinderは良い感じにソースにバグがあって、投稿者コメントが取得できません。
修正箇所、内容ともに特定できているのですが、如何せん **exeファイルじゃなくて、Flashのファイル（Resources\SPUTNIK.swf）** に修正を入れる必要があり、少々対応に手間取っています。
[FreeFlash Decompiler](https://www.free-decompiler.com/flash/download/)を用いた逆コンパイル、ソースの修正までは終わっていますが、残念ながら再コンパイルしたものが上手く動かない状態です。~~

~~ちゃんと動くようになればまた手順を公開しますので、期待せずにお待ちください。
→　厳しそうです。色々と手を尽くしましたが、Flashはそんなに詳しくないのと記事の主題がブレるので一旦終了にします。もしいつか成功したときは、再度また記事を書きます。
→　できました。記事を別途書くのでしばしお待ちください。~~