当前位置 > 首页 > 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


  • 动态读取App.Config

    2007-3-19 17:03:00

    关于APP.CONFIG 在做Winform开发时,免不了把一些配置信息写到APP.CONFIG文件中,当程序生成后APP.CONFIG会变成以程序名+CONFIG的文件 即,如程序名为A,那么生

  • Net处理html页面元素工具类(HtmlAgilityPack.dll)的使用

    2012-9-25 17:08:00

    简介 本文介绍net处理html页面元素的工具类(HtmlAgilityPack.dll)的使用,用途比较多的应该是例如采集类的功能,采集到的html字符串要怎样处理是一个头痛的问题,如果是截

  • ajax与vs2003(Treeview)

    2009-4-15 12:25:00

    摘要: 最近公司网站出现了访问速度变慢,仅过查看是由于构造树的过程CPU耗用严重,问题原因是构造树的过程采用了递归方法一次性构造的树的所有节点,其实后台获取数据的速度倒是很快,比较慢的地方就是Tre

  • VS.NET 2008 如何升级 sp1?

    2010-9-3 19:28:00

    安装 SQL SERVER 2008时,要求将本机中的 VS.NET 2008 升级到SP1,不知道该如何操作?

  • ASP.NET不简单,做网站更不简单

    2009-8-28 19:30:00

    摘要: 一日,偶遇一朋友问我做什么的,我答说做IT的,他说这我知道你具体做那一行,我说做.Net的,他听后来句这我也懂点儿是做网站的,满大街都这广告,眼里从最早的敬仰转换成了一般般. -----

  • DotNetNuke 2010 - Firefox Persona

    2010-7-15 10:48:00

    Show your DotNetNuke passion by using the DotNetNuke 2010 Firefox Persona, found here .

  • 【ASP.NET】困扰我多年的URL参数设置问题

    2011-3-9 13:02:00

    URL参数一直以来困扰着我。始终没有一个完美的解决方案!考虑到网页的安全性有些地方不得不做以限制。由于本身对这个地方没有经验,所以前来问问各路高手 你们是怎么处理这个问题的。我把我所遇到的问题说一下

  • 不依赖OFFICE组件实现带图片的EXCEL导出

    2007-7-10 10:03:00

    现在很多的虚拟主机提供商都不提供OWC或者OFFICE,这使得我们不能通过操作Excel或者OWC的方式来生成带有饼或柱图的EXCEL文件。下面说两种可以不依赖OFFICE组件或DLL的导出方法,权

  • Binding form data in ASP.NET Web API

    2012-8-10 23:23:00

    One scenario that is very common in ASP.NET MVC is to bind form data (data posted with the media ty

  • NDC Video – Ted Neward – WCF Patterns

    2009-8-18 23:06:00

    This one, by Ted Neward Note: it starts about 10-15 minutes into the video (it is unedited)