- 查看: 204
- 回复: 2
教程开始
在CS2 SDK中搜索到client端
CBaseHudChat类中有个名为ChatPrintf的成员函数

我们理清思路
这个ChatPrintf是CBaseHudChat类中的函数
所以我们想要调用这个函数
我们就需要想办法获取这个类的指针
所以我们直接搜CBaseHudChat *看看怎么能取到CBaseHudChat的指针
看到了一个很有意思的东西GET_HUDELEMENT

我们发现这是一个宏定义

好 我们发现
GetHud是返回CHud的引用
然后调用了CHud类中的FindElement函数

我们看到FindElement函数中有一个字符串 这是一个很好的切入点

我们在IDA中搜索这个字符串

我们查看这个字符串的引用

然后我们定位进去 看函数头
发现实际情况 不需要传入CHud的指针 只需要传入字符串即可

我们为这个函数生成签名

这里演示Fa的API
我们调用utils.find_pattern 这是Fa的API可以找到函数签名的内存地址
然后我们通过ffi定义函数指针 将内存地址转换为函数指针
然后我们传入字符串 即可获取到CBaseHudChat的指针

我们搜索ChatPrintf
发现CBaseHudChat::MsgFunc_SayText函数里有对ChatPrintf的调用
我们注意到下面有一个字符串引用

我们在IDA查找这个字符串 然后定位引用

然后我们发现其中一个函数 结构与SDK中的CBaseHudChat::MsgFunc_SayText函数相似
然后注意到这里有个函数有"%s"字符串 且位于CBaseHudChat类
我们猜测这个是我们要找的CBaseHudChat::ChatPrintf函数

我们注意到函数头没有调用约定 那么我们默认为cdecl
而且我们知道 cdecl一般用于参数个数可变的函数
所以我们猜测这个函数就是CBaseHudChat::ChatPrintf函数

我们为这个函数生成签名

然后我们按照刚才一样的办法
用函数签名找到内存地址
然后又将内存地址转为函数指针

然后我们将其封装为函数
进入游戏进行测试

CBaseHudChat类中有个名为ChatPrintf的成员函数

我们理清思路
这个ChatPrintf是CBaseHudChat类中的函数
所以我们想要调用这个函数
我们就需要想办法获取这个类的指针
所以我们直接搜CBaseHudChat *看看怎么能取到CBaseHudChat的指针
看到了一个很有意思的东西GET_HUDELEMENT

我们发现这是一个宏定义

好 我们发现
GetHud是返回CHud的引用
然后调用了CHud类中的FindElement函数

我们看到FindElement函数中有一个字符串 这是一个很好的切入点

我们在IDA中搜索这个字符串

我们查看这个字符串的引用

然后我们定位进去 看函数头
发现实际情况 不需要传入CHud的指针 只需要传入字符串即可

我们为这个函数生成签名

这里演示Fa的API
我们调用utils.find_pattern 这是Fa的API可以找到函数签名的内存地址
然后我们通过ffi定义函数指针 将内存地址转换为函数指针
然后我们传入字符串 即可获取到CBaseHudChat的指针

我们搜索ChatPrintf
发现CBaseHudChat::MsgFunc_SayText函数里有对ChatPrintf的调用
我们注意到下面有一个字符串引用

我们在IDA查找这个字符串 然后定位引用

然后我们发现其中一个函数 结构与SDK中的CBaseHudChat::MsgFunc_SayText函数相似
然后注意到这里有个函数有"%s"字符串 且位于CBaseHudChat类
我们猜测这个是我们要找的CBaseHudChat::ChatPrintf函数

我们注意到函数头没有调用约定 那么我们默认为cdecl
而且我们知道 cdecl一般用于参数个数可变的函数
所以我们猜测这个函数就是CBaseHudChat::ChatPrintf函数

我们为这个函数生成签名

然后我们按照刚才一样的办法
用函数签名找到内存地址
然后又将内存地址转为函数指针

然后我们将其封装为函数
进入游戏进行测试
