老规矩 先解压APP看引擎 Unity + Lua 那么开始Dump吧

IL2CPP Dump需要 得到 “global-metadata.dat” 和 "libil2cpp.so" 文件
进入目录”assets\bin\Data\Managed\Metadata“
找到dat文件 通过载入模板解析 发现 “global-metadata.dat” 没有加密
那么可以尝试直接Dump

这里也是成功的Dump了下来 接下来就是把Lua文件Dump下来 就可以开始分析了

直接使用 HOOK代码 将其Lua 成功Dump 下来 至此前期准备工作就已经完成了

现在就是开始抓包分析封包(可以提前先用 IDA打开SO文件 让其先解析 这样省时间)
通过抓包发现 头部 貌似是固定的 后面内容不知 那么先在”dnSpy“ 里面打开Dump 出来的 DLL文件看看吧

常用网络关键词搜索 "network" 发现了特别可疑的点 "msgid" 还有 "Packet" "UnPacket" 符合我们所需的 组包 解包的点 那么去看SO吧 跳转到偏移

这里也是分析了 他写入了一个整数52462 通过十六进制转换 得到的内容与消息头符合 那么说明找对地方了 开始Hook

通过hook 得到了原始数据 和 CRC16效验的 提交数据 以及效验码
以及他的流程
NetWorkUnit_Encrypt__EncodeRange 异或 实际是 传入了 两个 CRC效验码 将其异或变更

经过测试 他的CRC16 模式是 CCITT 并没有魔改

现在还剩下一个 NetWorkUnit_Encrypt__EncodeRange 我们已知他传入的是两个CRC16效验码组成的 4字节
他里面检测了 几个值 但是主要用到的 _mSKeybuff 作为Key 异或 那么我们需要寻找他的来源
我们发现他是 通过 this 进行读取的结构属性
那我们就打开 dnSpy 找到结构 NetWorkUnit 类 下面的Encrypt

他是在结构的 偏移32 字节集类型 但是在结构当中 并没有直接设置 Key密钥字节的地方
并且查看了 他初始创建 也没有定义Key的来源 这个时候 该如何找呢 陷入僵局

既然现在还不知道做什么 那么 先把他的值给Hook 出来 可能思路就来了
通过hook 发现 _mNKey 等价于 _mSKeybuff
这个时候眼见的朋友就会发现 好像有个值特别熟悉了 我们拉到开头
他连接后做的第一件事 是发送了一个 不知道是什么的内容 返回了 c3070000
那么很大可能是通过返回消息 动态设置的Key


继续上 SO 找消息回调函数 找到了一个关键名称 ”RecvSalt“ 读取盐值
函数里边 将盐值转换成了 整数型 并且调用了 SendKeyCrc 方法


内部进行了 设置密钥的一些参数 并且发送
通过推测可以确定 他肯定是第二条发送 因为 第二条封包发送的 是两个字节 符合CRC16

现在就是在有关函数方面 无脑跟先粗略过一遍

跟到后面 成功发现了 _mSKeybuff 是如何生成的
实际是 (mNTargetSalt ^ mNSelfSalt) + 8254; 通过异或 并且加了一个整数 得到的值作为密钥

但是我们还有一个点没有找到啊
已知 mNSelfSalt 是通过消息返回的 但是 mNTargetSalt 我们并不知道是怎么生成的
继续直接Hook 上他发送 找调用栈 成功发现 它实际就是一个 10位时间戳

我们来转换一下就能知道了 计算器 一恰明显的 10位时间戳 至此 发送加密效验已全部分析完整

到了验证阶段
使用示例数据 ”EECC00000A00000028D108D9 02000000FF04923D0000“
前面头部12字节长度 后面位消息内容
我们以 为参数内容 ”02000000FF04923D0000“ 固定初始密钥 1765986613 测试
得到的结果为 ”EECC00000A00000028D108D902000000FF04923D0000“ 与实际加密结果一致
那么 完结 撒花!!!

[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!