SoftEtherVPN Serverの実行ファイルを書き換えて証明書認証を有効化してみた

#この記事の対象者
- SoftEther VPN Serverのリージョンロックを外したい人
- Windowsを使っていて、ソースコードからのビルドができない人
- 但し、C言語やアセンブリの知識がない場合はこの記事で紹介している内容は難易度が高いのでおすすめできない

#注意
今回紹介するものはすべて自己責任で行ってください。
再配布したいなどの場合は自分でよく調べてください。

#実行環境
- Windows10 64bit
- メモリ 32GB
- CPU Intel Core i7-10700K

#書き換えたファイル
- [SoftEtherVPN Server](https://ja.softether.org/) (Ver 4.38, Build 9760, rtm)

#使用したソフト
- [IDA Free](https://hex-rays.com/ida-free/) (Version 7.6.210526 Windows x64)
- [FavBinEdit](https://www.wabiapp.com/FavBinEdit/) (バイナリエディタなら何でもいい)

#なんでバイナリエディタを使って変更しようと思ったか
SoftEtherVPNは日本ではソースコードの権利の問題で証明書認証などの機能が無効化されている。Googleで「SoftEther VPN リージョンロック」などで調べると出てくるが、これはソースコードを変更したうえで自分でビルドすれば回避できる。自分も当初はソースコードを書き換える方法でやろうと思っていたが、Web上で紹介されている手順は主にLinux向けで、Windowsで行った例が少なすぎた。[公式の手順書](https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/blob/v4.38-9760-rtm/BUILD_WINDOWS.TXT)を読んでやってみようと思ったが、使っているツールが古すぎて断念した。（Visual Studio 2008なんて持ってない）
ソースコードを書き換える内容だが、一部のコードをほんの少し書き換えるだけで良いと書いてあったので、「これなら既存の実行ファイルを書き換えてもいいんじゃないか」と思ってやってみることにした。この方法の良い点は開発環境の整備が必要ないこと（IDEやコンパイラやその他）、悪い点は非常に根気がいることだと思っている。

#手順
###必要なツール及びSoftEtherVPNのインストール
「使用したソフト」に書いてある2つのソフトと、SoftEtherVPN ServerをPCにインストールする。
###作業用フォルダにファイルをコピーする
SoftEtherVPN Serverの実行ファイルを適当なフォルダにコピーする。
デフォルトのパスは「C:\Program Files\SoftEther VPN Server\vpnserver_x64.exe」
###IDA Freeでコピーしたファイルを開く
IDA Freeを立ち上げてウィンドウにD&Dする。
出てくるウィンドウは何もいじらずOKでよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898433/d102772d-a5ac-a750-a809-4e977295f35d.png)
その後にもう一回何か聞かれたらNoでよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898433/998c1e2a-9e5b-ef2b-78b3-7a6e418f0814.png)
###どこを書き換えるか探す（読みたい人だけどうぞ）
SoftEtherVPNのStableソースコードは[ここ](https://github.com/SoftEtherVPN/SoftEtherVPN_Stable)で見れる。今回は「[src/Cedar/Server.c](https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/blob/v4.38-9760-rtm/src/Cedar/Server.c)」の10902行目、SiIsEnterpriseFunctionsRestrictedOnOpenSource()の「ret = true」を「ret = false」に書き換えたい。
ソースコードを読んでいくとSiGetCurrentRegion(), Table.cのGetCurrentLangId(), GetCurrentLang(), current_lang, InitTable(), GetBestLangForCurrentEnvironment(), Microsoft.cのMsGetUserLocaleId(), GetUserDefaultLCID()と辿ることができる。
このGetUserDefaultLCID()はKERNEL32に含まれる関数なので、IDA FreeのImportタブでフィルタをかけると出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898433/16124044-c5bd-2c2c-a38c-809400dc8c29.png)

出てきたらダブルクリックすると下のような画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898433/5491edad-bcb4-833e-a4e1-27a27c1d022d.png)
赤線を引いた部分をダブルクリックすると別の場所に飛ぶが、それがMsGetUserLocaleId()と同じである。気になる人はソースコードとIDAの画面を見比べてみるといいと思う。IDAでF5キーを押すとデコンパイラが使えるので、その機能を使うとよりイメージがわきやすいと思う。
そこからはソースコードと見比べながら変数や関数を辿ってSiIsEnterpriseFunctionsRestrictedOnOpenSource()を探す。
###バイナリを書き換える
IDAで書き換える部分を調べると、こんなコードにたどり着く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898433/3b0493c4-ba5b-f92c-173d-d45cd2f92ae4.png)
この緑の部分のreturn 1がソースコードの「ret = true」に該当するので、これをreturn 0に書き換えたい。Hex Viewタブに移動すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898433/46391802-71b2-ba9e-b346-f3a396631d54.png)
このように表示される。この「C7 84 24 B0 00 00 00 01 00 00 00」を「C7 84 24 B0 00 00 00 00 00 00 00」に書き換えることでreturn 1がreturn 0になってリージョンロックを外すことができる。
それでは実際に書き換えていく。バイナリエディタでSoftEtherVPN Serverの実行ファイルを開いて、赤線で囲んであるアドレス（今回は1D2FA）に移動する。その後、上に書いたとおりの内容を書き換えて保存する。書き換える内容はたったの1文字なのでまったく難しくはないが、書き換える場所を探すのに非常に時間がかかった。
###既存の実行ファイルと交換する
C:\Program Files\SoftEther VPN Serverにあるvpnserverの実行ファイルの名前の末尾に.bakをつけて保存し、書き換えた実行ファイルをフォルダに移動する。その後、services.mscを開いてSoftEther VPN Serverのサービスを再起動する。バイナリエディタで書き換えたことで電子署名が無効になったのでセキュリティソフトに何か言われるかもしれないが、書き換えたのは自分なので問題ない。
###終了
以上の作業が終われば、電子証明書認証などを使うことができるようになる。
試しに固有証明書認証を使ってみたところ、ちゃんと使うことができた。

#まとめ
SoftEtherVPN Server(Ver 4.38, Build 9760, rtm)の場合はバイナリエディタでアドレス1D301を01から00に書き換えるだけでよい。
それ以外のバージョンの場合はIDAなどを使って地道にアドレスを調べる必要がある。