当前位置 > 首页 > Asp.net

用Cecil任意修改.Net程序集+源码

12/7/2012 11:11:00 PM来源:Asp.net

      之前写过一篇文章《欺骗你的地理坐标+源码》,简单的讲述了使用Cecil修改WP版微信程序的方法。本文再次以破解WP的XBL(Xbox LIVE)游戏为例讲解如何使用Cecil这把尚方宝剑,让ILDasm修改IL的方法彻底成为历史。

 

      最近在Windows Phone Store的Nokia collection里面发现了《Parking Mania(疯狂停车场)》这款游戏。试玩了一下觉得非常有趣,但只能试玩前面少数几关。手痒痒的就开始了“盗版”部署。由于Parking Manin是XBL游戏,其调用GamerServicesComponent组件。但直接部署的XAP的应用无法使用此组件,从而会在使用了组件的地方会直接终止应用(DFT成就版ROM除外)。所以我们要做的就是在整个游戏中找到所有调用了XBL服务的地方并将其去除或跳过。但这样有个明显的缺点:XBL最重要的成就和排名功能被阉割掉了。DFT成就版就是为了解决这一问题而产生的。

 

      Cecil、WP7应用、IL等背景知识已经在上一篇博文中讲述了,有兴趣的请移步到《欺骗你的地理坐标+源码》。

 

      为了破解,当然是要先找到所有调用了XBL服务的地方。直接在IL中搜索GamerServicesComponent,只有ParkingMania.ParkingManiaGame中枪。然后在Initialize方法中前两句指令给删掉,清空HandleGameUpdateRequired、Update方法。即下图中红框中的代码要干掉。

image

image

      找到其对应的IL代码:

image

 

      对应用C#代码操作的代码如下 if (type.FullName == "ParkingMania.ParkingManiaGame")
{
var field = type.Fields.FirstOrDefault(s => s.Name == "GamerServiceInstance");
type.Fields.Remove(field);

foreach (var method in type.Methods)
{
if (method.Body == null)
continue;

var worker = method.Body.GetILProcessor();
if (method.Name == "Initialize")
{
var list = method.Body.Instructions.Skip(1).Take(9).ToList();
list.ForEach(i => { worker.Remove(i); });
}
if (method.Name == "HandleGameUpdateRequired")
{
var list = method.Body.Instructions.Skip(3).Take(4).ToList();
list.ForEach(i => { worker.Remove(i); });
}
if (method.Name == "Update")
{
var list = method.Body.Instructions.Skip(8).Take(8).ToList();
list.ForEach(i => { worker.Remove(i); });
}
}
}

 

      再进一步阅读分析源码可以发现有ParkingMania.Services.Data.Achievments.XBLAService这个类。这里面要把Event、LoadMoneyLeaderboard、LoadStarsLeaderboard、GetAchievmentsForMenu方法统统干掉。具体方法也类似,就不重复贴代码的。

 

      需要注意的是:离开try…catch…模块的时候需要leave.s指令、离开一个方法的时候需要ret指令。删除的时候记得保留这些指令。

 

       最后贴出完整的代码 using Mono.Cecil;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CecilParkingMania
{
class Program
{
static void Main(string[] args)
{
var bas = @"D:\Til\Parking_0\";
var src = bas + @"ParkingMania.org.dll";
var dst = bas + @"0\ParkingMania.dll";

var resolver = new DefaultAssemblyResolver();
resolver.AddSearchDirectory(bas + @"0");

var parameters = new ReaderParameters
{
AssemblyResolver = resolver,
ReadSymbols = false,
};
var assembly = AssemblyDefinition.ReadAssembly(src, parameters);

foreach (var module in assembly.Modules)
{
foreach (var type in module.Types)
{
if (type.FullName == "ParkingMania.ParkingManiaGame")
{
var field = type.Fiel


  • 说说“RSS博客镜像”

    2/26/2007 12:14:00 PM

    RSS 博客镜像是 CommunityServer 在较高级版本中(好像是从 2.1 开始)推出的功能,其主要的作用是,将其它博客(博客软件或者博客服务提供商)中的日志通过解析 RS

  • ServiceHost<T>,简化宿主的创建和元数据交换行为的开启

    11/18/2009 12:59:00 PM

    阅读: 24 评论: 0 作者: NineTyNine_LiPei 发表于 2009-11-18 09:49 原文链接 这是《WCF服务编程》这本书中的一个辅助类。个人觉得作者的重构的思

  • 【调查】您常去博客园的哪些地方?

    8/19/2009 11:33:00 AM

    摘要: 为了更好地了解园友在园子里经常去的地方。我们特地推出这样一个调查,欢迎大家百忙之中抽出时间轻点几下手中的鼠标,参与这次调查。 ------------------------------

  • Entity Framework for Domain Model based Application Architectures

    9/25/2007 5:09:00 AM

    I am sitting here listening to the MSDN Webcast: Framework Masterclass: LINQ to Entities and gues

  • OWB 11g 循序渐进系列 - (1) 初始化配置Oracle Warehouse Builder 11g

    5/14/2009 4:23:00 AM

    1 开始->所有程序->Oracle 产品->Warehouse Builder->Administration->Repository Assistant 2 在

  • MapXtreme2008中操作矢量符号和定制符号

    9/5/2009 2:17:00 AM

    摘要: 本文部分说明内容摘自网络文章,经过本人在MapXtreme2008中编写相关的演示例子,详细说明如何操作MapXtreme2008提供的矢量符号和定制符号。 MapXtreme 在其安

  • 关于.NET技术体系的思维导图

    9/2/2009 3:02:00 PM

    摘要: 关于.NET技术体系的思维导图。最近要给学弟们提供一些学习材料,来指导他们的学习,所以弄出这样一个思维导图,希望能得到大家的建议来进一步完善这个图。 ------------------

  • 长尾理论读书笔记:第十一章 利基文化

    2/24/2010 10:39:00 AM

    阅读: 317 评论: 1 作者: 觉先 发表于 2010-02-24 00:28 原文链接 长尾的意义无非就是无限的选择。充足,廉价的传播渠道意味着丰富,廉价和无穷无尽的品种,也就意味着

  • JQuery实现经典网站后台框架

    9/28/2009 11:27:00 PM

    摘要: 网站后台是每个网站必须的部分,使用一个好的框架也是给用户良好体验的一部分内容,本文将给大家介绍使用JQuery和JS实现的ASP.NET网站后台框架。 作者资料: Wilso

  • 为ASP.NET MVC创建一个基于Mini容器的ControllerFactory

    12/19/2011 1:38:00 PM

    背景 随着Asp.net mvc的越来越流行,关于和Mvc整合的DI容器也非常的多,而Mini容器一致没有把整合的方案发布出来,以至于不时的收到有些网友询问这些事,于是便有了该文。[ 源代