Вопрос по двухсвязным спискам из LDR_MODULE

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 25 ноя 2009.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Читаю тут "Инжект как метод обхода фаерволлов"
    Прежде чем задать вопрос разрешите небольшое вступление ...

    Во первых структура LDR_MODULE

    Код (Text):
    1. typedef struct _LDR_MODULE {
    2. union order_type
    3. {
    4.         LIST_ENTRY InLoadOrderModuleList;          /* 00 */ a01.exe
    5.         LIST_ENTRY InMemoryOrderModuleList;      /* 08 */ ntdll.dll
    6.         LIST_ENTRY InInitializationOrderModuleList; /* 10 */ kernel32.dll
    7. }
    8. PVOID        BaseAddress;                                /* 18 */
    9.  
    10. ...
    Итак, чтобы найти адрес загрузки kernell32.dll нужно

    Код (Text):
    1. GetKernelBase_krn32 proc
    2.     call   delta
    3. delta:        pop  ebp
    4.     sub          ebp,delta
    5.     assume     fs: nothing
    6.     mov          eax, fs:[30h]    ; Здесь находиться Peb fs:[eax].TEB.Peb
    7.     mov          eax, [eax+0Ch] ; В eax адрес структуры PEB_LDR_DATA
    8.     mov          eax, [eax+1Ch] ; В eax адрес PEB_LDR_DATA.InInitializationOrderModuleList.Flink
    9.     mov          eax, [eax]        ; В eax адрес LDR_MODULE.InInitializationOrderModuleList
    10.  
    11.     ; В eax адрес InInitializationOrderModuleList. В структуре LDR_MODULE  
    12.     ; InInitializationOrderModuleList находится по смещению 10h, а нам нужно значение
    13.     ; BaseAddress которое в  LDR_MODULE наход. по смещению 18h, значит мы адрес  
    14.     ; InInitializationOrderModuleList просто ивеличим на 8 и получаем
    15.     ; BaseAddress kernel32.dll
    16.  
    17.     mov   eax, [eax+8]             ; В eax адрес kernel32.dll
    18.     ret
    19. GetKernelBase_krn32 endp
    Чтобы найти адрес загрузки ntdll.dll нужно
    Код (Text):
    1. GetKernelBase_ntdll proc
    2.     call   delta
    3. delta:   pop ebp
    4.     sub  ebp,delta
    5.     assume    fs: nothing
    6.     mov         eax, fs:[30h]     ; Здесь находиться Peb fs:[eax].TEB.Peb
    7.     mov         eax, [eax+0Ch]  ; Смещаемся к структуре PEB_LDR_DATA
    8.     mov         eax, [eax+14h]  ; Смещаемся к структуре PEB_LDR_DATA.InMemoryOrderModuleList.Flink
    9.     mov         eax, [eax]         ; В eax LDR_MODULE.InMemoryOrderModuleList
    10.  
    11.     ; В eax адрес InMemoryOrderModuleList В структуре LDR_MODULE  
    12.     ; InMemoryOrderModuleList находится по смещению 08h, а нам нужно значение
    13.     ; BaseAddress которое в  LDR_MODULE наход. по смещению 18h, значит мы адрес  
    14.     ; InMemoryOrderModuleList просто ивеличим на 10h и получаем
    15.     ; BaseAddress ntdll.dll
    16.  
    17.     mov   eax, [eax+10h]         ; В eax базовый адрес ntdll.dll
    18.     ret
    19. GetKernelBase_ntdll endp
    Вот тут само мое непонимание этих списков :dntknw:
    Чтобы найти адрес загрузки самой exe-шки нужно
    Код (Text):
    1. GetKernelBase_exe proc
    2.     call    delta
    3. delta:  pop ebp
    4.     sub ebp,delta
    5.     assume  fs: nothing
    6.     mov      eax, fs:[30h]    ; Здесь находиться Peb fs:[eax].TEB.Peb
    7.     mov      eax, [eax+0Ch] ; Смещаемся к структуре PEB_LDR_DATA
    8.     mov      eax, [eax+0Ch] ; Смещаемся к структуре PEB_LDR_DATA.InLoadOrderModuleList.Flink  
    9.  
    10.     ; !!! Тут не нужно mov    eax, [eax]. Тут мы сразу добавим 18h  
    11.     ; и получим адрес загрузки самой .exe - шки.  
    12.     ;
    13.  
    14.     mov   eax, [eax+18h]    ; В eax базовый адрес загрузки a01.exe
    15.     ret
    16. GetKernelBase_exe endp
    У MsRem - читаю
    "Как вы видите, здесь присутствует три списка загруженных модулей,
    это InLoadOrderModuleList, InMemoryOrderModuleList и InInitializationOrderModuleList.
    Первые два содержат все инициализированные модули, а последний обычно пуст."

    По моему так как раз InLoadOrderModuleList - пуст? Или я ошибаюсь?

    Вот вопрос, если можно - почему в GetKernelBase_exe() нет в конце mov eax, [eax] ???
     
  2. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    Базовый адрес загрузки a01.exe, в отличие от kernell32.dll и ntdll.dll, находится не в одном из списков LIST_ENTRY, а в поле PVOID BaseAddress; Поэтому и не нужен mov eax, [eax], ведь тебе не надо получать адрес списка.