平方X

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3857|回复: 0

[2529]物理弹球学习笔记

[复制链接]

414

主题

709

帖子

3679

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3679
QQ
发表于 2018-5-2 16:26:01 | 显示全部楼层 |阅读模式
[md]
之前学习过 [《Polyforge学习笔记》](https://blog.csdn.net/pingfangx/article/details/52138040)  
正好这两天看雪公众号推了一篇 unity3d 破解的文章,于是想用最近玩了下的物理弹球来学习。

[王正飞《[原创]unity3d手游破解(一)》](https://bbs.pediy.com/thread-226135.htm)

[王正飞《[原创]unity3d手游破解(二)》](https://bbs.pediy.com/thread-226208.htm)

[王正飞《[原创]unity3d手游破解(三)--基于inline hook》](https://bbs.pediy.com/thread-226261.htm)

整理原作者的布骤
1. 确认
> libmono.so以及\assets\bin\Data\Managed\Assembly-CSharp.dll,可以确定是unity3d手游

2. 解密dll
> 把 libmono.so扔进ida,找到mono_image_open_from_data_with_name函数,F5查看发现了解密代码:  
> 在这个函数先判断加载的dll是否包含ssem字符串,接着判断前两个字节是否等于82(0x52),77(0x4d),因此可以确定下面的for循环是解密代码,比较简单,抄下来自己写一个解密程序(附件有一份),然后对这个 Assembly-CSharp.dll进行解密。

3. 修改dll
> 把 Assembly-CSharp.dll扔进Reflector+reflexil环境进行修改(不会的同学百度学习一下),找到关键函数get_DamageValue,直接改成返回100W,然后攻击就变成了100W。

开始尝试修改
# 修改 Assembly-CSharp.dll
搜索 score ,看到 Declaring Type 为 GamePanel,双击  
看到 Game、GamePanel、GameSingle等类  
进行一番查看,有一些可能使用的方法  
GameSingle.GameRevive  
GameSingle.JudgeFinish  
GamePanel.OnRevive  
GamePanel.AddScore  
VectorAdsInstance.ShowNGS  
尝试修改,发现打开闪退。  

发现好像是使用 360 加固的,加固这一块还需要再学习,放弃。  

# 修改 sp
尝试修改 sp 文件,以便使用 SL 大法。  
在 `game.color.ballz.block.brick.puzzle.free.physics.balls.xc.v2.playerprefs.xml` 中保存了相关信息。  
进行修改后,打开后数据清空,猜测可能是有加密字段。  
看到  key_useInfo_s  总是在变,怀疑就是加密字段。  
简单对 key_useInfo 进行 md5 ,没有发现匹配,于是又回去看源码。

    GameSingle.SaveGame() : Void
    GameUser.SaveLastGameData(Boolean, Single, Int64, Boolean, List<DataDots>, List<DataBlocks>, List<DataProps>) : Void
    GameUser.Save() : Void
        public static void Save()
    {
        string str = JsonUtility.ToJson(Instance);
        Storage.WriteConfig("useInfo", str);
    }
    Storage.WriteConfig(String, String) : Void
        public static void WriteConfig(string type, string value)
    {
        PlayerPrefs.SetString("key_" + type, value);
        PlayerPrefs.SetString("key_" + type + "_s", md5(iemi + value + iemi));
    }

    可以看到是拼接了 iemi
    public static void Init(string iemi = "vectorAlwaysLoveU")
    {
        Storage.iemi = iemi + "vectorAlwaysLoveU";
        if (!ReadConfig("version", "null").Equals("1.0"))
        {
            WriteConfig("version", "1.0");
        }
    }
    调用为
    InitScript.InitAll() : Void
        public static void InitAll()
    {
        if (!alreadyInited)
        {
            alreadyInited = true;
            Input.set_multiTouchEnabled(true);
            Application.set_targetFrameRate(60);
            UIManager.UpdateRandomState(-1);
            Storage.Init("vectorAlwaysLoveU");
            DotSkins.Init();
            Localization.Init();
            AudioSystem.Init();
            GameUser.ReadFromLocal();
            if (Application.get_platform() == 8)
            {
                isLoginGameCenter = true;
            }
            else if (Application.get_platform() == 11)
            {
                isLoginGameCenter = false;
                string msg = "pb_noads";
                VectorNative.invokeNative(100, msg);
            }
        }
    }

    最终确认,iemi为 "vectorAlwaysLoveU"+"vectorAlwaysLoveU"
    保存时 md5(iemi + value + iemi)
    测试
    <string name="key_version">1.0</string>
    <string name="key_version_s">c1cd799023551f8eb3bcc805ff736717</string>
    加密成功。
    不过,在保存 useInfo 的时候,要注意转为 json 后,再存入 sp 是被转义了,所以应该按如下步骤

# 修改 sp 步骤
    去除转义
    进行修改
    加密
    转义保存

# 相关代码
[PhysicsBalls](https://github.com/pingfangx/GameX/blob/master/PhysicsBalls/PhysicsBalls.md)

[physics_balls.py](https://github.com/pingfangx/PythonX/blob/master/ToolsX/android/crack/physics_balls/physics_balls.py)[/md]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|平方X ( 冀ICP备14018164号 )

GMT+8, 2024-12-22 09:26 , Processed in 0.118433 second(s), 21 queries .

技术支持:Powered by Discuz!X3.4  © 2001-2013 Comsenz Inc.

版权所有:Copyright © 2014-2018 平方X www.pingfangx.com All rights reserved.

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