Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 攻防对抗 › 破解某游戏修改器时的意外收获

破解某游戏修改器时的意外收获

Eswlnk的头像
Eswlnk
2023-09-06 22:02:18
破解某游戏修改器时的意外收获-Eswlnk Blog
智能摘要 AI
本文详细记录了一次破解国产单机游戏修改器的过程。作者最初只是想破解修改器,却意外发现其中包含了数据库账号和密码。通过Wireshark抓包分析,确认修改器使用TDS协议与远程SQL Server数据库通信,并成功提取了数据库凭证。利用这些凭证,作者远程登录数据库,获取了激活码及相关信息。尽管尝试进一步入侵远程主机未果,但成功实现了破解目标,揭示了修改器的激活机制及数据库结构。最终,作者通过合法方式验证并激活了修改器。

本来是想简单破解一下某国产单机游戏的修改器,没想到还有意外收获。


今天没事干,翻出来一款国产单机游戏,重复刷刷刷太无聊了,于是网上下了个修改器,没想到需要购买激活码才能用。并不是很贵,只要十块几毛钱,在发卡的网站上直接购买即可,推测是支付完就可以获得一个激活码,不需要人工介入。虽然不贵,但是作为一个逆向选手,难得遇到一个锻炼自己的机会,直接开搞喽。

起

破解某游戏修改器时的意外收获-Eswlnk Blog

简单一看,是个c#写的修改器,拖进dnspy里面,感觉像是被混淆了:

破解某游戏修改器时的意外收获-Eswlnk Blog

Decrypt是这样的:

private static GCHandle Decrypt(uint[] A_0, uint A_1)
{
    uint[] array = new uint[16];
    uint[] array2 = new uint[16];
    ulong num = (ulong)A_1;
    for (int i = 0; i < 16; i++)
    {
        num = num * num % 339722377UL;
        array2[i] = (uint)num;
        array[i] = (uint)(num * num % 1145919227UL);
    }
    array[0] = (array[0] ^ array2[0]) * 2849015165u;
    array[1] = (array[1] ^ array2[1] ^ 2786556537u);
    array[2] = array[2] * array2[2] * 2849015165u;
    array[3] = array[3] * array2[3] + 1807995571u;
    array[4] = (array[4] ^ array2[4]) + 1807995571u;
    array[5] = (array[5] ^ array2[5]) + 1807995571u;
    array[6] = (array[6] * array2[6] ^ 2786556537u);
    array[7] = (array[7] + array2[7]) * 2849015165u;
    array[8] = array[8] * array2[8] * 2849015165u;
    array[9] = (array[9] + array2[9] ^ 2786556537u);
    array[10] = array[10] + array2[10] + 1807995571u;
    array[11] = array[11] * array2[11] * 2849015165u;
    array[12] = (array[12] ^ array2[12]) * 2849015165u;
    array[13] = (array[13] + array2[13] ^ 2786556537u);
    array[14] = (array[14] ^ array2[14] ^ 2786556537u);
    array[15] = (array[15] * array2[15] ^ 2786556537u);
    Array.Clear(array2, 0, 16);
    byte[] array3 = new byte[A_0.Length << 2];
    uint num2 = 0u;
    for (int j = 0; j < A_0.Length; j++)
    {
        uint num3 = A_0[j] ^ array[j & 15];
        array[j & 15] = (array[j & 15] ^ num3) + 1037772825u;
        array3[(int)((UIntPtr)num2)] = (byte)num3;
        array3[(int)((UIntPtr)(num2 + 1u))] = (byte)(num3 >> 8);
        array3[(int)((UIntPtr)(num2 + 2u))] = (byte)(num3 >> 16);
        array3[(int)((UIntPtr)(num2 + 3u))] = (byte)(num3 >> 24);
        num2 += 4u;
    }
    Array.Clear(array, 0, 16);
    byte[] array4 = <Module>.Decompress(array3);
    Array.Clear(array3, 0, array3.Length);
    GCHandle result = GCHandle.Alloc(array4, GCHandleType.Pinned);
    ulong num4 = num % 9067703UL;
    for (int k = 0; k < array4.Length; k++)
    {
        byte[] array5 = array4;
        int num5 = k;
        array5[num5] ^= (byte)num;
        if ((k & 255) == 0)
        {
            num = num * num % 9067703UL;
        }
    }
    return result;
}

Decompress是这样的:

// <Module>
// Token: 0x06000004 RID: 4 RVA: 0x00016364 File Offset: 0x00014564
internal static byte[] Decompress(byte[] A_0)
{
    MemoryStream memoryStream = new MemoryStream(A_0);
    <Module>.LzmaDecoder lzmaDecoder = new <Module>.LzmaDecoder();
    byte[] array = new byte[5];
    memoryStream.Read(array, 0, 5);
    lzmaDecoder.SetDecoderProperties(array);
    long num = 0L;
    for (int i = 0; i < 8; i++)
    {
        int num2 = memoryStream.ReadByte();
        num |= (long)((long)((ulong)((byte)num2)) << 8 * i);
    }
    byte[] array2 = new byte[(int)num];
    MemoryStream memoryStream2 = new MemoryStream(array2, true);
    long num3 = memoryStream.Length - 13L;
    lzmaDecoder.Code(memoryStream, memoryStream2, num3, num);
    return array2;
}

<Module>.Main是这样的:

private static int Main(string[] A_0)
{
    uint[] array = new uint[]
    {
        2433042623u,
        3134412526u,
        156519932u,
        2628545700u,
        // 此后省略,共20244个uint
    };
    Assembly executingAssembly = Assembly.GetExecutingAssembly();
    Module manifestModule = executingAssembly.ManifestModule;
    GCHandle gchandle = <Module>.Decrypt(array, 4159999126u);
    byte[] array2 = (byte[])gchandle.Target;
    Module module = executingAssembly.LoadModule("koi", array2);
    Array.Clear(array2, 0, array2.Length);
    gchandle.Free();
    Array.Clear(array, 0, array.Length);
    <Module>.key = manifestModule.ResolveSignature(285212673);
    AppDomain.CurrentDomain.AssemblyResolve += <Module>.Resolve;
    module.GetTypes();
    MethodBase methodBase = module.ResolveMethod((int)<Module>.key[0] | (int)<Module>.key[1] << 8 | (int)<Module>.key[2] << 16 | (int)<Module>.key[3] << 24);
    object[] array3 = new object[methodBase.GetParameters().Length];
    if (array3.Length != 0)
    {
        array3[0] = A_0;
    }
    object obj = methodBase.Invoke(null, array3);
    if (obj is int)
    {
        return (int)obj;
    }
    return 0;
}

Main中的array里面有两万多个uint数据,肯定是混淆无疑了。

13行的<Module>.Decrypt(array, 4159999126u)解密得到gchandle:

破解某游戏修改器时的意外收获-Eswlnk Blog

15行把gchandle.Target加载成module,其ScopeName为koi:

破解某游戏修改器时的意外收获-Eswlnk Blog

然后再通过后续几行代码的数据变化,最后于28行,通过反射,调用处理后的数据所形成的函数/方法:

破解某游戏修改器时的意外收获-Eswlnk Blog

承

不到万不得已,我真的不想手动处理混淆。先换条路试试看。

掏出fiddler抓包,没抓到,所以激活码验证时大概率使用的不是http(s)协议。

进而掏出wireshark抓包,这次抓到了。随即大吃一惊,居然是tds协议:

破解某游戏修改器时的意外收获-Eswlnk Blog

tds协议是微软sql server通信的协议。这个修改器居然在本地客户端使用这个协议,那数据库的用户名和密码也必然存在于本地客户端中。

这里我简单介绍一下上图的各个数据包。

第一个数据包是客户端发往数据库的服务端,传输一些预登录的信息,比如版本号等:

破解某游戏修改器时的意外收获-Eswlnk Blog

第二个数据包是服务端针对第一个数据包的响应。

后面的四个数据包是tls包,进行数据库登录操作。注意,这个tls包的架构是ip->tcp->tds->tls,tls的数据是作为tds的负载而存在的、tds的数据是作为tcp的负载而存在的;而非我们常见的ip->tcp->tls:

破解某游戏修改器时的意外收获-Eswlnk Blog

然后通过一个tls数据包加密传输数据库的账号和密码,注意这个数据包是真正的ip->tcp->tls的数据包,不是tds数据包,所以过滤条件是tds的话看不到这个包,需要追踪tcp流才能看到:

破解某游戏修改器时的意外收获-Eswlnk Blog
破解某游戏修改器时的意外收获-Eswlnk Blog

另外,我在检索资料时发现,有的sql server数据库登录其实没有使用tls,就直接是账号+密码,比如:

破解某游戏修改器时的意外收获-Eswlnk Blog

(sa是sql server的管理员用户名)

我们回到正题。随后的那个Response是一些登录成功后的相关信息,是tds数据包,明文形式的:

破解某游戏修改器时的意外收获-Eswlnk Blog
破解某游戏修改器时的意外收获-Eswlnk Blog
破解某游戏修改器时的意外收获-Eswlnk Blog
破解某游戏修改器时的意外收获-Eswlnk Blog

最后四个数据包,两两组合,分别是数据库查询和对应的查询结果:

破解某游戏修改器时的意外收获-Eswlnk Blog
破解某游戏修改器时的意外收获-Eswlnk Blog
破解某游戏修改器时的意外收获-Eswlnk Blog
破解某游戏修改器时的意外收获-Eswlnk Blog
破解某游戏修改器时的意外收获-Eswlnk Blog

分析到这里,我们有了意外收获:数据库的账号和密码都存在于这个修改器的本地客户端中。

它可能会被混淆了,被加壳了,或是其他怎么样了让我们难以找到,但必然存在某一时刻,它是存在于程序中的,不然是不可能通过tds协议连接上远程的microsoft sql server的。

1 2 3
本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
声明:本站原创文章文字版权归本站所有,转载务必注明作者和出处;本站转载文章仅仅代表原作者观点,不代表本站立场,图文版权归原作者所有。如有侵权,请联系我们删除。
修改器安全渗透分析漏洞破解
2
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
PurpleOps | 开源自托管 Purple 团队管理 Web 应用程序
上一篇
2021数字中国创新大赛虎符网络安全赛道
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「漏洞资讯」CVE-2025-12914:宝塔面板曝出注入漏洞
  • 今日热点:伪Clash软件下载陷阱曝光,附防范建议
  • 漏洞资讯:Ollama 未授权访问漏洞分析与防护指南
  • 「攻防对抗」利用 fastjson 原生反序列化与动态代理突破安全限制
  • 「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

广东电信网络崩溃的原因究竟是什么?
2023-06-09 0:35:15
「WordPress插件」Spectra Pro | 可视化网站生成器
2023-12-01 0:51:17
KnockKnock | 使用干净的输出枚举 Microsoft Teams 和 OneDrive 中的有效用户
2023-09-26 12:49:36

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 0.606 秒   |  SQL查询 47 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈