> For the complete documentation index, see [llms.txt](https://snowyowls-organization.gitbook.io/snowyowl644-hacklog/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://snowyowls-organization.gitbook.io/snowyowl644-hacklog/pentest_technique/js-nan-du-hua-nan-du-hua-jie-chu.md).

# JS 難読化・難読化解除

## 概要

* コードの難読化解除（デオブファスケーション）は、コード解析やリバースエンジニアリングにおいて非常に重要なスキル
* レッドチーム／ブルーチーム演習では、しばしば機能を隠すために難読化されたコードに遭遇する
  * マルウェアが難読化されたJavaScriptを使って本体のペイロードをダウンロードするようなケース

サイトのコードを見ると、このように難読化されていることがある

* これが難読化
  * パッと見て、どんな処理をしているのかわからない

```js
eval(function (p, a, c, k, e, d) { e = function (c) { '...SNIP... |true|function'.split('|'), 0, {}))
```

難読化とは、人間がコードを読みにくくするための技術

* コードとしての機能や処理結果は変わらない
* 難読化ツールによって自動的に実行される
  * 多くの難読化ツールは、コード内のすべての単語や記号を辞書化し、それらをもとに**実行時に元のコードを再構築**するような手法を用いる
* JSはユーザーから参照できるので、コードを難読化して保護するという手法がよく使われる
* 実際のところ、**難読化は攻撃目的で使われることが最も多い**
  * 侵入検知システム（IDS）や防御システム（IPS）を回避するために難読化される

## 主要な難読化手法

### 圧縮

* ミニファイとは？
  * 改行や空白を除き、コードを1行に圧縮したもの
  * コードの機能はそのままだが、読みづらくなる
* &#x20;ミニファイされたJavaScriptファイルは .min.js 拡張子が使われることが多い ![](https://i.imgur.com/aYtABFq.png)

### パッキング

* BeautifyTools の JavaScript Obfuscator を使う
  * <https://beautifytools.com/javascript-obfuscator.php#>

実際にパッキングすると、このように難読化される ![](https://i.imgur.com/R1of6gC.png)

* 特徴
  * function(p,a,c,k,e,d) という6つの引数が使われるのが一般的
  * コード中の単語や記号を**リストや辞書形式に変換**し、実行時に**再構築**
  * p,a,c,k,e,d はそれぞれの文字列や記号の位置関係を指定するために使われる
* 注意点
  * 文字列が平文のまま残っていることが多く、そこから機能がバレる可能性がある

### そのほかの難読化手法

* 多重暗号化
* Base64
* 変数名置換

### 高度な難読化手法

* 完全に難読化し、オリジナルの痕跡を一切残さないようなツールを使ってみる
* Obfuscator.ioの使用する
  * <https://obfuscator.io/>
* 設定からString Array Encoding を Base64 に変更する
  * ![](https://i.imgur.com/KnspvFl.png)

オリジナルのJSコードをペーストして、「Obfuscate」をクリック ![](https://i.imgur.com/KPkLROh.png)

難読化済みの出力

* Evaluateを押すと、正常に実行できていることがわかる ![](https://i.imgur.com/RDa4Ebf.png)

全く、オリジナルのJSコードがわからない状態になる

* 設定で、もっと難読化することもできる
  * だけど、やりすぎるとコード実行時の処理が重くなるため、**パフォーマンスに悪影響**を与える可能性がある
  * 特に JJ Encode や AA Encode のような特殊なオブファスケーターは、実行速度が著しく低下する
  * 通常はここまでやらない

## 難読化解除

### 整形

* 圧縮されて、一行になっているものを読みやすい形式に戻すこと
* Firefox なら以下の手順で可能
  1. \[Ctrl + Shift + Z] を押して「デバッガー」を開く
  2. スクリプト secret.js を選択
  3. 画面下部の { }（Pretty Print）ボタン をクリック

確かに見やすくなった ![](https://i.imgur.com/Di4FTQO.png) 以下のオンライン整形ツールを使っても綺麗に整形できる

* [Prettier Playground](https://prettier.io/playground/)
* [Beautifier.io](https://beautifier.io/) ![](https://i.imgur.com/FOOzOkh.png)

しかし、まだコードの意味はわかりづらいまま → 難読化もされてるため

### パッキングの解除

* 難読化解除ツールを使ってコードをわかりやすい状態に戻す
  * [UnPacker](https://matthewfl.com/unPacker.html)というツールがある

確かに難読かが解除されて普通に読める形になっている ![](https://i.imgur.com/nh9J3df.png)

* ただし、難読化がさらに高度になると、ツールだけでは解析不可能な場合がある
  * 特にカスタム難読化ツールが使われている場合には、
    * 手動でコードを解析
    * 元のロジックを推測
    * ステップごとに出力を確認することが必要になる

何でエンコードされているのかがわかるツール

* <https://www.boxentriq.com/code-breaking/cipher-identifier>

## 参考

<https://academy.hackthebox.com/course/preview/javascript-deobfuscation>
