ニコ厨怒りのデコンパイル（nFinder・投稿者コメント表示対応編）

## あらすじ
[7/13の悲劇](http://qiita.com/ysktn/items/5db244eb4d8e73380a77)から早くも4日が経過した。
ニコ動の仕様変更により一時は阿鼻叫喚の地獄絵図と化したが、[dnSpy](https://github.com/0xd4d/dnSpy)及びそれを使いこなす訓練されたニコ厨により、全ての視聴者がニコニコできる平和な世界が取り戻された。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/c0ce51c6-7267-cf27-66c9-a169d9ac8340.png)

しかし、**まだすべての戦いが終わったわけではない。**

敵は運営だけでなく、別のところにも潜んでいたのだ。
その敵とは……まさかの我らが創造神であった！

彼は我々に素晴らしい叡智を授けたが、その中には一つの呪い（バグ）を潜ませていた。
そう、**投稿者コメントが表示されない**という呪いを……
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/a03430b7-1fbf-bd98-d808-6df3db56201e.png)

---

「バグのせいでさぁ！僕が！どんな想いで毎日過ごしてると思ってるんだよ！！お前絶対許さないからな！？」
「ああああ投稿者コメントくらい表示させせろよ！？ア゛ア゛ア゛ア゛ア゛ア゛ッ！！！」
この、あまりにも理不尽な呪いに対し、民衆は怒りを隠すことができなかった。
そして勇敢にも、呪いへと立ち向かったのだ！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/091d8388-3bd1-3dbd-f405-a21cdabae536.png)

彼らは怒りの力を解き放ち、正しき光で呪いを打ち破った。
そしてついには、何に頼ることもなく、全ての人がニコニコできる世界へと辿り着いたのであった。

---

## 作業概要
はい、しつこくてすいません。

[前回の記事](http://qiita.com/ysktn/items/5db244eb4d8e73380a77)（.Netアプリケーションの修正）に引き続き、今回は[Free Flash Decompiler](https://www.free-decompiler.com/flash/download/)を使ったswfファイルの修正の手順です。

前回の対応でnFinderにおける**動画が再生できない**という問題は解決できました。
しかしnFinderには以前より**投稿者コメントが表示できない**という**バグ**が潜んでいました。
（実はこれバグだったんですね）

投稿者コメントを取得する際に本来は`Content-Type`というヘッダに`text/xml`を指定してHTTPリクエストを投げる必要があるところを、何も指定しないで投げちゃってるせいでデフォルトの`application/x-www-form-urlencoded`が有効になってしまい、サーバから弾かれる結果になっていました。
なぜこんな風になってるかと言うと、作者さんが**HTTPリクエストの後にContent-Typeを設定して**しまっていたからです。
挿入先が1行ズレるとかあるあるですね……

というわけで、今回は**HTTPリクエストを実際に投げる前にContent-Typeを指定する**ようにプログラムを改修するのが目的です。
この程度ならまたdnSpyで簡単じゃーんとか思っていたら大間違い、実は投稿者コメントの取得（というか動画再生関連の全般）は**Flashで動作していたんです！！！**

ということで冒頭の[Free Flash Decompiler](https://www.free-decompiler.com/flash/download/)使い、何とか上手く成功まで辿り着けました。
前回より少し手順が複雑ですが、その一連の流れを紹介します。

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

---

## 作業手順

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

### 準備
まずは[ダウンロードページ](https://www.free-decompiler.com/flash/download/)より、Free Flash Decompilerを落としてきてください。
※ ZIP版でもインストーラ版でもどちらでも構いませんが、今回はZIP版で話を進めます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/2734a139-38fe-438e-e46e-488717d51b2d.png)

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

### Free Flash Decompilerの起動
解凍したフォルダにある`ffdec.exe`を起動します。
すると、今回は青いアプリケーションが立ち上がります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/a60c331e-3892-b604-bd03-6496bd5915cc.png)


**※ Free Flash Decompilerの実行にはJavaが必要です！**
なんかエラーが出て起動しない人は、[こちらのページ](https://java.com/ja/download/)からJavaをダウンロードしてインストールしましょう。

### Free Flash Decompilerの設定変更
メニュータブの`Settings`を開き、**`Disable decompilation (Disassemble only)`**にチェックを入れ、ソースのデコンパイルを無効にします。
（今回のケースでは、デコンパイルしたActionScriptを編集すると再コンパイルしたものが動作不良を起こしたため、アセンブラとして編集を行います）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/73bd57e9-6515-17fd-d80d-1193971a5996.png)

### SPUTNIK.swfの読み込み
`File`タブに戻って`Open`ボタンを押し、修正対象のファイル`SPUTNIK.swf`を読み込ませます。
これは【nFinderのインストールフォルダ】にある`Resources`フォルダの配下にあります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/e0bf5be7-0ece-dbb7-8450-947284985424.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/2c1d2d1b-37f1-dc06-a451-ddd4d5c48d35.png)

ファイルを読み込ませると、左側にSPUTNIKを構成する要素がズラズラっと表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/0d7e760b-b099-5fdf-ae0f-d1621cc0d09e.png)

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

左のツリーを順に
`SPUTNIK.swf` → `scripts` → `co` → `sptnk` → `stage` → `app` → `SPUTNIK`
のように辿ります。
最後の`SPUTNIK`をクリックすると、今回修正対象であるソースを開けます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/3ca54a9f-6d6b-ae0b-6198-0eb6d2dc4796.png)

### ソースの修正と反映
`SPUTNIK`の **2238行目** 辺りに移動します。
`private function getAdminCommentXml() : void`
という行があるので、ここを選択します。
※ 画面右側の上部に **getAdminCommentXml** と表示されていることを確認してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/ff6f0f42-2d21-7e90-7214-a2c3d46c2e7d.png)


次に、画面右下にある`Edit P-code`ボタンを押して編集モードに入ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/b82bbaa7-2a44-e623-2536-a9bdd75a7e3c.png)

編集モードに入ると右枠のP-code欄下部のボタンが2個になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/d16ce3fa-1294-6784-3c18-2955386ab05f.png)

右枠のP-code欄の **85行目** 辺りへ移動し、以下の4行を選択して切り取ります。`Ctrl + x` でOKです。
（自分と同じ状況なら85～88行目になってると思います）

```
getscopeobject 1
getslot 3
pushstring "text/xml"
setproperty Qname(PackageNamespace(""),"contentType")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/f815a6ab-8bb0-10e1-1d98-2cb553137568.png)

次に、切り取った行を**79行目**へ挿入します。
`setproperty Qname(PackageNamespace(""),"data")`の次の行です。
最終的に以下のような並びになっていればOKです。

```
setproperty Qname(PackageNamespace(""),"data")
getscopeobject 1
getslot 3
pushstring "text/xml"
setproperty Qname(PackageNamespace(""),"contentType")
getscopeobject 1
getslot 2
getscopeobject 1
getslot 3
pushbyte 30
callpropvoid Qname(PackageNamespace(""),"loadWithTimeout") 2
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/38d7a354-15d2-ac4d-5b09-dc17b48c3072.png)

最後に画面右下の`Save`ボタンを押します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/8ca1571f-389c-b5da-a32d-1df1307dd4b3.png)

以下のような成功した旨のダイアログが表示されればOKです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/b292886f-6427-e7fb-dd81-f83a4fda8086.png)

### 修正版swfファイルの保存
画面右上の`Save`ボタンを押したら保存完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/fe725986-cae5-e5cf-229a-d0587c54f0dd.png)

投稿者コメントが無事取得・表示できるようになりました！
めでたしめでたし。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192178/7456fde0-ff3f-d75e-887a-636349f4b9a4.png)

※ コメントのズレはフォントの違いなどが原因です。nFinder（というかSPUTNIK）の再生画面の設定からフォントの変更はできますが、コメントアートの再現性は厳しいかもしれません……