【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

CCIとCecil

上記の記事でCCIの存在を知りました。.NETバイナリ(CILを含んだEXEやDLL)を読み書きするライブラリです。

id:atsushienoさんにCecilを教えてもらいました。Monoプロジェクトが提供する.NETバイナリを読み書きするライブラリです。

Cecilの誕生には、以下のような経緯があったそうです。

http://twitter.com/atsushieno/status/1565378495

Cecilは5年前にCecilハカーがCCIOSS化を提案して断られたからあるのだよねえ。採用実績を見ればどっちが正解だったかは一目瞭然だ。

実は以前から名前だけは耳にしたことがあったのですが、CeCILLと勘違いしてスルーしていたようです。(さすがにcecileだとは思っていなかったので念のため)

CCIで逆コンパイル

CCIにはcciast(Code and AST)というコンポーネントがあります。

VC# 2008 Expressでビルドしてみました。cciastからはCCI本体(Metadata)を参照しているため、cciastフォルダの中にMetadataフォルダを入れておく必要があります(ソリューションファイルをテキストエディタで開くとMetadataのプロジェクトの配置が相対パスで書いてあるので、うまくいかないときは参照してみてください)。ソリューションを開くときに「ソリューションフォルダはこのバージョンのアプリケーションではサポートされていません。(以下略)」というエラーが出ますが、無視しても差し支えないようです。

サンプルのPeToTextを使用すると、.NETのバイナリ(EXE/DLL)をC#に逆コンパイルすることができます。PDBファイルがあればCILがC#との対訳形式で出力されます。文字を表示するだけのプログラムを逆コンパイルした結果は以下の通りです。

abstract sealed static class Program
{
    private static void Main()
    {
        {
            System.Console.WriteLine("Hello, CCI!");
            return;

        }

        IL_0000 ... IL_000d {
        }

        test.cs(2:40)-(2:41): {
        IL_0000: Nop

        test.cs(2:41)-(2:74): Console.WriteLine("Hello, CCI!");
        IL_0001: Ldstr "Hello, CCI!"
        IL_0006: Call System.Void System.Console.WriteLine(System.String)
        IL_000b: Nop

        test.cs(2:74)-(2:75): }
        IL_000c: Ret
    }

}

幻のC# Lite

CCIのサンプルとしてSmallBasicが提供されています。

更新履歴を見ると、以前はC#のサブセットが提供されていたことが分かります。

http://ccisamples.codeplex.com/SourceControl/ListDownloadableCommits.aspx

Delete CSharpLite at the request of the C# team.

どういう意図でのリクエストかは興味のあるところですが、C# Lite自体は履歴に残っているためダウンロードできます。