天天看点

编译时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)