背景:
- 本文需要有一定的编程基础,你需要知道自己为什么要去找函数签名。
- 本文得到了一位外国友人的帮助,感谢他的指导!!@VerMon
为什么要找函数签名?
- 很多同学一开始都不明白,函数签名是啥,为啥要去找它。这里我就不发散开来说,这边我只提一个例子。
- 某天,csgo更新了,然后服务器因为本次更新,某个插件崩了,然后我们在log里面看到是某个函数找不到了,而且这个函数是插件在gamedata.txt文件里面写的。我们完全没办法,只能等插件作者去更新gamedata文件。
- 我们这个时候会想,要是我们自己懂更新gamedata的话,就不需要等别人了,这样多好啊!
我们需要哪些工具?
实战:
我们想找一个函数的对应的signature:
void CBasePlayer::Spawn( void )
这个函数在下面源码路径里面
第一步:看看这个函数里面有没有字符串,
- 字符串这里非常重要,如果某个函数没有字符串,那么查找signature的过程将会变得更加艰辛
- 为什么字符串这么重要,因为字符串作为const 数据,编译之后存放到.rdata下面,对于反编译来说,找这种数据会非常方便
我们看到这个函数下面有如下字符串:Couldn't alloc player sound slot
if ( m_iPlayerSound == SOUNDLIST_EMPTY )
{
Msg( "Couldn't alloc player sound slot!\n" );
}
第二步:打开IDA,加载server_i486.so文件
按下SHIFT + F12,在弹出的框中CTRL + F,搜索对应的字符串,如下所示:
双击字符串进入IDA View-A窗口,然后右键对应的字符串行,再点击List cross refrence to ...
如果跳出来如下的窗口,并且对应的信息条数只有1个,那么证明我们已经找到了唯一对应的函数了!
双击它!!
步骤三:调用makesig.idc插件脚本,运算出signature
选择你上面步骤已经下载好的makesig.idc(我一般默认会放在IDA目录下面)
下面,在Output window里面已经有算出来的signature了。
结语:
- 本文仅仅是一个简单地例子,如果你需要找一些不包含字符串的函数,可能要废一番周折。
推荐思路:
如果你要找的函数functionA并没有字符串,但是fucntionB调用了functionA,同时functionB里面有字符串,那么按照类似的方法找到functionB,然后梳理一下汇编逻辑(按下IDA F5按键,可以反编译回C代码),看看能不能找到对应的fucntionA
参考:
生肉,有能力兴趣可以硬啃一啃
视频:
SourceMod Reverse Engineering #1 | Intro to Sigscanning
https://www.youtube.com/watch?v=SD6Rn2D7IGo&t=530s