签名
为了从模组中识别一个函数,我们可以使用一种叫做签名的东西。一个函数的签名是通过查看该函数的字节码,并找到一段对该函数来说是独一无二的字节序列来生成的。幸运的是,我们不需要自己查看函数的字节码,而是可以使用IDA中的签名生成器插件。
签名生成器插件通常会随你的IDA安装一起提供,但如果你的IDA没有这个插件,你可以从这里获取。
生成签名
IMPORTANT
在伪代码窗口中,请确保你的光标选中在函数名上。 务必确保你在函数的开头生成签名,这一点非常重要。
接下来,按下组合键 Ctrl + Alt + S
或点击 Edit > Plugins > Signature Maker
,并保留提供的默认选项,如下图所示。
最后,点击 OK
。然后查找 Output
窗口,该函数的签名应该会打印在其中。 从这里简单地复制你的签名,就完成了!
为什么要使用签名?
签名非常有用,因为它们可以跨多个版本识别相同的函数,前提是该函数本身在两个版本之间没有被修改。 正因如此,签名比使用硬编码地址要好得多,因为硬编码地址总是会在版本之间失效。
何时不应该使用签名?
考虑以下示例,你有函数A和函数B,这两个函数非常相似:
c++
void functionA(int a) {
return a + a + 5;
}
void functionB(int b) {
return b + b + 6;
}
在这种情况下,这两个函数通常会具有几乎相同的签名,这意味着第一个独特的字节可能在函数内部的第1000个字节之后。 通常,这是一个使用硬编码地址的好情况,因为如此大的签名使用起来会很笨拙。 return b + b + 6; }
In this scenario, it is common for the two functions to have nearly identical signatures, meaning the first unique could be 1000s of bytes into the function. Generally, this is a good scenario to use a hardcoded address, since a signature of that size is awkward to work with.