lzc090 发表于 2019-3-12 23:38

U3D《飞行日记》代码混淆破解

本帖最后由 lzc090 于 2019-3-13 10:06 编辑

前言

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

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

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

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



一、破解VIP

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



GoldVipRestore 恢复会员和 GoldVipOverdue 会员过期




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


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


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


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



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

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



二、飞机位

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



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







三、速度修改



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);




四、每日赠送钻石修改




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



我直接将10.0修改成了100000



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




红线部分的就是初始金币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,还使用了其他或者赋其他的值,这是只举例一下


https://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.png


那么接下来看下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();

https://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.png

那么看下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 就是钻石的变量?,错了,和上面的一样,也是个容器

https://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.png

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



public static void FJMBACMKGKE()



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

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

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 倍数

https://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.png

测试:

我将钻石修改成了



显示应该是123000



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

https://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.png

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



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



https://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.png

2倍时间的修改

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


修改后:JFMKOJNLJPD.BGPJNCJJNHP = 1111111f;




https://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.pnghttps://static.52pojie.cn/static/image/hrline/line7.png

等级修改

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

修改后:JFMKOJNLJPD.MIAAFMGPBNH = 33;





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

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

lzc090 发表于 2019-3-13 19:08

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

dnspy ,论坛的爱盘就有的下载了

涛之雨 发表于 2019-3-14 00:08

啊啊啊啊啊
我正在搞一个软件。。。
不知道是不是混淆了。。
反正dll是加密了。。。。
然后so也加密了。。。。
接着。。。就没办法了。
ida不会用啊。。。。。
楼主能不能发一个类似的例子{:301_999:}

chenjingyes 发表于 2019-3-13 00:00

好文章,谢谢楼主分享:lol

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

感谢楼主分享~~
页: [1] 2 3 4
查看完整版本: U3D《飞行日记》代码混淆破解