admin 发表于 2021-9-13 13:35:11

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

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