当前位置 > 首页 > Asp.net

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

2012-12-7 23:11:00来源: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


  • .net 4.0 webbrowser如何和IE10行为一致

    2012-9-10 13:27:00

    我是用的win8系统,所以安装的ie是ie10,现在进行.net开发,一个网页在ie10的行为正常,但是在.net webbrowser的行为就不正常了,我通过改注册表: HKEY_LOCAL

  • asp.net 抓取全局错误

    2012-10-31 14:26:00

    asp.net 怎么捕获全局错误,网站中所有错误都能捕获,在哪捕获

  • jQuery-Selectors(选择器)的使用(七、子元素篇)

    2009-12-8 16:11:00

    阅读: 13 评论: 0 作者: code-cat 发表于 2009-12-08 15:35 原文链接 .div { width:95%; margin-left:15px;

  • 一步一步学DLINQ(二):DataContext与实体

    2007-8-15 22:01:00

    摘要: DataContext、定义实体类、强类型DataContext、日志功能、探究查询、执行查询、创建数据库、使用DbDataReader数据源 阅读全文 lovecherry 2

  • sql 查询模块

    2009-11-15 13:23:00

    阅读: 303 评论: 4 作者: 破浪 发表于 2009-11-15 10:32 原文链接 已经好久没弄博客了,觉得该写些了。但是没想到写些什么,很多东西院子已经很多了。就把我最近在项

  • hoj1090 The Staircases

    2009-4-20 14:12:00

    摘要: One curious child has a set of N little bricks. From these bricks he builds different staircase

  • BizTalk Server - Business Rules Framework

    2007-6-3 10:54:00

    BizTalk Server - Business Rules Framework Posted by Rickie, http://rickie.cnblog

  • TransactionScope出错

    2007-9-16 16:05:00

    TransactionScope 是.net 提供的可提升事务环境,开发软件的时候非常方便,但是在大数据量处理的时候,会莫名我出错,检查代码没有任何的错误 解决这个错误的方法:不用Transac

  • 关闭TcpClient后NetworkStream也要手工关闭

    2012-10-24 17:18:00

    最近我写的一个客户端程序出了问题,即很多用户同时掉线时(例如在打开很多客户端的电脑上拔掉网线),有很小的概率服务器会出现异常。异常的Trace显示,这是对已经关闭的TcpClient写入数据时导致的

  • 浅谈.net事件机制

    2007-9-1 2:41:00

    大家都有这样的经历:   打开VS--〉新建应用程序(FORM1)--〉往里面挪按钮--〉双击按钮--〉写代码   这看上去那么的自然,简单,可仔细想一下,窗口(FORM1)是一个类,按钮(Butt