ProtectImage 2

Тема в разделе "WASM.BEGINNERS", создана пользователем Flasher, 13 июл 2009.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Пытаюсь переделывать разработку Clerk'a - PsProtectImage, чтобы приватизировала тольку одну секцию.

    Код (Text):
    1. PsProtectImage2 proc uses esi edi ebx ImageBase:PVOID
    2. Local ObjAttr:OBJECT_ATTRIBUTES
    3. Local SectionSize:LARGE_INTEGER, SectionOffset:LARGE_INTEGER, ViewSize:ULONG
    4. Local KeepingSectionHandle:HANDLE
    5. Local KeepingMapAddress:PVOID
    6. Local MemoryInformation:MEMORY_BASIC_INFORMATION
    7. Local RegionMapAddress:PVOID
    8.  
    9.     invoke ZwQueryVirtualMemory,-1,ImageBase,MemoryBasicInformation,addr MemoryInformation,sizeof MEMORY_BASIC_INFORMATION,0
    10.     test eax,eax
    11.     jnz exit_
    12.  
    13.     mov ebx,MemoryInformation.RegionSize
    14.     xor eax,eax
    15.     mov ObjAttr.uLength,SizeOf OBJECT_ATTRIBUTES
    16.     mov dword ptr [SectionSize],ebx
    17.     mov dword ptr [SectionSize+4],eax
    18.     mov ObjAttr.hRootDirectory,eax
    19.     mov ObjAttr.pObjectName,eax
    20.     mov ObjAttr.uAttributes,eax
    21.     mov ObjAttr.pSecurityDescriptor,eax
    22.     mov ObjAttr.pSecurityQualityOfService,eax
    23.     mov dword ptr [SectionOffset],eax
    24.     mov dword ptr [SectionOffset+4],eax
    25.     mov ViewSize,eax
    26.     mov KeepingMapAddress,eax
    27. ;Создаём секцию для хранения оригинального образа.
    28.  
    29.     invoke ZwCreateSection,addr KeepingSectionHandle,SECTION_ALL_ACCESS,addr ObjAttr,addr SectionSize,PAGE_EXECUTE_READWRITE,SEC_COMMIT,0
    30.     test eax,eax
    31.     jnz exit_
    32.  
    33. ;Проецируем секцию в текущий процесс. Далее в неё будет считана копия всей проекции модуля.
    34.  
    35.     invoke ZwMapViewOfSection,KeepingSectionHandle,-1,addr KeepingMapAddress,0,0,addr SectionOffset,addr ViewSize,ViewShare,0,PAGE_READWRITE
    36.     test eax,eax
    37.     jnz err_map_keeping_
    38.  
    39.     invoke PsReadVirtualMemoryProtected,-1,MemoryInformation.BaseAddress,KeepingMapAddress,MemoryInformation.RegionSize,0
    40.     test eax,eax
    41.     jnz err_read_rgn_fatal_
    42.  
    43. ;Освобождаем проекцию модуля.
    44.     ;invoke ZwUnmapViewOfSection,-1,MemoryInformation.BaseAddress
    45.  
    46.     mov ebx,MemoryInformation.BaseAddress
    47.  
    48.     mov dword ptr [SectionOffset],ebx
    49.     mov dword ptr [SectionOffset + 4],0
    50.     mov RegionMapAddress,ebx
    51.    
    52.     mov eax,MemoryInformation.RegionSize
    53.     mov ViewSize,eax
    54.  
    55.     invoke ZwMapViewOfSection,KeepingSectionHandle,-1,addr RegionMapAddress,0,0,addr SectionOffset,addr ViewSize,ViewShare,AT_ROUND_TO_PAGE,MemoryInformation.Protect
    56. ;STATUS_INVALID_VIEW_SIZE         equ 0C000001Fh
    57.     test eax,eax
    58.     jnz err_read_rgn_fatal_
    59.  
    60.     xor eax,eax
    61.     jmp err_read_rgn_fatal_
    62. err_read_rgn_fatal_dbg_:
    63.     mov eax,STATUS_SINGLE_STEP
    64. err_read_rgn_fatal_:
    65.     push eax
    66.     invoke ZwUnmapViewOfSection,-1,KeepingMapAddress
    67.     pop eax
    68. err_map_keeping_:
    69.     push eax
    70.     invoke ZwClose,KeepingSectionHandle
    71.     pop eax
    72. exit_:
    73.     ret
    74. PsProtectImage2 endp
    Вроди с кодом все ок, но когда делаю Unmap - прога тихо выгружается, а когда не делаю, ZwMapViewOfSection возвращает STATUS_INVALID_VIEW_SIZE.
    Не подскажите что делать?
     
  2. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Перестать копипастить и начать понимать что написано
     
  3. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    TSS, понимаю.
    1) получаем данные секции
    2) создаем левую секцию с нужными размерами
    3) читаем туда оригинальную сексию
    4) Unmap'им оригинальную секцию
    5) проэцируем на это же место скопированную но с другими атрибутами
    Что тут непонятного :)
     
  4. Clerk

    Clerk Забанен

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

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Clerk
    Кстати экспериментировал тут с твоим кодом - при Unmap что-то там с TLS отваливается походу. Например дельфовые проги после этого не пашут.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    dermatolog
    Может проверки памяти какие не смотрел.
     
  7. SilenceCracker

    SilenceCracker New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    3
    TSS
    может перестать показывать свой ум (! вернее его отсутствие) отмечаясь в каждой
    теме связанной с системным программированием?!
     
  8. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    SilenceCracker
    Get lost
     
  9. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Clerk
    Например?
    Образ получается один в один как до унмапа. VCL активно юзает АПИ типа TlsGetValue/TlsSetValue - вот они как раз похоже и не пашут.
     
  10. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Clerk, а без unmap'a низя процировать поверх секции свои данные?
     
  11. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Вобщем с дельфовыми прогами прикол в следующем:
    Код (Text):
    1. 0040551C 83C4E4                  add esp, -1C <- FindHInstance
    2. 0040551F 6A1C                    push 1C
    3. 00405521 8D542404                lea edx, [esp+04]
    4. 00405525 52                      push edx
    5. 00405526 50                      push eax
    6. 00405527 E8A0BDFFFF              call 004012CC -> VirtualQuery
    7. 0040552C 817C241000100000        cmp dword ptr [esp+10], 00001000
    8. 00405534 7506                    jnz 0040553C
    9. 00405536 8B442404                mov eax, [esp+04]
    10. 0040553A EB02                    jmp 0040553E
    11. 0040553C 33C0                    xor eax, eax
    12. 0040553E 83C41C                  add esp, 1C
    13. 00405541 C3                      ret
    Это код ищет модуль, в котором "живет" объект (чтобы загрузить из него нужный ресурс - в нашем случае TForm1). При маппинге памяти кусочками у нас получилось, что базой является уже не $400000, а адрес нашей секции, к которой принадлежит запрашиваемый адрес - в данном случае это $401000. Соотвественно при вызове FindResourceA передается левый указатель на ImageBase ну и ессно венда просто не видит ресурсы.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Нет.
     
  13. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Да, кстати еще одна "фича" - AT_ROUND_TO_PAGE не работает на WOW64. Кто знает как лечить?
     
  14. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Код (Text):
    1. AT_EXTENDABLE_FILE      equ 00002000h   ;Allow view to exceed section size
    2. MEM_TOP_DOWN            equ 00100000h   ;Allocate at highest possible address
    3. SEC_NO_CHANGE           equ 00400000h   ;Disable changes to protection of pages
    4. AT_RESERVED         equ 20000000h   ;Valid but ignored
    5. AT_ROUND_TO_PAGE        equ 40000000h   ;Adjust address and size if necessary
    А SEC_NO_CHANGE работает ?
     
  15. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Нет.
     
  16. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Вобщем насколько я понял проблему в х64 при маппинге адреса должны быть кратны 64 килам и даже для х32 приложений весь этот код под х64 работать не будет.
     
  17. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Угу в любой х64 винде ВСЕГДА используется 64К и невозможно использовать 4К передавая параметр AT_ROUND_TO_PAGE - просто не поддерживается.
     
  18. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    d2k9
    Угу - ZwMapViewOfSection возвращает статус 0xC00000F7 (невалидный 9-ый параметр - он же push AT_ROUND_TO_PAGE)