код, вычисляющий базовый адрес KERNEL32.DLL через PEB
С первой командой, обнуляющей EBX через XOR, все понятно. Но вот вторая… что-то считывает из ячейки, лежащей по адресу FS:[EBX+30]. Селектор FS указывает на область памяти, где операционная система хранит служебные (и практически никак недокументированные) данные потока. К счастью в нашем распоряжении есть Интернет. Набираем в Гугле "fs:[30h]" (с кавычками!) и получаем кучу ссылок от рекламы картриджей TK-30H до вполне вменяемых материалов, из которых мы узнаем, что в ячейке FS:[30h] хранится указатель на Process Enviroment Block – Блок Окружения Процесса или, сокращенно, PEB.
Описание самого PEB'а (как и многих других внутренних структур операционной системы) можно почерпнуть из замечательной книги "The Undocumented Functions Microsoft Windows NT/2000", электронная версия которой доступа по адресу http://undocumented.ntinternals.net/.
Из нее мы узнаем, что по смещению 0Ch от начала PEB лежит указатель на структуру PEB_LDR_DATA, по смещению 1Ch от начала которой лежит список. _не_ указатель на список, а сам список, состоящий из двух двойных слов: указателя на следующий LIST_ENTRY и указателя на экземпляр структуры LDR_MODULE, перечисленные в порядке инициализации модулей, а первым, как известно, инициализируется KERNEL32.DLL.
/* 00 */ ULONG Length;
/* 04 */ BOOLEAN Initialized;
/* 08 */ PVOID SsHandle;
/* 0C */ LIST_ENTRY InLoadOrderModuleList;
/* 14 */ LIST_ENTRY InMemoryOrderModuleList;
/* 1C */ LIST_ENTRY InInitializationOrderModuleList;