Это вызов указателя функции, хранящегося в структуре.
Эта первая строка получает указатель, хранящийся по адресу DS:xxxxxxxx
. Квадратные скобки обозначают разыменованием адреса, как *
в C. Значение из памяти предназначено для использования в качестве указателя; он помещается в регистр ecx
.
MOV ECX,DWORD PTR DS:[xxxxxxxx] ; xxxxxxxx is an address
Вторая строка разделяет указатель, полученный выше. Это значение от ecx
теперь используется как адрес, который разыменовывается. Значение, найденное в памяти, является другим указателем. Этот второй указатель помещается в регистр edx
.
MOV EDX,DWORD PTR DS:[ECX]
Третья строка снова разыменовывает память; на этот раз доступ происходит по адресу offset из указателя, полученного выше, на 0x116 байт. Это не равномерно делится на четыре, поэтому этот указатель функции не появляется из C++ vtable. Значение, полученное из памяти, на этот раз хранится в регистре eax
.
MOV EAX,DWORD PTR DS:[EDX+116]
Наконец, функция указывает eax
выполняется. Это просто вызывает функцию через указатель функции. Функция, как представляется, принимает нулевые аргументы, но у меня есть вопрос о пересмотре моего ответа: есть ли инструкция PUSH
, предшествующая этому фрагменту? Это будут аргументы функции. Вопросительные знаки указывают, что эта функция может вернуть значение, мы не можем сказать из нашего преимущества.
CALL EAX
В целом, фрагмент кода выглядит как вызов функции расширения из плагина в библиотеке в OllyDbg. ABI OllyDbg определяет различные struct
s, которые содержат некоторые указатели на функции. Существуют также массивы указателей на функции, но двойная обратная связь, чтобы добраться до указателя edx
(также смещение с невыравниванием по четному краю), заставляет меня думать, что это struct
, а не массив указателей функций или класс vtable класса C++.
Иными словами, xxxxxxxx
является указателем на указатель на struct
, содержащий указатель на функцию.
В исходном файле OllyDbg PlugIn.h - некоторые кандидаты struct
определений. Вот пример:
typedef struct t_sorted { // Descriptor of sorted table
char name[MAX_PATH]; // Name of table, as appears in error
int n; // Actual number of entries
int nmax; // Maximal number of entries
int selected; // Index of selected entry or -1
ulong seladdr; // Base address of selected entry
int itemsize; // Size of single entry
ulong version; // Unique version of table
void *data; // Entries, sorted by address
SORTFUNC *sortfunc; // Function which sorts data or NULL
DESTFUNC *destfunc; // Destructor function or NULL
int sort; // Sorting criterium (column)
int sorted; // Whether indexes are sorted
int *index; // Indexes, sorted by criterium
int suppresserr; // Suppress multiple overflow errors
} t_sorted;
Эти примеры могут быть NULL
, и ваш ASM сниппет не проверяет NULL
указатель на указатель на функцию. Следовательно, это должно быть DRAWFUNC
от t_table
или SPECFUNC
от t_dump
.
Вы можете создать небольшой проект, который включает в себя файл заголовка, и использует printf()
и offsetof()
, чтобы определить, находится ли это в смещении 0x116.
В противном случае я полагаю, что внутренности OllyDbg написаны в том же стиле. Таким образом, вероятно, будут частные определения struct
(не опубликованы в файле Plugin.h), используемые для различных целей в OllyDbg.
Я хотел бы добавить, я думаю, что стыдно, что источники OllyDbg недоступны. У меня создалось впечатление, что статически связанный дизассемблер, который он содержит, был под какой-то лицензией GPL, но мне не удавалось получить источники в OllyDbg.
@ x0n - откуда домашняя бирка? –
Это не домашнее задание, я просто плохо разбираюсь в сборке. – Iron
удален домашняя бирка. – x0n