运用Mono.Ceci类库修改.NET程序集 走上破解软件的道路
2013-07-02 23:12
375 查看
运用Mono.Ceci类库修改.NET程序集走上破解软件的道路
代码注入在C++时代很流行,主要是对现有的程序做一些修改,以达到预期的目的。一部分的破解程序,注册机也是借助于此方法,让被注入的程序绕过验证,达到破解的目录。在.NET中,借助于Mono.Cecil程序集,注入代码也相当容易。请看下面的代码,将要被注入的程序:usingSystem; namespaceVictim { classProgram { staticvoidMain(string[]args) { Console.WriteLine("HelloWorld!"); Console.ReadLine(); } } }
把上面的程序编译成一个程序集Victim,执行程序,它会在控制台出版Hello,world。
下面我做一个新的程序,它修改上面的程序集,在Program类型中定义一个新的Test方法,修改Main方法调用我注入的Test方法。
先添加对程序Mono.cecil的引用。
usingSystem; usingMono.Cecil; usingMono.Cecil.Cil;
现在,开始加载程序集
AssemblyDefinitionasm=AssemblyFactory.GetAssembly("Victim.exe");
添加返回值为void类型的Test方法
//Declarereturntype"void" TypeReferencereturntype=asm.MainModule.Import(typeof(void)); //DefineMethodsignature"privatestaticvoidTest()" MethodDefinitiontestmethod=newMethodDefinition("Test",MethodAttributes.Private|MethodAttributes.Static,returntype);
Test方法的访问级别为private,static
给Test方法增加方法体,参考下面的代码写法
//Pushstringontothestack Instructionmsg=testmethod.Body.CilWorker.Create(OpCodes.Ldstr,"HellofromTest()"); //ImportexternalmethodreferencetoConsole.WriteLine() MethodReferencewriteline=asm.MainModule.Import(typeof(Console).GetMethod("WriteLine",newType[]{typeof(string)}));
加载常量为方法的签名,在控制台上打印出来
这种写法,与MSIL代码一致,C#代码被翻译成MSIL,生成的代码就是这样的。
最后生成Test方法,代码如下
//Generatestack-push testmethod.Body.CilWorker.Append(msg); //GeneratecalltoWriteLine() testmethod.Body.CilWorker.InsertAfter(msg,testmethod.Body.CilWorker.Create(OpCodes.Call,writeline)); //Generatereturn testmethod.Body.CilWorker.Append(testmethod.Body.CilWorker.Create(OpCodes.Ret));
asm.MainModule.Inject(testmethod,asm.MainModule.Types["Victim.Program"]);
最后,修改程序,让它调用被注入的Test方法
//GetMethodreferencewithNametest, MethodReferencetestmethod_ref=null; foreach(MethodDefinitionmdefinasm.MainModule.Types["Victim.Program"].Methods) { if(mdef.Name=="Test") { testmethod_ref=asm.MainModule.Import(mdef); } } //Createcalltothereference Instructioncall_test=testmethod.Body.CilWorker.Create(OpCodes.Call,testmethod_ref); //Insertreference asm.EntryPoint.Body.CilWorker.InsertBefore(asm.EntryPoint.Body.Instructions[0],call_test);
保存程序集到磁盘文件中
AssemblyFactory.SaveAssembly(asm,"patched.exe");
现在,最初始的程序集代码看起来是这样的
usingSystem;
namespaceVictim
{
classProgram
{
staticvoidMain(string[]args)
{
Test();
Console.WriteLine("HelloWorld!");
Console.ReadLine();
}
privatestaticvoidTest()
{
Console.WriteLine("HellofromTest()");
}
}
}
可以用Reflector来查看生成的Patched.exe,应该与这里的一致。
如果被修改的方法,是许可验证,或是注册算法验证,这一方便可以直接把它的指令清空,另存为一个程序集文件,达到绕过验证的目的。
相关文章推荐
- 运用Mono.Ceci类库修改.NET程序集 走上破解软件的道路
- 运用Mono.Ceci类库修改.NET程序集 走上破解软件的道路
- (外挂破解)Cheat Engine(内存修改工具)V6.2中文版软件介绍
- 修改指令的方法完美破解软件
- 破解联网c#软件实现某些功能的三种方法(待修改)
- 今天破解了一套软件,但是怎么修改DLL名称呢?
- msn 修改密码,msn 改密码的方法,MSN 密码破解,MSN密码保护软件-Alasend下载
- 破解修改 Electron 软件 | 游戏
- [ROM制作教程] 【自制ROM工具大集合】各种修改制作ROM工具软件详解以及运用全集合
- 破解C#等net软件 修改原软件的功能
- 个人收集的mac破解软件免费下载(不断更新中)
- debian修改配置软件源
- 直接修改Android软件数据库来改变软件设置实例一则
- 软件破解基础教程
- 单机 & 弱联网手游 防破解、金币修改 简单措施
- 世界超全破解软件
- 正版软件+破解软件下载网站集合
- [转载]谈软件的破解与保护
- 如何破解软件
- xx学破解之 PDF转WORD 一小软件、、