用Cecil任意修改破解xap文件的.Net程序集+源码

作者:小菜 更新时间:2025-02-19 点击数:
简介:本文以破解WP的XBL(Xbox LIVE)游戏为例讲解如何使用Cecil这把尚方宝剑,让ILDasm修改IL的方法彻底成为历史。

最近在Windows Phon

【菜科解读】

本文以破解WP的XBL(Xbox LIVE)游戏为例讲解如何使用Cecil这把尚方宝剑,让ILDasm修改IL的方法彻底成为历史。

最近在Windows Phone Store的Nokia collection里面发现了《Parking Mania(疯狂停车场)》这款游戏。

试玩了一下觉得非常有趣,但只能试玩前面少数几关。

手痒痒的就开始了“盗版”部署。

由于Parking Manin是XBL游戏,其调用GamerServicesComponent组件。

但直接部署的XAP的应用无法使用此组件,从而会在使用了组件的地方会直接终止应用(DFT成就版ROM除外)。

所以我们要做的就是在整个游戏中找到所有调用了XBL服务的地方并将其去除或跳过。

但这样有个明显的缺点:XBL最重要的成就和排名功能被阉割掉了。

DFT成就版就是为了解决这一问题而产生的。

为了破解,当然是要先找到所有调用了XBL服务的地方。

直接在IL中搜索GamerServicesComponent,只有ParkingMania.ParkingManiaGame中枪。

然后在Initialize方法中前两句指令给删掉,清空HandleGameUpdateRequired、Update方法。

即下图中红框中的代码要干掉。

找到其对应的IL代码:

对应用C#代码操作的代码如下

12345678910111213141516171819202122232425262728if (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指令。

删除的时候记得保留这些指令。

最后贴出完整的代码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596using 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.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); }); } } } if (type.FullName == "ParkingMania.Services.Data.Achievments.XBLAService") { foreach (var method in type.Methods) { if (method.Body == null) continue; var worker = method.Body.GetILProcessor(); if (method.Name == "Event") { var list = method.Body.Instructions.Take(method.Body.Instructions.Count - 1).ToList(); list.ForEach(i => { worker.Remove(i); }); } if (method.Name == "LoadMoneyLeaderboard") { var list = method.Body.Instructions.Take(method.Body.Instructions.Count - 1).ToList(); list.ForEach(i => { worker.Remove(i); }); } if (method.Name == "LoadStarsLeaderboard") { var list = method.Body.Instructions.Take(method.Body.Instructions.Count - 1).ToList(); list.ForEach(i => { worker.Remove(i); }); } if (method.Name == "GetAchievmentsForMenu") { var list = method.Body.Instructions.Take(method.Body.Instructions.Count - 1).ToList(); list.ForEach(i => { worker.Remove(i); }); } } } } } assembly.Write(dst, new WriterParameters { WriteSymbols = false }); } } }

续,

快速代理等写IL的需求可以用Emit实现,并且是官方支持的方法;简单修改或破解IL的需求可以用ILDasm实现。

那么对我们来说,Cecil到底有什么用?

1、对代码程序集进行反编译并规范化的修改其流程,特别是对于复杂的程序集的修改非常有优势

2、按照自己的需求额外的优化代码

3、插入特殊的操作指令,例如编译时后自动完成WPF中观察者模式中的通知接口

这里也顺便说一下DFT成就版吧

首先要说一下XBL最大的优势是提供了游戏中“成就”和“排名”等服务的支持,这些服务非常有助于提高用户粘性。

@马宁 为此还弄出了OpenXLive 这个开放的SNS平台。

可以看看马宁的一篇博客《OpenXLive——开启Windows Phone 7游戏社交平台新时代》中关于Leaderboard、Achievements、Social Network的介绍。

XNA自身在Microsoft.Xna.Framework.Game.dll集成了类似的服务,并提供了开发接口。

WP7中许多XBL游戏都使用此接口。

可能是微软自身的保护策略,禁止从市场安装的应用访问XBL服务接口。

DFT成就版就是在ROM中修改了此接口,并xxxx了。

有了Cecil这个玩意,我们完全可以设计出一种机制自动识别出使用了XBL服务接口的代码并使其使用另外编写好的第三方接口。

在第三方接口中可以在本地或其他网络中提供第三方服务。

有了这样的第三方服务才能算作是“完美”的破解。

使用Cecil替换接口的调用并无什么复杂的技术(上一篇文章中就对调用的方法进行了替换),难就难在要设计出一种完善的处理机制使其可以自动的处理任何一种情况。

好了,这只是一种想法,而且是一种邪恶的想法。

本着支持正版的精神,大家还是力所能及的购买一些正版吧。

最后的最后,本文重点讲述的已破解完的xap文件放置在群1749907的群共享中,从今天算起只有30天的存储时间。

用,Cecil,任意,修改,破解,xap,文件,的,.Net

Win10多用户远程桌面连接无法实现的参考方法

想重装系统不会怎么办?菜科网一键重装系统轻松在线帮您搞定系统重装问题。

软件支持 在线重装、U盘制作、自定义重装 等多种模式。

最近,有些用户在Win10系统中用远程桌面连接时,遇到了问题,具体表现为:无法实现多用户远程桌面连接,即不能使用多用户来登录。

那么,遇到这问题时该如何解决呢?其实,这问题之前也有用户遇到,现在,小编就针对这问题为大家提供两种Win10系统多用户远程桌面连接无法实现的参考方法。

方法一:Win10远程桌面多用户补丁 下载Win10远程桌面多用户补丁,然后解压得到dll文件替换c:\windows\system32\下的同名文件即可,如果需要权限,可使用U盘启动或系统安装盘启动进入命令行或WinPE中进行覆盖。

方法二:使用工具破解(用户可以到网上找,里面有很多这类问题的破解工具) 扩展阅读:实现远程桌面多用户连接的方法 1、启动允许远程桌面访问,电脑桌面-- 我的电脑 - 属性 - 远程 ,在 远程桌面 那打勾。

2、设置限制连接数 开始 - 运行 -输入 gpedit.msc - 计算机配置 - 管理模板 - Windows组件 - 终端服务 - 限制连接数量 ,如下图: 3、取消限制每个用户使用一个会话 开始 - 运行 -输入 tscc.msc 进入下图 4、双击 服务器设置 , 限制每个用户使用一个会话 选择否设置完毕,然后重新连接下服务器就可以了 注意:先把服务器的防火墙关闭或者把3389端口加入信任设置 Win10系统多用户远程桌面连接无法实现问题的两种参考方法就介绍到这了,需要了解更多这方面的内容不妨来菜科网官网。

注意:本站所刊载的文章均为学习交流之用,请勿用于商业用途。

对于商业使用,请联系各自版权所有者,否则法律问题自行承担。

Win7系统升级指南:全面解析升级步骤与要点 Win7系统损坏修复教程:详细步骤助你快速解决问题 Win10多用户远程桌面连接无法实现的参考方法 分类于: 回答于:2016-01-06 最近,有些用户在Win10系统中用远程桌面连接时,遇到了问题,具体表现为:无法实现多用户远程桌面连接,即不能使用多用户来登录。

那么,遇到这问题时该如何解决呢?其实,这问题之前也有用户遇到,现在,小编就针对这问题为大家提供两种Win10系统多用户远程桌面连接无法实现的参考方法。

方法一:Win10远程桌面多用户补丁 下载Win10远程桌面多用户补丁,然后解压得到dll文件替换c:\windows\system32\下的同名文件即可,如果需要权限,可使用U盘启动或系统安装盘启动进入命令行或WinPE中进行覆盖。

方法二:使用工具破解(用户可以到网上找,里面有很多这类问题的破解工具) 扩展阅读:实现远程桌面多用户连接的方法 1、启动允许远程桌面访问,电脑桌面-- 我的电脑 - 属性 - 远程 ,在 远程桌面 那打勾。

2、设置限制连接数 开始 - 运行 -输入 gpedit.msc - 计算机配置 - 管理模板 - Windows组件 - 终端服务 - 限制连接数量 ,如下图: 3、取消限制每个用户使用一个会话 开始 - 运行 -输入 tscc.msc 进入下图 4、双击 服务器设置 , 限制每个用户使用一个会话 选择否设置完毕,然后重新连接下服务器就可以了 注意:先把服务器的防火墙关闭或者把3389端口加入信任设置 Win10系统多用户远程桌面连接无法实现问题的两种参考方法就介绍到这了,需要了解更多这方面的内容不妨来菜科网官网。

菜科网系统致力于解决 Windows 系统重装解决方案,提供高效、安全、免费的系统重装服务。

哔哩哔哩漫画通用券用处介绍

哔哩哔哩中的如果我们想要漫画通用券的话是可以通过任务来获取的,对于哔哩哔哩漫画通用券是不是很多小伙伴们都还不清楚,下面小编就带着大家一起来具体看看吧。

哔哩哔哩漫画通用券什么意思?哔哩哔哩漫画通用券是b站推出的漫画阅读券,用户使用漫画通用券可以在看漫画时可以直接解锁付费章节使用,全场的漫画都是可以使用全场券免费看的。

以上就是小编带来的哔哩哔哩漫画通用券用处介绍的全部内容了,更多相关资讯教程,请关注zi7。

———想要了解更多软件教程就请继续关注zi7。

加入收藏
               

用Cecil任意修改破解xap文件的.Net程序集+源码

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录