troushoo

共にフリーで使えるJustDecompileとReflexilで、.NETアセンブリの編集

【概要・まとめ】
フリーで使える.NETのデコンパイラ JustDecompile と、フリーで使えるそのプラグインである Reflexilを使用して、再ビルドすることなく(すなわちソースコードは必要なく).NETアセンブリを編集する方法を紹介します。

【内容】
・今回紹介する内容
以下のC#の単純なサンプルコードを用いて、アセンブリを編集する方法を紹介します。
MyFuncの引数により、表示させる文字列を変えるだけの単純なコードです。

using System;
 
namespace MyAssemblyEditor
{
    class Program
    {
        static void MyFunc(int i)
        {
            if (i >= 0) Console.WriteLine("iは0以上");
            else        Console.WriteLine("iは0未満");
        }
        static void Main(string[] args)
        {
            MyFunc(1);
        }
    }
}
上記はMyFuncの引数は1で固定ですの(=上のコードの赤色の部分)で、実行結果は常に”iは0以上”が表示されます。
実行結果
このEXEを、このソースコードの変更をすることなく、”iは0未満”と表示させてみます。
最終目標

・JustDecompileとReflexilのインストール
JustDecompileはtelerik(=JustDecompileを作成している会社)のサイトの”Download Now”よりダウンロードし、インストールします。
JustDecompileのダウンロード
JustDecompileのインストールはウィザードをたどるだけで5分程度で終了します。
(注1) 言語は英語です。
(注2) インストールには無料のアカウントを作成する必要があります。

Reflexilは同じくtelerikのサイトの、”Assembly Editor Plugin”の”Download”よりダウンロードします。
Reflexilのダウンロード
インストールは、ダウンロードしたZipファイルをC:\Program Files (x86)\Telerik\JustDecompile\Libraries\Pluginsに解凍するだけです。
Reflexilのインストール
JustDecompileを起動し、”Plugins”に”Reflexil”があればインストール成功です。
”Reflexil”をクリックし、右下に”Sebastien LEBRETON’s Reflexil v1.5”のウィンドウを表示させれば初期設定も完了です。
Reflexilの初期設定

・アセンブリの編集
アセンブリの編集方法として、(a)OpCodeの変更 と (b)メソッドの変更 の方法を紹介します。
(a)OpCodeの変更

OpCodeを変更してみます。
*OpCodeとは、MSIL(Microsoft Intermediate Language = .NETの中間言語)命令を記述するものです。
(後述する実際のOpCodeを見ればイメージがつかめると思います。詳細はMSDNで確認できます。
http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes_fields.aspx (英語))
0. JustDecompileを起動し、“Drag assemblies here”に編集したいアセンブリをドラッグ&ドロップします。
アセンブリをJustDecompileに読み込ませる
1. 左のウィンドウよりMyFunc(Int32)を選び、MyFuncをデコンパイルします。
”Sebastien LEBRETON’s Reflexil v1.5”のウィンドウにMyFuncのMSIL(Microsoft Intermediate Language = .NETの中間言語)が表示されます。
MyFuncのデコンパイル
2. OpCodeを変更します。
具体的には、C#コードでいうところの、
if (i >= 0) Console.WriteLine("iは0以上");

if (i < 0) Console.WriteLine("iは0以上");
に修正するために、brtrue.sをbrfalse.sに変更します。
変更方法は、まず、brtrue.sの行を右クリック –> Editをクリックします。
brtrue.sの変更
そして、OpCodeをbrfalse.sに変更後、”Update”をクリックします。
brtrue.sを変更
JustDecompileの画面で、OpCodeが変更されたことを確認します。
brfalse.sに変更された
3. 編集したアセンブリを保存します。
手順は、左のウィンドウよりアセンブリ名を右クリック –> Reflexil v1.5 –> Save asをクリックします。
保存
4. 保存したアセンブリを実行します。
”iは0未満です。”と表示され、編集が成功していることがわかります。
変更された


(b) アセンブリの編集 - メソッドの変更
今度は、メソッドを変更してみます。
1. 左のウィンドウよりMyFunc(Int32)を選び、MyFuncをデコンパイルします。
”Sebastien LEBRETON’s Reflexil v1.5”のウィンドウにMyFuncのMSIL(Microsoft Intermediate Language = .NETの中間言語)が表示されます。
MyFuncのデコンパイル
2. 任意の行を右クリックし、”Replace all with code”をクリックします。
Replace all with code
3. MyFunc(int i)にコードを書き込みます。
ここでは、以下のように、”iは0未満”を表示させるコードにします。

static void MyFunc(int i)
{
    System.Console.WriteLine("iは0未満");
}

*コードの編集時には、IntelliSenseが効いています。
IntelliSense
4. コードの編集が終わったら、”Compile”をクリックします。
成功すると、右側のウィンドウにMSILが表示されますので、”OK”をクリックします。
コンパイル成功
JustDecompileの画面に戻り、MSILが変更されたことを確認します。
変更された
*コンパイルが失敗すると、エラーが表示されます。
コンパイルエラー
4. 編集したアセンブリを保存します。
手順は、左のウィンドウよりアセンブリ名を右クリック –> Reflexil v1.5 –> Save asをクリックします。
保存
5. 保存したアセンブリを実行します。
”iは0未満”と表示され、編集が成功していることがわかります。
変更された

リンク
・The Bomb Squad – Removing Time Bombs with JustDecompile and Reflexil (英語)
tenelicの人による(JustDecompileと)Reflexilの使用例を紹介したブログ
http://www.kodefuguru.com/post/2012/11/26/The-Bomb-Squad-Removing-Time-Bombs-with-JustDecompile-and-Reflexil.aspx
・本ブログのJustDecompileの記事です。
http://troushoo.blog.fc2.com/blog-entry-33.html


  1. 2012/12/07(金) 16:30:02|
  2. ツール
  3. | トラックバック:0
  4. | コメント:0
<<Wiresharkでキャプチャしたパケットを編集し送信 - Ostinato | ホーム | Visual Studioの役に立つショートカット - ナビゲーション編>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/92-69e9aa6c
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (24)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する