Можно ли найти память, строку или аналогичные функции копирования памяти в двоичном коде ppc / mips? - PullRequest
0 голосов
/ 26 мая 2018

Я только начинаю анализировать двоичный файл ELF в PPC / MIPS.Однажды у меня появилась идея, что я хочу найти все функции копирования строк или памяти, такие как strcpy (), strncpy (), memcpy (), memmove (), которые реализованы самим программистом.Можно ли идентифицировать все похожие функции копирования памяти?Спасибо!

1 Ответ

0 голосов
/ 28 мая 2018

Не на 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

Во-вторых, даже если у вас есть определенное определение для копии, обнаружить наличие этого было бы чрезвычайно трудно надежно.

Вы могли бы реализовать что-то, что выглядитдля общего паттерна load / store / conditional-branch, но это нашло бы только тривиальные случаи реализации memcpy, и те, «реализованные самим программистом», могли принимать любую форму.

...