本帖最后由 spguangz 于 2015-8-19 01:12 编辑
前言:『裤衩之心』这款游戏半年多前就呆在我的云盘里了,然而没玩完,因为舍不得花钱激活完整游戏 而且那时初学了安卓逆向,就想自己破解咯,然而技术欠缺,一直没完成破解。
还好不久之后的2015年2月初,我大52破解论坛开放注册了!我成为了其中一员!然后开始学习。
凭着学到的知识,我摩拳擦掌......然而还是没完成此游戏的攻破!因为那时快过年了
其实是因为它是个U3d游戏,不能单靠修改smali来破解,dll文件的破解才是关键。
今天用云盘下载东西时发现了它的存在,顺便尝试破解。
来源:和游戏搜索下载
工具:Android Killer,.NET Reflector 8.4
0x0 试玩
游戏第2个地图的第1关玩完后,需购买游戏。而且游戏金币不好赚啊,升级装备会花费很多金币。
于是本游戏的2个主要修改地方:1.免激活,2.修改为无限金币。
0x1 免激活游戏
反编译游戏,由\assets\bin\Data\Managed\UnityEngine.dll等文件判定为Unity3D游戏。
用.NET Reflector加载其中的Assembly-CSharp.dll,或者全部dll文件都加载,因为它们之间有关联。
因为要购买游戏,先试试搜索"billing"。点击第2个按钮(Search Member)搜索。
双击 OnBillingResult查看代码。
[HTML] 纯文本查看 复制代码
private void OnBillingResult(string result)
{
Debug.Log("BillingResult=" + result);
char[] separator = new char[] { '|' };
string[] strArray = result.Split(separator);
if ("3" == strArray[1])
{
}
if ("1" == strArray[1])
{
this.trialEndClosed = true;
}
}
看到this.trialEndClosed = true;这句,想到游戏trialEnd(试玩结束)后才会提示购买游戏。
于是这时的思路:1.使游戏trialEnd后也无需购买游戏。2.无限延长试玩时间,使trialEnd永远不到来。
搜索"trial"。依然点击第2个按钮(Search Member)进行搜索。
双击TrialEnded查看代码。
[HTML] 纯文本查看 复制代码
private bool TrialEnded()
{
return (EpicSettings.trial && ThroneRoomData.Load().IsCastleCompleted("Key Castle B1"));
}
分析大意为:Castle B1完成后,试玩结束。
上面提到:游戏第2个地图的第1关(关卡2-1)玩完后,需购买游戏。
这Castle B1就是关卡2-1的意思,所以可把B1改大点,这样整个游戏都玩完了,因还在"试玩期",故不需购买游戏了。
这是个字符串(ldstr)的修改:
这样修改后,关卡26-1完成后,才是试玩结束(实际此游戏才4个地图,最后1个地图才1关!)
数据修改后,按update,再保存Assembly-CSharp.dll,把其放回原来的文件夹,回编译。
至此完成游戏的免激活操作。
0x2 修改为无限金币
游戏的金币主要用于升级装备(攻击,防御,生命等),全升级才用2-3W,那修改为9W好了。
搜索"gold"。
看到get_currentGold,就是获取当前金币数量的意思,双击进入
[Asm] 纯文本查看 复制代码
public int get_currentGold()
{
return this.gold;
}
这句代码很简单,修改为return一定的值(Ldc.I4)即可。
数据修改后,按update,再保存Assembly-CSharp.dll,把其放回原来的文件夹,回编译。
原心想修改无限金币要成功了,进入游戏后,去到升级装备界面查看金币数量,果然成功了,有99,999个金币!
等等,感觉有什么不对路,怎么升级装备的+按钮是灰色的!
你可以体会到自己有1千万,但不能使用的感受吗?是的,我也没有体会过!
那说明这只是返回金币的显示值而已,不是金币的数值。看来还得进一步分析了。
[Asm] 纯文本查看 复制代码
public int get_currentGold()
{
return this.gold;
}
点击其中的gold后,再点击Analyze按钮进行分析。
去到used by,看它被谁调用--
看到最后的Start,右击Start,选择go to member,查看游戏开始时的代码。
[XHTML] 纯文本查看 复制代码
public void Start(King player)
{
this.gold = player.GetStatAsInt("Gold");
foreach (string str in this.trackProgress.Keys)
{
DiceworkDebug.Log(str + ": " + this.trackProgress[str], null);
}
}
这时在this.gold = 后修改为一定的值(Ldc.I4)即可。
删掉02和03行,在01行改,改法同上面的99999图。
修改后--
[XHTML] 纯文本查看 复制代码
public void Start(King player)
{
player.gold = 99999;
foreach (string str in this.trackProgress.Keys)
{
DiceworkDebug.Log(str + ": " + this.trackProgress[str], null);
}
}
ps--此处删掉03行,在02行改,修改后看到的代码是一样的,但游戏会崩溃!
这次成功了,金币永远是99999。
ps2--游戏金币的显示有2处:游戏右上角和升级装备界面。前者由存档的Gold数值决定,后者由get_currentGold决定。
因初始存档无Gold数值,故初入游戏时,右上角显示金币为0,直到进行了装备的升级。升级装备界面一直为99999.
至此无限金币的修改操作完成。
0x3 其他
.NET Reflector下载:http://down.52pojie.cn/Tools/NET/
.NET Reflector指令:http://www.cnblogs.com/flyingbirds123/archive/2011/01/29/1947626.html
|