Я читаю книгу, описывающую методы реверсирования, и я был в замешательстве.
RtlNumberGenericTableElements:
7C923FD2 PUSH EBP
7C923FD3 MOV EBP,ESP
7C923FD5 MOV EAX,DWORD PTR [EBP+8]
7C923FD8 MOV EAX,DWORD PTR [EAX+14]
7C923FDB POP EBP
7C923FDC RET 4
в основном [EBP + 8] содержит адрес общей структуры таблицы, и мы перемещаем значение 6-го элемента структуры в EAX, а затем возвращаем его. В книге автор перевел структуру на C и пришел к выводу, что это значение перенесено в EAX - это не что иное, как количество элементов в таблице.
struct TABLE
{
UNKNOWN Member1;
UNKNOWN_PTR Member2;
UNKNOWN_PTR Member3;
UNKNOWN_PTR Member4;
UNKNOWN Member5;
ULONG NumberOfElements;
UNKNOWN Member7;
UNKNOWN Member8;
UNKNOWN Member9;
UNKNOWN Member10;
};
То, что меня смутило, - это увидеть тип данных ULONG, поэтому он ссылается на 64-битное значение?
И я забыл упомянуть, что когда структура была инициализирована в предыдущих фрагментах разборки, все элементы были длиной 4 байта.
Согласно документации Microsoft, ULONG
имеет 32-разрядную ширину:
ULONG: Беззнаковый ДОЛГО. Диапазон от 0 до 4294967295 десятичных. Этот тип объявляется в WinDef.h следующим образом: typedef unsigned long ULONG;
Автор приходит к такому выводу, поскольку инструкция сборки перемещает DWORD
, который также имеет ширину в 32 бита.