C++逆向之跳出线程发包的几种方式(韩服剑灵2)

[复制链接]
查看: 369   回复: 0

35

主题

35

帖子

434

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
434
发表于 2021-9-13 13:35:11 | 显示全部楼层 |阅读模式
明文发包CALL是分析一款游戏功能的主要突破口,但是很多游戏都是线程发包,需要跳出线程才能得到明文CALL的位置。以往的条线程方式都是在包内容或者内容来源上下写入断点,一次或者多次写入就可以跳出线程,但是韩服的剑灵2又有了一些不一样的地方,很多人也会在这里止步不前。下面我们就利用几种不同的方式跳出这个游戏的发包线程。
1.png
前面的方法都是固定不变的,首先我们用xdbg64找到其发包函数WSASend
2.png
由于这里每次断的包内容地址是变化的,所以我们要取追一下来源,执行到返回后来到函数调用处
3.png
这里的包内容来源于rax+[rdi+18],而下断之后我们可以发现rax始终都0,所以我们继续向上追rdi,可以得到来源于CALL的返回值。
CALL上下断,并单步到内部,可以得到一个数组,这发包方式和传奇永恒的特别像
4.png
这里的RCX是不变的,所以我们可以直接配出包内容的公式为[rcx+18]+([rcx]&FFFFFFFF)*8
填入rcx的值,在数据窗口中跟随,并在下面不远处选择一个地址,提前下好写入断点,不断的走路发包,等待游戏断下
5.png
我们发现写入的这个位置还是在原来那个函数内部,也就是说我们还是没有跳出线程
6.png
那么我们要继续向上追rbp的来源,在执行到返回后得到了[r14+rax]
7.png
在这里下断后发现r14始终是0,而rax是不变的,于是我们在rax上下写入断点,走路后游戏断下
8.png
现在这个位置就是很多人都会遇到的难点,继续向上追可以得到一个数组,而这数组的下标是随机获取的,想从这个里入手很麻烦
9.png
既然这里不好下写入断,那我们只要整体函数的执行流程做一个分析。
在上面我们发现了一个位置断的特备频繁,发包的执行流程中会掺杂大量的假包,并跳到函数尾部,不执行发包代码。而这个位置的上面会有一个判断,用来分辨当前执行的代码是否是真的发包代码。
10.png
所以我们分别取追一下r14deax的来源,并最终得到了两处赋值的位置
11.png
我们在下面的数组上下断,获取到真正发包时的rbp的值,并对+40+88进行下断观察,可以发现+88是决定代码流程的关键,因为有的时候+40不变,而+88会改变,此时恰好会让二者不相等,实现真的发包。
12.png
于是我们在这个+88偏移上下写入断点,尝试跳出线程。在游戏内下断断的狠频繁,我们很难做出写入的动作。所以我们要来带创建角色界面下断,在这里可以很轻松的断下,并来到跳出线程的代码里
13.png
这是我们的第一种跳出方式,而第二种方式比较简单,我们可以用CE对这个地址下写入断点,然后挨个尝试,其中会有一个写入会在线程外
14.png
第三种方式有一些玄学,就是在模块内扫描比较函数中的基地址,虽然扫描到的基地址有很多,不过在前面的几个里面就会有一个在线程外,跳过去下断可以返回到功能CALL。当然这种方式虽然有一定的道理,但也是在我们走投无路的情况下才去尝试的。
15.png
16.png
以上就是跳出剑灵2线程的几种方法,如果大家有更多的方法,也可以联系我,大家一起学习交流下。
玩游戏,学逆向,做安全,欢迎感兴趣的小伙伴关注我们。

回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X3.4 © 2001-2018 Comsenz Inc.