吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 17653|回复: 32
收起左侧

[Android 原创] 记一次FGO逆向过程 End

  [复制链接]
ss22219 发表于 2018-2-13 14:26
本帖最后由 ss22219 于 2018-3-5 16:48 编辑

上一篇说到成功解析了服务器请求的加密和校验

这一篇简单分析下战斗数据吧


ac.php post:
acaction
keybattlesetup

请求参数这里就不多讲诉了,想要了解这些如何填入这些参数,可以从游戏源码,以及FGO管理系统中查获
base64解码并UTF8编码转换成字符串后


[JavaScript] 纯文本查看 复制代码
{
  "response": [
    {
      .....
      "isEncrypt": 1,
      .....
    }
  ],
  "cache": "xxx"
}



战斗请求返回信息里面看到有一个cache是base64编码的
直接base64解码,发现是一堆乱码

在源代码里查找FromBase64String的引用,发现ResponseCacheDecrypt方法
查看ResponseCacheDecrypt方法引用

[C#] 纯文本查看 复制代码
if (serverMark)
{
        string cryptString = (string)wwwparam["cache"];
        string cacheString = string.Empty;
        try
        {
                cacheString = CryptData.ResponseCacheDecrypt(cryptString, false);
        }


这里发现,如果返回的信息包含isEncrypt=1,那么就执行ResponseCacheDecrypt
[JavaScript] 纯文本查看 复制代码
serverMark = (responseData.isEncrypt != 0);


对cache使用ResponseCacheDecrypt,然后得出战斗返回数据
这个数据包含了玩家svt信息,也包含了怪物的信息


我们写一个Fiddler插件,解析内容

判断url,base64解码返回值
[C#] 纯文本查看 复制代码
        public void AutoTamperResponseBefore(Session oSession)
        {
            if (oSession.url.IndexOf("/ac.php?_userId=") != -1)
            {


解码cache,改写isEncrypt=0
[C#] 纯文本查看 复制代码
                    var root = JsonConvert.DeserializeObject<JObject>(content);

                    var response = (JObject)root.SelectToken("response[0]");

                    var isEncrypt = response.Property("isEncrypt");

                    isEncrypt.Value = 0;
                    File.WriteAllText(@"C:\Users\gool\Desktop\project\fgo\cache.json", ResponseCacheDecrypt(root.SelectToken("cache").ToString()));


我们将cache保存到cache.json文件分析

可以看到其中有很多数据,进过反复对比确认

replaced.battle[0].battleInfo.userSvt包含了本次战斗的从者数据
updated.userSvtCollection包含了助战的一些信息

对于脱机战斗来说我们没必要解析这些信息
不过可以编写一个脚本,让Fiddler帮助我们来修改这些数据

获取助战svtId:
[C#] 纯文本查看 复制代码
        List<int> GetFollowerSvtIds(JObject cacheObj)
        {
            var list = new List<int>();
            var array = (JArray)cacheObj.SelectToken("updated.userSvtCollection");
            if (array == null)
                return list;
            for (int i = 0; i < array.Count; i++)
            {
                var svt = (JObject)array[i];
                list.Add(svt.Property("svtId").Value.Value<int>());
            }
            return list;
        }


判定是否是怪物,修改基础数据
[Asm] 纯文本查看 复制代码
        void ReplaceSvtInfo(JArray svts, List<int> followers)
        {
            FiddlerApplication.Log.LogString("ReplaceSvtInfo");
            for (var i = 0; i < svts.Count; i++)
            {
                var svtObj = (JObject)svts[i];
                if (svtObj.Property("userId").Value.ToString() == "0" && !followers.Contains(svtObj.Property("svtId").Value.Value<int>()))
                {
                    if (svtObj.Property("atk") != null)
                    {
                        svtObj.Property("atk").Value = 10;
                        svtObj.Property("hp").Value = 40000;
                    }
                }
                else
                {
                    if (svtObj.Property("atk") != null)
                    {
                        svtObj.Property("atk").Value = 80000;
                        svtObj.Property("hp").Value = 80000;
                    }
                    else if (svtObj.Property("maxAtk") != null)
                    {

                        svtObj.Property("maxAtk").Value = 80000;
                        svtObj.Property("maxHp").Value = 80000;
                    }
                }
                svts[i] = svtObj;
            }
        }




===========================================

FGO系列到此一共6章,也该结束了
1-3章记录了Native层的一些逆向技巧
4章简单说明了下Android Java层的调试方法
5-6章是游戏源代码的分析


虽然有很多遗憾,也有不少迷惑,但是也有不少收获




有朋友说想让我总结一下,但是我发现我实在总结不出什么东西来。。。

作为一名小白,一步步走到这里,发现很多都是以前积累的知识的运用

逆向的关键就是找到关键代码,比如在mono函数查找中,利用开源代码,一步步找到image_open函数
在java和c#代码分析中,利用login md5 base64这些关键词,往往能找到不少关键函数


实在想不出其他要说的,这个系列说了这么多东西,就放下脚本代码给大家用下吧



最后,祝大家新年快乐!


FGOModify.zip

223.65 KB, 下载次数: 383, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 18吾爱币 +19 热心值 +18 收起 理由
yikuaiyingbi + 1 + 1 用心讨论,共获提升!
blksals + 1 + 1 我很赞同!
wmsuper + 2 + 1 谢谢@Thanks!
九门提督定风波 + 1 + 1 热心回复!
zycode + 1 + 1 谢谢@Thanks!
天阙丶 + 1 + 1 谢谢@Thanks!
isora + 1 + 1 热心回复!
walkersky + 1 + 1 谢谢@Thanks!
STSnaive + 1 + 1 dalao厉害,好奇抽卡机制
unlockable + 1 + 1 用心讨论,共获提升!
花火Cage + 1 + 1 厉害了!其实抽奖功能是比较受关注的,抽奖的随机方式。
民以玩为天 + 1 + 1 我很赞同!
幻灵 + 1 + 1 谢谢@Thanks!
忒伊亚 + 1 + 1 谢谢@Thanks!
niconico128 + 1 + 1 热心回复!
winding + 1 + 1 大牛,仰望
dwq308 + 1 + 1 我很赞同!
boyulin + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

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

then950629 发表于 2018-5-7 15:49
ss22219 发表于 2018-2-13 16:14
没有哦,这个自己分析吧

大大,你好呢,看了你这个脱机逆向,这里面的 ,下面三个数值,1.32.1519070400   这三个数值是什么意思呢,这是 目前fgo里面,脱机挂Program.cs里的三个,可以帮我解答下吗?
"aK8mTxBJCwZyxBjNJSKA5xCWL7zKtgZEQNiZmffXUbyQd5aLun",
                "/rongame_beta/rgfate/60_member/",
                "/rongame_beta/rgfate/60_1001/",
                "1",
                "32",
                "1519070400",
blksals 发表于 2018-9-27 13:47
大佬您好,我最近在搞FGO日服数据包的解包,但是我手里没有密钥和算法,再加上本人能力有限,对此便束手无策。
刚好看到您写的这几篇文章,觉得您在这方面非常有能力,所以特来向大佬请教一下解决的方法,万分感谢。
jianghanxia 发表于 2018-2-13 14:34
不知道怎么修改日服?Fiddler代{过}{滤}理也可行?
 楼主| ss22219 发表于 2018-2-13 14:37
jianghanxia 发表于 2018-2-13 14:34
不知道怎么修改日服?Fiddler代{过}{滤}理也可行?

应该没问题
萌萌哒的小白 发表于 2018-2-13 14:41
谢谢分享!学习了!
boyulin 发表于 2018-2-13 15:40
想問一下  陸板fgo 沒禁止在模擬器使用嗎
台服好像會限制  有的話  沒看到大大 介紹這方面的處理
尐邵家居 发表于 2018-2-13 15:42
00000000000000000000000000000000000
 楼主| ss22219 发表于 2018-2-13 16:14 来自手机
boyulin 发表于 2018-2-13 15:40
想問一下  陸板fgo 沒禁止在模擬器使用嗎
台服好像會限制  有的話  沒看到大大 介紹這方面的處理

没有哦,这个自己分析吧
boyulin 发表于 2018-2-13 16:16
ss22219 发表于 2018-2-13 16:14
没有哦,这个自己分析吧

好的謝謝
macgudu 发表于 2018-2-13 16:49
謝謝分享,新年快乐!
jianghanxia 发表于 2018-2-13 17:15
测试了一下,日服不能正常运行,应该是加密不一样~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-16 00:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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