Читаю тут "Инжект как метод обхода фаерволлов" Прежде чем задать вопрос разрешите небольшое вступление ... Во первых структура LDR_MODULE Код (Text): typedef struct _LDR_MODULE { union order_type { LIST_ENTRY InLoadOrderModuleList; /* 00 */ a01.exe LIST_ENTRY InMemoryOrderModuleList; /* 08 */ ntdll.dll LIST_ENTRY InInitializationOrderModuleList; /* 10 */ kernel32.dll } PVOID BaseAddress; /* 18 */ ... Итак, чтобы найти адрес загрузки kernell32.dll нужно Код (Text): GetKernelBase_krn32 proc call delta delta: pop ebp sub ebp,delta assume fs: nothing mov eax, fs:[30h] ; Здесь находиться Peb fs:[eax].TEB.Peb mov eax, [eax+0Ch] ; В eax адрес структуры PEB_LDR_DATA mov eax, [eax+1Ch] ; В eax адрес PEB_LDR_DATA.InInitializationOrderModuleList.Flink mov eax, [eax] ; В eax адрес LDR_MODULE.InInitializationOrderModuleList ; В eax адрес InInitializationOrderModuleList. В структуре LDR_MODULE ; InInitializationOrderModuleList находится по смещению 10h, а нам нужно значение ; BaseAddress которое в LDR_MODULE наход. по смещению 18h, значит мы адрес ; InInitializationOrderModuleList просто ивеличим на 8 и получаем ; BaseAddress kernel32.dll mov eax, [eax+8] ; В eax адрес kernel32.dll ret GetKernelBase_krn32 endp Чтобы найти адрес загрузки ntdll.dll нужно Код (Text): GetKernelBase_ntdll proc call delta delta: pop ebp sub ebp,delta assume fs: nothing mov eax, fs:[30h] ; Здесь находиться Peb fs:[eax].TEB.Peb mov eax, [eax+0Ch] ; Смещаемся к структуре PEB_LDR_DATA mov eax, [eax+14h] ; Смещаемся к структуре PEB_LDR_DATA.InMemoryOrderModuleList.Flink mov eax, [eax] ; В eax LDR_MODULE.InMemoryOrderModuleList ; В eax адрес InMemoryOrderModuleList В структуре LDR_MODULE ; InMemoryOrderModuleList находится по смещению 08h, а нам нужно значение ; BaseAddress которое в LDR_MODULE наход. по смещению 18h, значит мы адрес ; InMemoryOrderModuleList просто ивеличим на 10h и получаем ; BaseAddress ntdll.dll mov eax, [eax+10h] ; В eax базовый адрес ntdll.dll ret GetKernelBase_ntdll endp Вот тут само мое непонимание этих списков Чтобы найти адрес загрузки самой exe-шки нужно Код (Text): GetKernelBase_exe proc call delta delta: pop ebp sub ebp,delta assume fs: nothing mov eax, fs:[30h] ; Здесь находиться Peb fs:[eax].TEB.Peb mov eax, [eax+0Ch] ; Смещаемся к структуре PEB_LDR_DATA mov eax, [eax+0Ch] ; Смещаемся к структуре PEB_LDR_DATA.InLoadOrderModuleList.Flink ; !!! Тут не нужно mov eax, [eax]. Тут мы сразу добавим 18h ; и получим адрес загрузки самой .exe - шки. ; mov eax, [eax+18h] ; В eax базовый адрес загрузки a01.exe ret GetKernelBase_exe endp У MsRem - читаю "Как вы видите, здесь присутствует три списка загруженных модулей, это InLoadOrderModuleList, InMemoryOrderModuleList и InInitializationOrderModuleList. Первые два содержат все инициализированные модули, а последний обычно пуст." По моему так как раз InLoadOrderModuleList - пуст? Или я ошибаюсь? Вот вопрос, если можно - почему в GetKernelBase_exe() нет в конце mov eax, [eax] ???
Базовый адрес загрузки a01.exe, в отличие от kernell32.dll и ntdll.dll, находится не в одном из списков LIST_ENTRY, а в поле PVOID BaseAddress; Поэтому и не нужен mov eax, [eax], ведь тебе не надо получать адрес списка.