天天看點

編譯時MSIL注入--實踐Mono Cecil(1)

      在本節我們需要看看這個mono.cecil,先來一個簡單的認識。

我來在我們的方法執行前後加入我們的輸出資訊:

原來代碼:

編譯時MSIL注入--實踐Mono Cecil(1)

class program 

   { 

       static void main(string[] args) 

       { 

           console.writeline("破浪blog:http://www.cnblogs.com/whitewolf/"); 

       } 

   }

編譯時MSIL注入--實踐Mono Cecil(1)

任務:

1我将在方法執行前後添加一個console.writeline("method start…");

2方法最後添加console.writeline("method finish…“);

具體mono.cecil code:

編譯時MSIL注入--實踐Mono Cecil(1)

using system; 

using system.collections.generic; 

using system.linq; 

using system.text; 

using mono.cecil; 

using mono.cecil.cil; 

namespace blogsample 

    class program 

    { 

        static void main(string[] args) 

        { 

            assemblydefinition assembiy = assemblyfactory.getassembly(args[0]); 

            foreach (mono.cecil.typedefinition item in assembiy.mainmodule.types) 

            { 

                foreach (methoddefinition method in item.methods) 

                { 

                    if (method.name.equals("main")) 

                    { 

                        var ins = method.body.instructions[0]; 

                        var worker = method.body.cilworker; 

                        worker.insertbefore(ins, worker.create(opcodes.ldstr, "method start…")); 

                        worker.insertbefore(ins, worker.create(opcodes.call, 

                            assembiy.mainmodule.import(typeof(console).getmethod("writeline", new type[] { typeof(string) })))); 

                        ins = method.body.instructions[method.body.instructions.count - 1]; 

                        worker.insertbefore(ins, worker.create(opcodes.ldstr, "method finish…")); 

                        break; 

                    } 

                } 

            } 

            assemblyfactory.saveassembly(assembiy, "il_" + args[0]); 

            console.read(); 

        } 

    } 

}

編譯時MSIL注入--實踐Mono Cecil(1)

dos運作結果:

編譯時MSIL注入--實踐Mono Cecil(1)

我們在來看看反編譯後的msil

編譯時MSIL注入--實踐Mono Cecil(1)

c#:

編譯時MSIL注入--實踐Mono Cecil(1)