Сторнирование структуры в недокументированном API

0

Я читаю книгу, описывающую методы реверсирования, и я был в замешательстве.

    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 байта.

Теги:
struct

1 ответ

1
Лучший ответ

Согласно документации Microsoft, ULONG имеет 32-разрядную ширину:

ULONG: Беззнаковый ДОЛГО. Диапазон от 0 до 4294967295 десятичных. Этот тип объявляется в WinDef.h следующим образом: typedef unsigned long ULONG;

Автор приходит к такому выводу, поскольку инструкция сборки перемещает DWORD, который также имеет ширину в 32 бита.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню