Разные значения SizeOfImage

Тема в разделе "WASM.BEGINNERS", создана пользователем Flasher, 6 дек 2008.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Не совсем понятно почему значения LDR_DATA_TABLE_ENTRY.SizeOfImage и ZwQueryVirtualMemory!MEMORY_BASIC_INFORMATION.RegionSize отличаются друг от друга..

    Например у ntdll:
    RegionSize - 69000h
    SizeOfImage - af000h

    И есть-ли третий способ получения размера памяти занимаемого модулем.. ?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    LDR_DATA_TABLE_ENTRY.SizeOfImage содержит полный размер спроецированного модуля.
    MEMORY_BASIC_INFORMATION.RegionSize возвращает размер блока памяти, в котором страницы имеют ожинаковые атрибуты, чтобы получить полный размер нужно перечислять в цикле блоки памяти последовательно, пока MEMORY_BASIC_INFORMATION.AllocationBase одинаково.
     
  3. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Вроди сделал как описал..
    Код (Text):
    1. start proc
    2.      local buffer[1024]:byte
    3.      local ReturnLength:dword
    4.      local MemoryInformation:MEMORY_BASIC_INFORMATION
    5.      local ImageBase:dword
    6.      local RegionLenght:dword
    7.  
    8.      assume fs:nothing
    9.      mov ebx,fs:[TEB.Peb]
    10.      mov ebx,PEB.Ldr[ebx]
    11.      mov ebx,PEB_LDR_DATA.InLoadOrderModuleList.Flink[ebx]
    12.      mov ebx,LDR_DATA_TABLE_ENTRY.InLoadOrderModuleList.Flink[ebx]
    13.      mov edi,LDR_DATA_TABLE_ENTRY.SizeOfImage[ebx]
    14.      mov esi,LDR_DATA_TABLE_ENTRY.DllBase[ebx]
    15.      mov RegionLenght,0
    16.      mov ImageBase,0
    17.   @@:
    18.      invoke ZwQueryVirtualMemory,-1,esi,MemoryBasicInformation,addr MemoryInformation,sizeof MEMORY_BASIC_INFORMATION,addr ReturnLength
    19.      or eax,eax
    20.      jnz @F
    21.      mov eax,MemoryInformation.RegionSize
    22.      add RegionLenght,eax
    23.      add esi,eax
    24.  
    25.      mov eax,MemoryInformation.AllocationBase
    26.  
    27.      .if ImageBase == 0
    28.         mov ImageBase,eax
    29.         jmp @B
    30.      .endif
    31.      cmp ImageBase,eax
    32.      je @B
    33.   @@:
    34.      invoke wsprintfA,addr buffer,$CTA0("RegionSize: 0%08xh\nSizeOfImage: 0%08xh\n"),RegionLenght,edi
    35.      invoke MessageBox,0,addr buffer,$CTA0("SizeOfImage"),0
    36.      invoke ExitProcess,0
    37. start endp
    А результаты суравно не идентичны

    RegionSize: 001b10000h
    SizeOfImage: 0000af000h

    Откуда надежнее брать эту инфу ?
    А то байтом меньще или байтом больще - могет привести к весьма печальным последствиям :)
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Если столь кривая реализация, это не значит что кривой алгоритм :)
    На последнем проходе, когда следующий блок берётся за образом модуля ты добавляешь его размер к результату и только потом проверяешь базу, нужно наоборот.
     
  5. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    А.. точно :)
    Так все-же откуда надежнее брать инфу ?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Модуль в памяти понятие расплывчатое, если он не меняетсо, то лучше юзоть чтение блоков памяти, в идеале считать с диска модуль и размер определить, реально защита может выполнить хитрые манипуляции с проекцией, поэтому нужно знать зачем понадобилось определять его размер.
     
  7. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Clerk

    Код (Text):
    1.         KiFastSystemCall -> ZwProtectVirtualMemory проверка
    2.  
    3.         mov eax,(второй параметор)
    4.         mov eax,dword ptr [eax]
    5.  
    6.         .if eax > (начальный адрес модуля) && eax < (конечный адрес модуля)
    7.            jmp _ne_xorosho
    8.         .endif
    Т.е. таким макаром противодействовать хуку внутри процесса.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Бесполезно, мало того что обычно это из другого процесса делоют, но если даже в текущем процессе, то вызов ведь через прерывание сервиса, KiFastSystemCallRet в таком случае не будет исполнена.
     
  9. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Clerk, та большинство хукеров на дельфи пишут..
    Думаю - ввиде доп.защиты вполне сгодится.. :)
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Может стоит бряков поставить там, где есть вероятность что сплайснут, а в хэндлере исключений исполнять инструкцию оригинальную и возвращатьсо ?
    В таком случае либо не удасться сплайснуть, либо будет останов в коде перехватчика.
     
  11. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Clerk, вероятных точек сплайсинга через чур много, поэтому нуны более универсальные методы.
    Еще была идея в самом начале получить чексум модуля в памяти, а потом в цикле проверять, но не сработало, как оказалось - контрольная суммая все время меняется.
     
  12. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Вопрос из той же оперы:
    Можно ли изменять размеры памяти, занимаегого модулем?
    Есть например у меня свой модуль, я хочу чтобы каждый раз когда его вызывают, он занимал не статистический размер памяти, а динамический. Можно конечно найти в ldr свой модуль, генерить рандомное число и прибавить к SizeOfImage, но могет есть другие пути решения задачи?