ランタイム暗号化文字列
今日はランタイム暗号化文字列の基本、なぜ文字列を暗号化する必要があるのか、そして独自の暗号化を作成する方法について学びます。
この記事では以下を理解し学びます:
- ランタイム暗号化と復号化とは何か
- なぜ文字列を暗号化する必要があるのか
- 誰でも機密データを閲覧できることを確認する
- 独自のカスタム暗号化を作成する
ランタイム暗号化と復号化とは
プログラム(ソフトウェア、アプリケーション)の実行中に暗号化および/または復号化されるデータのことを指します。データはメモリブロック、ネットワークトラフィック、文字列など、あらゆる種類のものがあります。
この目的で使用される最も一般的な方法の1つは(基本的な)難読化です。その他の(高度な)メカニズムには、コンパイル済みコードの変異/仮想化が含まれます。
今日はXOR難読化 を使用するメカニズムに焦点を当てます。
なぜ文字列を暗号化するのか?
ソフトウェアを実行した瞬間、すべてがメモリ上で可視化されます。これはエンドユーザーにも当てはまり、すべてを見ることができることを意味します。
攻撃者が最初に行うことの1つは、ソフトウェア内の文字列を検索することです。これにより、最小限の労力でソフトウェアのすべてを理解することができます。
機密データ(パスワードやライセンスなど)を保存している場合、平文で保存しないことが非常に重要です。平文で保存すると攻撃者の作業が容易になります。
ソフトウェアを分析する方法はいくつかあります。最もよく知られた一般的な方法は静的解析とランタイム解析です。
コンソールアプリを使用した簡単な例を見てみましょう:
Releaseモードでコンパイルしましょう(デバッグ情報を避けるため)。続けて静的解析とランタイム解析をテストしましょう。
静的解析テスト
静的解析ではソフトウェアを実行する必要はありません。それでは、サンプルをGhidra で開きましょう。
以下のスクリーンショットから、サンプルがデバッグ情報なしでコンパイルされていることがわかります:
文字列を検索すると、すべての機密情報が表示されていることがわかります:
文字列をハイライトすると、デコンパイラビューを開いて関連するすべてのコードを確認できます:
かなり悲しいですよね? 😕 何ヶ月もかけて素晴らしいソフトウェアに取り組み、販売する準備ができたとしましょう。
残りは自明だと思いますが、ポイントは理解していただけたでしょう。
さらに悲しいのは、これが非常に簡単で12歳の子供でもできるということです。(実際にやっている子もいます)
ランタイム解析テスト
ランタイム解析ではソフトウェアが実行中でなければなりません。つまり、プロセスを開いて読み取るソフトウェア(通常はデバッガ)を使用する必要があります。
ただし、この目的にはデバッガは必ずしも必要ではありません。Process Hacker のような無料ツールをダウンロードしてプロセスを開くだけです:
かなり簡単でしたよね?そしてデバッガを接続すらしていないことに注意してください。熟練した決意のある人はデバッガを使用します。
デバッガを接続するとさらに多くのことが見えますが、その議論はまた別の日に。
ランタイム暗号化文字列の作成
これを実現するには多くの方法があります:
最初の2つのオプションはニーズに合わない場合があります。それぞれに多くの長所と短所がありますが、現時点では議論しません。
理解すべきことの1つは、人気はリスクを意味するということです。Googleでランダムに見つけたものを使うと、誰かがすでにそれを知っています。
ほとんどの人があなたのツールに対するツールを開発しています。そういうものです。挑戦として、またはあなたの仕事を盗むために行いますが、とにかく行います。
これを念頭に置いて、カスタムにする必要があります。基本レベルから上級レベルまで独自の文字列暗号化を作成できます。
計画
- 使いやすいソリューションを作成する
- 文字列を常に暗号化された状態に保つ
- 必要な時のみ復号化する
- 文字列をランダムな位置に配置する(オプション - 未対応)
- 使用後に文字列を破棄する(オプション - 未対応)
ソリューション
文字列を1つずつ配列として定義することから始めます:
配列には長さ制限256で無制限の数の文字列を含めることができます。
これは特に文字列が長い場合、困難な作業であることは承知しています。これはデモンストレーション目的のみであり、後でより実用的なソリューションを作成します。
アイデアは文字列の各文字を暗号化することです。これには簡単なXOR暗号化を使用します。
以下にこれがどのように機能するかの例を示します:
上記に複雑なことは何もありません。シンプルでストレートですが、かなり強力です。コンソールアプリケーション内で使用できます。
コンパイルして実行すると、結果は人間の目には読めないバイトになります:
これで、ランタイム暗号化文字列を作成する小さなソフトウェアの完成です。 😏
結果
ソリューションを実践する時間です。この目的のために別のサンプルを作成し、コードを追加しましょう:
2つの重要な点に注意してください:
- 違いを示すために意図的にいくつかの文字列を平文のまま残しました
- 復号化関数には長さが必要です(後で説明します)
上記をReleaseモードでコンパイルして実行します。新しいサンプルは正常に動作します:
新しいサンプルをIDA(またはGhidra)で開くと、暗号化された文字列は表示されません:
このサンプルには意図的に平文のまま残した文字列があると述べました。その理由は、それらを追跡してコードを確認できるからです:
上の画像のテキストに到達するためにスクロールダウンする必要がありました。コンパイルされたコードがどれほど異なるかがわかります。
静的解析の問題を解決しました。次はランタイムに移りましょう。
Process Hackerで開いてみましょう:
やりました!ランタイム解析の問題も解決しました 😎
暗号化文字列についてさらに詳しく
上記の例はあまり実用的ではありません。各文字列を手動で定義するのは骨の折れる作業であり、毎回文字列の長さを指定するのも同様です。
理想的には以下が必要です:
- テキストファイルから文字列を読み取る
- 結果の文字列をテキストファイルに書き込む
- 毎回長さを指定することを避けるために文字列にエスケープシーケンス を追加する
- より複雑なXORまたはその他の方法を追加する(オプション)
- 文字列をランダムな位置に配置する(オプション)
実験できる優れたソリューションを用意しました。この記事に書かれたすべてをテストし、ランタイム暗号化文字列を作成するための独自のツールをすぐに使えるようにすることができます。
4つのプロジェクトが含まれています:
- RuntimeStringEcryptor はテキストファイルから文字列を読み取り、暗号化してから別のテキストファイルに書き込みます。
- Sample はIDAでデモンストレーションするために使用されるシンプルなコンソールです。
- SampleEncryptedStrings はIDAでデモンストレーションするための暗号化文字列を含むシンプルなコンソールです。
- SimpleRuntimeStringEncryption はこの方法をテストできる初期プレイグラウンドです。
注意事項:
- エスケープシーケンスを追加しないと、復号化はいつ「停止」すべきかわかりません。結果は、定義された配列サイズに達するまで読めない/ヌルデータになります。
- 例で使用したXORキーを必ず変更してください。
- 同じ単語を何度も使用することは避けてください。同じバイトが生成され、検出されるリスクがあります。
ダウンロード
すぐに使えるソリューションをダウンロードするには、このブログのサポートをご検討ください 😘
コメント