吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 17966|回复: 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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
{
  "response": [
    {
      .....
      "isEncrypt": 1,
      .....
    }
  ],
  "cache": "xxx"
}



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

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

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


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


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


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

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


解码cache,改写isEncrypt=0
[C#] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
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#] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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, 下载次数: 385, 下载积分: 吾爱币 -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, 2025-4-20 15:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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