吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8848|回复: 36
收起左侧

[Android 原创] U3D《飞行日记》代码混淆破解

  [复制链接]
lzc090 发表于 2019-3-12 23:38
本帖最后由 lzc090 于 2019-3-13 10:06 编辑

前言

1.在了解的U3D游戏中混淆的游戏还真心少(到现在好像遇到过3个吧)。

2.刚好今天又遇到这个,方法、参数等几乎都混淆了。

3混淆通常搜索一些关键字符通常都没有,不过需要耐心去找突破口。今天说下我的思路吧。

4.如果直接想看混淆分析请看内容一和六

{98CFFB69-FA7E-4CBD-AE8B-666DCC4B8648}.png.jpg

一、破解VIP

也是这游戏的突破口(直接搜索VIP)

{98CFFB69-FA7E-4CBD-AE8B-666DCC4B8648}.png.jpg

GoldVipRestore 恢复会员和 GoldVipOverdue 会员过期

{98CFFB69-FA7E-4CBD-AE8B-666DCC4B8648}.png.jpg
{98CFFB69-FA7E-4CBD-AE8B-666DCC4B8648}.png.jpg

通过上面两个方法,知道 FFJCEAPDBCJ 这个字段,会员=0,过期=1,默认=-1


那么我们只需要将 FFJCEAPDBCJ 赋值为0,那就是会员?不够。


GoldVipRestore 方法里面有3个判断都满足才算是会员,那么我们介绍一下剩下的两个


isSubscribedOwned 已订阅,这其实就是购买返回的一个收据的判断,当返回有收据为true,那么我们直接改成true就行了

{98CFFB69-FA7E-4CBD-AE8B-666DCC4B8648}.png.jpg

FFJCEAPDBCJ isSubscribedOwned 的条件满足的时候才是真正的会员

那么最后一个DIFJLIDLAFL 是试用会员或者是会员过期的一个判断(因此我们不需要去管他)

MuMu20190313093259.png

二、飞机位

GoldVipRestore 会员中有看到这个base.ODKHEHKDCJN.BuyBlocks(2); 这其实就是开通会员赠送的飞机位

{197A3A5B-D546-4EB7-A35A-BEAE45974D9F}.png.jpg

BuyBlocks 方法中他是添加了2个this.CreateBlock(null)(空位的飞机位),那么我可以根据自己的想法修改,我是修改成了4个(原本开局只有4个,加上会员2个应该6个,修改后成8个了)

{C57BE5F0-FA95-4370-B07E-40E39CBB9980}.png

{197A3A5B-D546-4EB7-A35A-BEAE45974D9F}.png.jpg

MuMu20190312143724.png

三、速度修改

{197A3A5B-D546-4EB7-A35A-BEAE45974D9F}.png.jpg

JFMKOJNLJPD.OAOHHBBOACH = 1.5f;   这是会员赠送的1.5倍数加成速度


CMFLIJNLMNL.OMDFBLLPHLI("SpeedBuffNum", JFMKOJNLJPD.OAOHHBBOACH);  将速度数值存入


OAOHHBBOACH就是速度,初始值=1,你可以点进去进行修改成你需要的倍数,也可以直接在上面的1.5进行修改


直接修改8倍,游戏中还是显示2倍,但实际的速度是8倍

            JFMKOJNLJPD.OAOHHBBOACH = 1.5f;
            
CMFLIJNLMNL.OMDFBLLPHLI("SpeedBuffNum", 8f);




四、每日赠送钻石修改


{197A3A5B-D546-4EB7-A35A-BEAE45974D9F}.png.jpg

this.GetDailyVipReward(); 会员每日赠送的10个钻石

{197A3A5B-D546-4EB7-A35A-BEAE45974D9F}.png.jpg

我直接将10.0修改成了100000

MuMu20190312150652.png

五、初始金币修改
最简单的方法,这游戏初始的金币量是20000,那么我们直接搜索20000字符

{197A3A5B-D546-4EB7-A35A-BEAE45974D9F}.png.jpg
{197A3A5B-D546-4EB7-A35A-BEAE45974D9F}.png.jpg

红线部分的就是初始金币20000,需要多少自己可以该多少

六、混淆分析


不过,想增加自己对代码的熟悉,当然不止于此。因此尝试去找金币和钻石等的变量

以钻石为例子进入.UpdateDiamond方法进去看下能否找到相应的钻石的变量,直接对钻石变量赋值就可以达到固定的数值

首先从这方法入手:

    public void GetDailyVipReward()
   
{
        
if (PlayerPrefs.GetInt("IsGetDailyVipReward", 0) == 0)
        
{
            
base.GPOOMNIINIP.SoundRewardClaim();
            
base.GDBIJFKKABG.UpdateDiamond("+", new HDBJNLJNJAL(10.0, 1));
            
base.GDBIJFKKABG.ShowDiamondAnimation();
            
PlayerPrefs.SetInt("IsGetDailyVipReward", 1);
        
}
   
}

我们先分析一下base.GDBIJFKKABG.UpdateDiamond("+", new HDBJNLJNJAL(10.0, 1));


中的new HDBJNLJNJAL(10.0, 1)


    public HDBJNLJNJAL(double AACJKANIABB, int JJLFPIMNOPN)
   
{
        
this.GDOFGIFHJOK = AACJKANIABB;   //10钻石
        
this.JJLFPIMNOPN = JJLFPIMNOPN;    //1
        
if (this.JJLFPIMNOPN < 1)
        
{
            
this.JJLFPIMNOPN = 1;
        
}
        
this.BLNHDPBGJGI();   //倍数计算


当看到这个是不是就直接判断GDOFGIFHJOK是钻石?那么JJLFPIMNOPN 又是什么意思?


HDBJNLJNJAL 这方法和GDOFGIFHJOK在金币 UpdateCoin 也被使用到,这就说明他只是一个容器,谁需要谁用。

JJLFPIMNOPN是一个倍数

BLNHDPBGJGI()方法倍数计算,其实就想相差1000倍:

private void BLNHDPBGJGI()
   
{
        
while (this.GDOFGIFHJOK > 1000000.0)  
        
{
            
this.GDOFGIFHJOK /= 1000.0;
            
this.JJLFPIMNOPN++;
        
}
   
}

当数值=1000000会被表达成 num=(1000;1)

数值1=1倍

数值2=1000倍

数值3=1000,000倍

就像上面的HDBJNLJNJAL(10.0, 1));   结果就是增加10,1倍

如果是HDBJNLJNJAL(10.0, 2)); 结果就是10*1000

PS:在计算钻石过程中并非单独只用JJLFPIMNOPN,还使用了其他或者赋其他的值,这是只举例一下





那么接下来看下UpdateDiamond
    public void UpdateDiamond(string EELEBAIONGM, HDBJNLJNJAL AMDAHJMNLIG)
   
{
        
if (EELEBAIONGM != null)
        
{
            
if (EELEBAIONGM == "+")   //我们看到这个加号并非计算的+号,而是一个判断是增加还是减少
            
{
               
JFMKOJNLJPD.HEENHDFPMLC.OFAPBGLLHAD(AMDAHJMNLIG);    //OFAPBGLLHAD 方法才是执行加法计算(AMDAHJMNLIG)这个参数并非int格式,并不能直接赋值
               
this.diamondText.text = JFMKOJNLJPD.HEENHDFPMLC.ToString();
               
goto IL_67;
            
}
        
}
        
JFMKOJNLJPD.HEENHDFPMLC.ECGLBPLICKK(AMDAHJMNLIG);      //这是减法计算
        
this.diamondText.text = JFMKOJNLJPD.HEENHDFPMLC.ToString();
        
IL_67:
        
HADLOEJJHND.HNMDODBLJPK();
        
CMFLIJNLMNL.OMDFBLLPHLI("Diamond", JFMKOJNLJPD.HEENHDFPMLC.GDOFGIFHJOK.ToString());
        
CMFLIJNLMNL.OMDFBLLPHLI("DiamondUnit", JFMKOJNLJPD.HEENHDFPMLC.JJLFPIMNOPN);
        
CMFLIJNLMNL.CLNFGGNKOJD();



那么看下OFAPBGLLHAD 方法的计算情况
    public HDBJNLJNJAL OFAPBGLLHAD(HDBJNLJNJAL KECHMGOOIAB)
   
{
        
int num = Math.Abs(this.JJLFPIMNOPN - KECHMGOOIAB.JJLFPIMNOPN);   //钻石倍数计算(默认都是1),结果为0
        
if (this.JJLFPIMNOPN > KECHMGOOIAB.JJLFPIMNOPN)               
        
{
            
this.GDOFGIFHJOK += KECHMGOOIAB.GDOFGIFHJOK * Math.Pow(0.001, (double)num);    //钻石总数+=增加数*0.001的num次方-->总数+=增加数*1
        
}   
        
else
        
{
            
double num2 = KECHMGOOIAB.GDOFGIFHJOK;       //计算方法和上面的一样
            
num2 += this.GDOFGIFHJOK * Math.Pow(0.001, (double)num);
            
this.GDOFGIFHJOK = num2;
            
this.JJLFPIMNOPN = KECHMGOOIAB.JJLFPIMNOPN;
        
}
        
this.BLNHDPBGJGI();  //这是倍数的计算
        
return this;   //返回最后结果到UpdateDiamond 方法中 JFMKOJNLJPD.HEENHDFPMLC.ECGLBPLICKK(AMDAHJMNLIG);   HEENHDFPMLC

那是不是认为GDOFGIFHJOK 就是钻石的变量?,错了,和上面的一样,也是个容器



HEENHDFPMLC 才是真正钻石的变量那么我们看下谁对HEENHDFPMLC进行赋值

{197A3A5B-D546-4EB7-A35A-BEAE45974D9F}.png.jpg

public static void FJMBACMKGKE()

{197A3A5B-D546-4EB7-A35A-BEAE45974D9F}.png.jpg

这时候你就可以看到所有的数据都在这里

想怎么就怎么改,不过可能还需要分析一下

JFMKOJNLJPD.HEENHDFPMLC = new HDBJNLJNJAL(CMFLIJNLMNL.HDFIMBNECDJ("Diamond"), CMFLIJNLMNL.CDNJBCFONEG("DiamondUnit"));

我们拿这个来对比下就清楚了base.GDBIJFKKABG.UpdateDiamond("+", new HDBJNLJNJAL(10.0, 1));

CMFLIJNLMNL.HDFIMBNECDJ("Diamond") = 10.0  这是钻石数不过还需要乘上后面的倍数1

CMFLIJNLMNL.CDNJBCFONEG("DiamondUnit") = 1 倍数



测试:

我将钻石修改成了

{197A3A5B-D546-4EB7-A35A-BEAE45974D9F}.png.jpg

显示应该是123000

MuMu20190312222738.png

金币、全部收入、星星币和钻石的结构都是一样的修改方法也是一样的,就不多说了



顺便说下倍数CDNJBCFONEG,这是判断输入不同的sting参数而决定不同的倍数

1.jpg

后面的其他信息比如:经验、双倍时间、等级等一些也调用了CDNJBCFONEG 方法和PMLFFELDHOI,不过这些都子基本数据,直接赋值就行了

{197A3A5B-D546-4EB7-A35A-BEAE45974D9F}.png.jpg



2倍时间的修改


修改前:JFMKOJNLJPD.BGPJNCJJNHP = CMFLIJNLMNL.PMLFFELDHOI("SpeedBuffTime");


修改后:JFMKOJNLJPD.BGPJNCJJNHP = 1111111f;


MuMu20190312225238.png



等级修改

修改前:JFMKOJNLJPD.MIAAFMGPBNH = CMFLIJNLMNL.CDNJBCFONEG("Level");

修改后:JFMKOJNLJPD.MIAAFMGPBNH = 33;


MuMu20190312225822.png


原版本APK:
https://www.lanzouj.com/i3etcoh

代码混淆只是增加一些难度而已,只要细心多花时间研究不是问题的!

免费评分

参与人数 16吾爱币 +14 热心值 +15 收起 理由
K.y + 1 + 1 哇塞,我居然看懂了,OMG!!!
lobiter + 1 谢谢@Thanks!
majiahai + 1 鼓励转贴优秀软件安全工具和文档!
我只是条咸鱼 + 1 + 1 谢谢@Thanks!
gg8899mm + 1 + 1 谢谢@Thanks!
拉卡拉多 + 1 秀啊老板
涛之雨 + 1 用心讨论,共获提升!
小高231 + 1 + 1 热心回复!
cxp521 + 1 + 1 用心讨论,共获提升!
stars-one + 1 + 1 厉害了,反混淆贼难破解呢
CrazyNut + 3 + 1 大佬牛逼啊
那小孓像风 + 1 我很赞同!
逆向先生 + 1 + 1 我很赞同!
未来一起飞 + 1 + 1 我很赞同!
xwzj20170829 + 1 + 1 热心回复!
wangyujie96 + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| lzc090 发表于 2019-3-13 19:08
那小孓像风 发表于 2019-3-13 14:25
楼主用的什么软件修改的呀可以介绍一下吗

dnspy ,论坛的爱盘就有的下载了
涛之雨 发表于 2019-3-14 00:08
啊啊啊啊啊
我正在搞一个软件。。。
不知道是不是混淆了。。
反正dll是加密了。。。。
然后so也加密了。。。。
接着。。。就没办法了。
ida不会用啊。。。。。
楼主能不能发一个类似的例子
chenjingyes 发表于 2019-3-13 00:00
digitalhouse 发表于 2019-3-13 00:05
學習到了
xwzj20170829 发表于 2019-3-13 01:48
能不能给个原版练习练习
找不到这个游戏啊
yaoyao7 发表于 2019-3-13 09:27
每次过代码混淆很容易就炸了,自己心态还是需要锻炼啊
wons0592 发表于 2019-3-13 09:29
非常不错的哦·~
轻舟自横 发表于 2019-3-13 09:58
学习一下。
xj5318361 发表于 2019-3-13 10:08
学习下感谢分享
夜步城 发表于 2019-3-13 10:40
很不错啊
轻叹 发表于 2019-3-13 11:06
感谢楼主分享~~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 23:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表