AsyncRATとは
AsyncRATは、リモートアクセス型のトロイの木馬(Remote access trojan, RAT)であり、2019年にGitHub1でソースコードが公開された以降、その汎用性の高さから現在もばらまき型のRATの1つとして世界中で猛威を振るっています。 ANY RUN2のマルウェアトレンドトラッカーにおいて、本ブログの執筆時点(2024/06/26)で月間3位であることからもその勢いが分かります。
本ブログではAsyncRATの基本的な機能を解説するとともに、2024年5月7日から6月3日までの約1ヶ月間に収集した複数のAsyncRATの亜種を調査し、追加されている機能や展開方法をまとめます。
AsyncRATの基本的な機能
AsyncRATは.NET Framework3でビルドされたRATです。そのため.NETのデバッガでありディスアセンブラでもあるdnSpy4を用いて解析できます。 一部の検体は難読化されていることがあるため、その場合はde4dot5を用いて難読化を解除してからdnSpyで解析をします。
本章ではAsyncRATの基本的な機能を解説します。
AsyncRATの設定情報
AsyncRATで最も特徴的であるのが設定情報です。 設定情報はAES256で暗号化の上、Base64でエンコードされています。
定義されている設定項目は下記の通りです。
| 設定項目 | 説明 |
|---|---|
| Ports | C2サーバの宛先ポート番号 |
| Hosts | C2サーバのIPアドレスまたはURL |
| Version | AsyncRATのバージョン情報 |
| Install | インストールの有無 (true:有, false:無) |
| InstallFolder | インストール先のフォルダ |
| InstallFile | インストールする際に使用するファイル名 |
| Key | AES256暗号鍵 |
| MTX | 生成するミューテックスオブジェクト名 |
| Certificate | C2サーバとの通信に使用するSSL証明書 |
| ServerSignature | サーバ署名 |
| Anti | 対解析機能の実行有無 (true:実行, false:実行しない) |
| Pastebin | Pastebin[.]comのURLまたはnull |
| BDOS | 重要なシステムプロセスとしての実行有無 (true:実行, false:実行しない) |
| Hwid | ハードウェアID (初期値:null) |
| Delay | メイン機能を実行するまでのスリープ時間[s] |
| Group | セキュリティグループ |
暗号化されている設定情報を復号するための関数はClient.AlgorithmモジュールのAes256クラスにあるDecrypt関数で定義されています。 この関数は設定情報をBase64デコードした文字列を引数として受け取り復号します。
Decrypt関数内にある変数_keyや_authKeyはAes256クラスで定義されています。
引数のmasterKeyは設定情報のKeyの値をBase64デコードすることで得られるAES256暗号鍵です。
Aes256.SaltはAes256クラスにハードコーディングされています。
付録のプログラムもしくはdnSpyのデバッガ機能を用いて設定情報を復号すると次のような結果が得られます。CertificateおよびServerSignatureは一部省略して表示しています。
この結果より次のことが分かります。
- 本検体はC2サーバである
iphy[.]ooguy[.]com:1604に通信する。 - バージョンが
0.5.8である。 %AppData%/Window11.exeに自身をコピーする。- ミューテックスオブジェクト
qBaMI7PsO7yMを生成する。 - 対解析機能および重要なシステムプロセスとして実行する機能がオフである。
Defaultのセキュリティグループとして実行する。
| 設定項目 | 設定情報 |
|---|---|
| Ports | 1604 |
| Hosts | iphy[.]ooguy[.]com |
| Version | 0.5.8 |
| Install | true |
| InstallFolder | %AppData% |
| InstallFile | Windows11.exe |
| Key | WlIMk5Fjn5usYR06xPHUy1oBqsxshEHK |
| MTX | qBaMI7PsO7yM |
| Certificate | MIIE8jCCAtqgAwIBAgIQAK+/pZzuA/uM/…(Snipped) |
| ServerSignature | oLUGQbetJeyhi1Vo5GJDU+CSkVpB4FMAH3JPaccCpBtZ2V+VpBmOobwCdR/…(Snipped) |
| Anti | false |
| Pastebin | null |
| BDOS | false |
| Hwid | null |
| Delay | 3 |
| Group | Default |
PastebinにPastebin[.]comのURLが設定されている場合、AsyncRATはそのURLにアクセスし、C2サーバのIPアドレスもしくはURLを取得します。
Hwidには感染端末の論理プロセッサ、ユーザ名、マシン名、OSのバージョン情報、ディスク容量をそれぞれ文字列に変換し、それらを結合した文字列をハッシュ化した値が格納されます。
AsyncRATのメイン機能
AsyncRATのメイン関数は下記の通りです。
| 関数名 | 説明 |
|---|---|
| InitilizeSettings | 設定情報の復号 |
| CreateMutex | ミューテックスオブジェクトの生成 |
| RunAntiAnalysis | 対解析機能 |
| Install | 永続化 |
| Set | 重要なシステムプロセスとして設定 |
| PreventSleep | 感染端末がスリープ状態でも動作するように設定 |
| Reconnect | C2サーバに接続 |
| InitializeClient | C2サーバと通信 |
対解析機能としてAsyncRATから下記の5つの関数を確認しています。
設定のAntiがtureの場合は対解析機能が実行され、これらの関数のいずれかがtrueを返した場合、動作を終了します。
| 関数名 | 説明 |
|---|---|
| DetectManufacturer | VMWare, VirtualBoxなどの仮想環境検知 |
| DetectDebugger | CheckRemoteDebuggerPresent関数を使用したデバッガ環境検知 |
| DetectSandboxie | SbieDll.dllを確認することによるサンドボックス環境検知 |
| IsSmallDisk | ディスク容量(61GB以下)を確認することによる解析環境検知 |
| IsXP | Windows XP検知 |
永続化機能はAsyncRATが管理者権限で実行されているかで動作が変化します。
管理者権限で実行されている場合はschtasksコマンドを使用してタスクに自身を登録します。
タスクとして登録したパスは設定項目にあるInstallFolderおよびInstallから取得するため、本検体の場合は%AppData%\Windows11.exeになります。
管理者権限でない場合はレジストリキーHKCU\Software\Microsoft\Windows\CurrentVersion\Runに自身を登録します。
続いて権限に関係なく%Temp%フォルダに自身を実行する内容が記載されたbatファイルを生成します。batファイルのファイル名は実行ごとに変化します。
@echo off
timeout 3 > NUL
START "" "C:\Users\Admin\AppData\Roaming\Windows11.exe"
CD C:\Users\Admin\AppData\Local\Temp
DEL "tmpCAE1.bat" /f /q
C2サーバとの通信を行うための機能を持つReconnect関数は既存のセッションが存在する場合は一旦セッションをリセットし、再度C2サーバに接続します。
InitializeClient関数はC2サーバに感染端末の情報を送信します。
| 送信情報 | 説明 |
|---|---|
| Packet | 文字列"ClientInfo" |
| HWID | ハードウェアID |
| User | ユーザ名 |
| OS | OSの情報 |
| Path | AsyncRATの実行パス |
| Version | AsyncRATのバージョン |
| Admin | 管理者権限である場合: “Admin”, それ以外: “User” |
| Performance | 現在アクティブであるウインドウの名前 |
| Pastebin | 設定のPastebinの値 |
| Antivirus | 感染端末にインストールされているアンチウイルス製品名 |
| Installed | AsyncRATのインストール時刻 |
| Pong | 空白 |
| Group | 設定のGroupの値 |
感染端末の情報を送信後、AsyncRATは待ち受け状態に入ります。 C2サーバから送信されるプラグインを受け取り、様々な機能を実現します。 攻撃者によって使用するプラグインは異なりますが、ソースコードにあるデフォルトのプラグインは次のようなものがあります。
| プラグイン | 説明 |
|---|---|
| Chat | チャット機能 |
| Extra | Windows Defender無効化機能、壁紙変更機能 |
| FileManager | ファイル操作機能 |
| FileSearcher | ファイル検索機能 |
| LimeLogger | キーロガー機能 |
| Miscellaneous | その他の機能(Bot機能、Dos機能、.NETコード実行機能) |
| Options | 感染端末設定変更機能、UAC(ユーザアカウント制御)回避機能、アンインストール機能 |
| ProcessManager | プロセス操作機能 |
| Recovery | PC, ブラウザ, DB内の認証情報窃取機能 |
| RemoteCamera | Webカメラ操作機能 |
| RemoteDesktop | リモートデスクトップ機能 |
| SendFile | ファイル送信機能 |
| SendMemory | メモリにデータを送信する機能 |
以上がAsyncRATの基本的な機能となります。
AsyncRATの亜種の解析
本章では2024年5月7日から6月3日までの約1ヶ月に収集した複数のAsyncRATの亜種を解析することで、現在AsyncRATに攻撃者によって追加された機能や使用されている展開方法を明らかにします。
収集方法
VirusToal6およびMalware Bazaar7にアップロードされた11検体を収集しました。
VirusTotalからはファミリ名がasyncratであり、直近にアップロードされた検体で、かつ過去にアップロードされた検体と同一のハッシュ値でない検体を取得しました。Malware Bazzarからはtag:AsyncRATで検索した結果の中で直近にアップロードされた検体を取得しました。
追加された機能
キーロガー機能
プラグインではなくAsyncRATそのものにキーロガー機能が搭載されている検体8がありました。
設定情報を確認するとkeylogparamという項目が追加されていることが分かります。
KeylogParamsクラスにはキーロガーの設定ファイルであるDataLogs.confのパス、感染端末がオフラインであるときのキーロガーの出力先であるDataLogs_keylog_offline.txtのパス、感染端末がオンラインであるときのキーロガーの出力先であるDataLogs_keylog_online.txtのパス、競合を避けるためのミューテックスオブジェクト名がハードコーディングされています。
そしてメインモジュールにKeyloggerクラスが追加されており、このクラスにキーロガー機能が定義されています。
他検体との連携機能
収集した検体の中には他検体と連携している検体9がありました。 dnSpyで読み込むと基本的なAsyncRATと比較して様々なモジュールが追加されていることが分かります。
また設定情報にもTelegramToken, TelegramChatIDが追加されています。
設定情報の復号方法は変わらないため、付録のプログラムで復号するとTelegramトークンとチャットIDが得られます。
| 設定項目 | 設定情報 |
|---|---|
| TelegramToken | MTIxOTQwMjM3MTUzNzU3MTg0MA.Gytkhu.w-d-C6RfbxaOnr_dDaiutKUeYN30qu |
| TelegramChatID | 5038570348 |
本検体はこのトークンとチャットIDを使用してTelegramのチャットに感染端末の情報を送信します。
すなわちTelegramが本検体のC2サーバとして機能します。
Hostsの設定情報を復号するとローカルのIPアドレスである127.0.0.1が得られることからも、このことを裏付けています。
C2サーバであるTelegramのURLや収集する情報はAsyncRATとは異なる方法で暗号化された値がハードコーディングされていますが、付録のプログラムで復号することができます。
復号された通信先や収集する情報の一覧は下記の通りです。
C2サーバであるtelegramのURLがhxxps[:]//api[.]telegram[.]org/botです。
api[.]mylnikov[.]orgは感染端末の位置情報を、icanhazip[.]comは感染端末のグローバルIPアドレスを取得するためにアクセスします。
本検体が収集した情報は%AppData%\Local配下の隠しフォルダに保存し、適宜C2サーバに送信します。
URL
hxxps[:]//api[.]anonfiles[.]com/upload
hxxps[:]//api[.]telegram[.]org/bot
hxxps[:]//api[.]mylnikov[.]org/geolocation/wifi?v=1.1&bssid=
hxxp[:]//icanhazip[.]com
hxxp[:]//discordapp[.]com/api/v6/users/@me
収集する情報
\Chromium\User Data\
\Google\Chrome\User Data\
\Google(x86)\Chrome\User Data\
\Opera Software\
\MapleStudio\ChromePlus\User Data\
\Iridium\User Data\
\7Star\7Star\User Data\
\CentBrowser\User Data\
\Chedot\User Data\
\Vivaldi\User Data\
\Kometa\User Data\
\Elements Browser\User Data\
\Epic Privacy Browser\User Data
\uCozMedia\Uran\User Data\
\Fenrir Inc\Sleipnir5\setting\modules\ChromiumViewer\
\CatalinaGroup\Citrio\User Data\
\Coowon\Coowon\User Data\
\liebao\User Data\
\Orbitum\User Data\
\Comodo\Dragon\User Data\
\Amigo\User\User Data\
\Torch\User Data\
\Yandex\YandexBrowser\User Data\
\Comodo\User Data\
\360Browser\Browser\User Data\
\Maxthon3\User Data\
\K-Melon\User Data\
\Sputnik\Sputnik\User Data\
\Nichrome\User Data\
\CocCoc\Browser\User Data\
\Uran\User Data\
\Chromodo\User Data\
\Mail.Ru\Atom\User Data\
\BraveSoftware\Brave-Browser\User Data\
\Mozilla\Firefox
\Waterfox
\K-Meleon
\Thunderbird
\Comodo\IceDragon
\8pecxstudios\Cyberfox
\NETGATE Technologies\BlackHaw
\Moonchild Productions\Pale Moon
\Microsoft\Edge\User Data
正規表現
"btc", (?:^(bc1|[13])[a-zA-HJ-NP-Z0-9]{26,35}$)
"eth", (?:^0x[a-fA-F0-9]{40}$)
"xmr", (?:^4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}$)
"xlm", (?:^G[0-9a-zA-Z]{55}$)
"xrp", (?:^r[0-9a-zA-Z]{24,34}$)
"ltc", (?:^[LM3][a-km-zA-HJ-NP-Z1-9]{26,33}$)
"bch", ^((bitcoincash:)?(q|p)[a-z0-9]{41})
このようにベースはAsyncRATですが、実態は大きく異なり、TelegramをC2サーバとする亜種であることを確認しています。
展開方法
ローダー型
一部のAsyncRATは別の検体のリソースセクションから展開されたり、C2サーバからダウンロードすることで展開されたりといった、いわゆるローダーから展開されていました。
ローダー型の検体A10は自身のリソースセクションにAsyncRATを難読化した状態で保存していました。 ローダーが実行されると自身のリソースセクションを参照して復号し、AsyncRATを展開、実行します。 本検体はユーザを騙して実行させるためにWebブラウザの1つであるFirefoxのアイコンを利用しています。
ローダー型の検体B11は自身のリソースセクションからWebブラウザの1つであるGoogle Chromeに偽装したCHROMEL.exeとWindowsの標準サービスに偽装したPRINTSERV.exeを展開しました。
CHROMEL.exeもまたローダーであり、自身のリソースセクションからAsyncRATを展開し実行します。PRINTSERV.exeはXENO RAT12と呼ばれる別のマルウェアファミリである検体です。
ローダー型の検体C13はダウンロードサーバから1755.binをダウンロードして実行しました。
この1755.binがAsyncRAT本体です。
変わり種としてローダ型の検体D14がありました。
ファイルの拡張子はtxtなのですが、中身はvbaファイルとなっています。
このローダーを実行するとダウンロードサーバ(hxxp[:]//104[.]243[.]40[.]225:222)にアクセスしてHHAMMOFATHEATBBDNN.jpgをダウンロードし、C:\Users\Public\safsafasasdsfwrvb.zipとして保存し解凍します。
このzipファイルには下記の6つのファイルが格納されていました。
C:\Users\Public\safsafasasdsfwrvb.zip
|-- MVVELJTYVGCFOMOS.vbs
|-- BATTATTA.bat
|-- LXHNZEZFHPFSAEGF.ps1
|-- YAGURQWHFBHUIOUB.vbs
|-- WEBACKAGAIN.bat
`-- KBNSOCSXACHWORKRY.ps1
解凍されるとMVVELJTYVGCFOMOS.vbsが実行され、このvbsファイルがBATTATTA.batを実行、batファイルがLXHNZEZFHPFSAEGF.ps1を実行します。
このPowerShellスクリプトは2分毎にYAGURQWHFBHUIOUB.vbsが実行されるようにWINDOWSUPDATE12という名前のタスクを作成して登録します。
YAGURQWHFBHUIOUB.vbsがWEBACKAGAIN.batを実行し、このbatファイルがKBNSOCSXACHWORKRY.ps1を実行します。
このPowerShellスクリプトには2つの実行ファイルのバイナリがハードコーディングされており、その1つがAsyncRATです。
インジェクション型
攻撃者はアンチウイルス製品の検知を避けるために、正規のプロセスに悪意のあるコードを挿入(インジェクション)します。 一部のAsyncRATはこの手法を使用していました。
インジェクション型の検体A15は、Windowsの正規のプロセスであるRegasm.exeに自身のリソースセクションにあるバイナリをインジェクションすることで、正規のプロセスとしてAsyncRATと別のマルウェアファミリであるAgentTeslaを実行しました。
前節で解説したローダー型の検体Cがダウンロードした1755.binはDonut16でシェルコード化されたAsyncRATであり、Windowsの正規のプロセスにインジェクションされることで動作するインジェクション型の検体B17でした。
下記の手順を踏むことで、Donutでシェルコード化された本検体を復元することができ、AsyncRATであることが確認できます。
git cloneコマンドを使用してDonutをダウンロードします。- 適当なディレクトリで
dotnet new consoleコマンドを実行して.NETプロジェクトを作成し、1.でダウンロードしたDonut\DonutTest\Program.csをコピーします。 - シェルコードである
1755.binのBase64文字列を取得します。 - 2.でコピーした
Program.csの13行目および14行目にあるBase64文字列を3.で取得したBase64文字列に置き換えます。 dotnet buildコマンドを実行してビルドします。- メモ帳(
notepad.exe)等の適当な実行ファイルを実行してプロセスIDを控えます。 - 6.で控えたプロセスIDを引数として、5.でビルドした実行ファイルを実行します。e.g.
test.exe <pid> - 標準出力からインジェクションが成功したことを確認して、System Informer(旧Process Hacker)等を用いてインジェクションした実行ファイルのメモリダンプを取得し保存します。
- HxD等のバイナリエディタとPEStudio等のオフセットが確認できるツールを用いて、8.で取得したメモリダンプからAsyncRATを抽出します。
まとめ
本ブログではばらまき型RATの1つであるAsyncRATについて解説しました。 AsyncRATの基本的な機能から、2024年5月7日から6月3日の約1ヶ月に収集した最新のAsyncRATの中で、特に興味深かった追加機能や展開方法についてまとめました。
NICTでは今後も様々なRATの解析を実施する予定です。
付録
IoC
| SHA256 |
|---|
| 12edd518db3703d35067a54f08781830b3496f7f5b79d19eadf15d766de4d6b1 |
| 272e394711c3c4e7c3cf18d2976dc20eef0f48e41f942911a5e4766e472847a0 |
| 0824eac1ce23de2321bce82efce874ab3c213d15f1a120d8ec08c85c7fbc250b |
| 61309415bb524bba3d6065cf5df5ce2031ddde239c7f7864d0d2eaf31597a96c |
| 6ce2b4a0e176126f0899223eace35c31b544e46a2067b0ecf0adf8d06f87309d |
| 2b2026ff6c967238676cf63233f01bfb3d18805def906cc3b9c1674940b91a21 |
| 75c8200b287fcf73263092da4c5ac742ee1a65e3b48cebada4766851594020d2 |
| 4bcc19c324294a3b92ed5067ca495f51a05362edcb2cf7c09d8619842a25a99c |
| f7a799484e79f56a1bcc4878744a3384f98441a0e0e688599c7822da8c519d5c |
| a2007da837ca22cd0e894946f9ce20a3352ac42c34c5930c159730ea4538e79b |
| 6c0291916555438da7d3705991100d295d480ae58b98147a4d83fbd3cfb8dc19 |
| 6faac0b511cf2eb67fbb1152d95aec12a97fa98267aeda6c91884e8f3ad09936 |
| de68a04b9c1b2c4a6b1e3063a413183ca5eb896fe396282b37770f6459c95045 |
| 90efa2e75e2102942fba13cb4a5744530cd85e84fcfc8d7ddccdc17081ac3f69 |
| 9852cddb4ca117d758dd1f7fb7acd21bda527d9db32ff4e5b56bf1cf9c84a9d2 |
| 898a205a94055456f1146d108e12b54093d043b298a1ade8ffec26a46feb4f2e |
| 9a778a752a6bf8fa1fd175fe45a274678b7685939897559b90d9c8fe2022d9b8 |
| a04e51d1511b2449fef2cc6e304ce6dd56cb3b68de39a2d2dde04563a87002d7 |
| f338daab4aa9420e2ab7d2af82638d9057478e0a255672e6b1f7f2e30dfd7cde |
| 5b1b7bd1fadfc3d2abcd8ea8f863fe96233e1dac8b994311c6a331179243b5cd |
| 3de3cca7341ac19f1641ad9463cb4dacb0457fa2dc18e40d4ebe514130651187 |
| 629ef96921c67d7102df6138b3085ff4dca0ae1796cc755752bd0ce876b36ac0 |
| 18238db244f487a5b4cefcf3251f72dd3965404d65d222471ee69a8eba4b7a58 |
| b84eb711989fbe9e0ff3ec874b5a0dac33655d27929fdce619ea94a35dca8953 |
| 15c37fc34c843c04dd97fdb40a9c767c0964a02ee7c0d9b22fd67a85fcf39a8a |
| f3ca9acf4dacd8c8ea86afa291751359c251ddce15b58916422fde6480a8e9e1 |
| db5850b73ea19021d9e2ed567f87e5d6bfb99cf3679bc124bcc22ec21e32f403 |
| 83244f083a7fe5650653c26a5ec7251cf148500071e4e25ca925f5a26810e7ed |
| f03e941d050826b288bf5bfb36def419d4e89bba8976ead214db405585af5308 |
復号プログラム
AsyncRATの設定情報を復号するための.NETのソースコードです。
dotnet new consoleコマンドで.NETプロジェクトを作成し、dotnet runコマンドを実行することで暗号化されている設定情報を復号できます。
ソースコード中の[Key], [Base64文字列], Saltは適宜変更してください。
using System;
using System.IO;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
Aes256 aes256 = new Aes256(Encoding.UTF8.GetString(Convert.FromBase64String("[Key]")));
string decrypt = aes256.Decrypt("[Base64文字列]");
Console.WriteLine(decrypt);
public class Aes256
{
public Aes256(string masterKey)
{
using (Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(masterKey, Aes256.Salt, 50000))
{
this._key = rfc2898DeriveBytes.GetBytes(32);
this._authKey = rfc2898DeriveBytes.GetBytes(64);
}
}
public string Decrypt(string input)
{
return Encoding.UTF8.GetString(this.Decrypt(Convert.FromBase64String(input)));
}
public byte[] Decrypt(byte[] input)
{
byte[] decrypt;
using (MemoryStream memoryStream = new MemoryStream(input))
{
using (AesCryptoServiceProvider aesCryptoServiceProvider = new AesCryptoServiceProvider())
{
aesCryptoServiceProvider.KeySize = 256;
aesCryptoServiceProvider.BlockSize = 128;
aesCryptoServiceProvider.Mode = CipherMode.CBC;
aesCryptoServiceProvider.Padding = PaddingMode.PKCS7;
aesCryptoServiceProvider.Key = this._key;
using (HMACSHA256 hmacsha = new HMACSHA256(this._authKey))
{
byte[] array = hmacsha.ComputeHash(memoryStream.ToArray(), 32, memoryStream.ToArray().Length - 32);
byte[] array2 = new byte[32];
memoryStream.Read(array2, 0, array2.Length);
}
byte[] array3 = new byte[16];
memoryStream.Read(array3, 0, 16);
aesCryptoServiceProvider.IV = array3;
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aesCryptoServiceProvider.CreateDecryptor(), CryptoStreamMode.Read))
{
byte[] array4 = new byte[memoryStream.Length - 16L + 1L];
byte[] array5 = new byte[cryptoStream.Read(array4, 0, array4.Length)];
Buffer.BlockCopy(array4, 0, array5, 0, array5.Length);
decrypt = array5;
}
}
}
return decrypt;
}
public readonly byte[] _key;
public readonly byte[] _authKey;
public static readonly byte[] Salt = new byte[]
{
191, 235, 30, 86, 251, 205, 151, 59, 178, 25,
2, 36, 48, 165, 120, 67, 0, 61, 86, 68,
210, 30, 98, 185, 212, 241, 128, 231, 230, 195,
57, 65
};
}
他検体と連携する検体にハードコーディングされている暗号化されたバイト列を復号するための.NETのソースコードです。
ソースコード中の[復号するバイト列]は適宜変更してください。
using System;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
string path = StringsCrypt.Decrypt(new byte[]
{[復号するバイト列]});
Console.WriteLine(path);
public class StringsCrypt
{
public static string Decrypt(byte[] input)
{
byte[] array = null;
using (MemoryStream memoryStream = new MemoryStream())
{
using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
{
rijndaelManaged.KeySize = 256;
rijndaelManaged.BlockSize = 128;
Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(StringsCrypt.cryptKey, StringsCrypt.saltBytes, 1000);
rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);
rijndaelManaged.Mode = CipherMode.CBC;
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateDecryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(input, 0, input.Length);
cryptoStream.Close();
}
array = memoryStream.ToArray();
}
}
return Encoding.UTF8.GetString(array);
}
public static readonly byte[] saltBytes = new byte[]
{
byte.MaxValue, 64, 191, 111, 23, 3, 113, 119, 231, 121,
252, 112, 79, 32, 114, 156
};
public static readonly byte[] cryptKey = new byte[]
{
104, 116, 116, 112, 115, 58, 47, 47, 103, 105,
116, 104, 117, 98, 46, 99, 111, 109, 47, 76,
105, 109, 101, 114, 66, 111, 121, 47, 83, 116,
111, 114, 109, 75, 105, 116, 116, 121
};
}
参考文献
-
https://dotnet.microsoft.com/ja-jp/download/dotnet-framework ↩︎
-
SHA256:a360b0c660e2902008ed336e03149487b058604819f2404b2e4232792638985c ↩︎
-
SHA256:83244f083a7fe5650653c26a5ec7251cf148500071e4e25ca925f5a26810e7ed ↩︎
-
SHA256:12edd518db3703d35067a54f08781830b3496f7f5b79d19eadf15d766de4d6b1 ↩︎
-
SHA256:0824eac1ce23de2321bce82efce874ab3c213d15f1a120d8ec08c85c7fbc250b ↩︎
-
SHA256:2b2026ff6c967238676cf63233f01bfb3d18805def906cc3b9c1674940b91a21 ↩︎
-
SHA256:6faac0b511cf2eb67fbb1152d95aec12a97fa98267aeda6c91884e8f3ad09936 ↩︎
-
SHA256:4bcc19c324294a3b92ed5067ca495f51a05362edcb2cf7c09d8619842a25a99cd ↩︎
-
SHA256:75c8200b287fcf73263092da4c5ac742ee1a65e3b48cebada4766851594020d2 ↩︎