我刚开始分析PPC / MIPS中的ELF二进制文件。有一天,我有一个想法,我想找到所有字符串或内存复制函数,就像strcpy(),strncpy(),memcpy(),memmove()一样,由程序员自己实现。是否可以识别所有类似的内存复制功能?谢谢!
答案 0 :(得分:0)
不是100%可靠的方式。这里似乎有两个主要问题。
首先,它不清楚你将什么归类为"副本"。如何区分四字节内存副本只需加载和存储大小相同的单词?
例如,如果我们编译它:
void assign(long *x, long *y)
{
*x = *y;
}
void copy(void *x, void *y)
{
memcpy(x, y, 8);
}
我们基本上得到了相同的说明:
0000000000000000 <assign>:
0: 00 00 24 e9 ld r9,0(r4)
4: 00 00 23 f9 std r9,0(r3)
8: 20 00 80 4e blr
0000000000000020 <copy>:
20: 00 00 24 e9 ld r9,0(r4)
24: 00 00 23 f9 std r9,0(r3)
28: 20 00 80 4e blr
其次,即使您对副本有特定的定义,检测其存在也很难可靠。
你可以实现一些寻找加载/存储/条件分支的一般模式的东西,但这只能找到memcpy实现的简单案例,以及那些由程序员实现的&#34;&#34;可以采取任何形式。