Пытаюсь переделывать разработку Clerk'a - PsProtectImage, чтобы приватизировала тольку одну секцию. Код (Text): PsProtectImage2 proc uses esi edi ebx ImageBase:PVOID Local ObjAttr:OBJECT_ATTRIBUTES Local SectionSize:LARGE_INTEGER, SectionOffset:LARGE_INTEGER, ViewSize:ULONG Local KeepingSectionHandle:HANDLE Local KeepingMapAddress:PVOID Local MemoryInformation:MEMORY_BASIC_INFORMATION Local RegionMapAddress:PVOID invoke ZwQueryVirtualMemory,-1,ImageBase,MemoryBasicInformation,addr MemoryInformation,sizeof MEMORY_BASIC_INFORMATION,0 test eax,eax jnz exit_ mov ebx,MemoryInformation.RegionSize xor eax,eax mov ObjAttr.uLength,SizeOf OBJECT_ATTRIBUTES mov dword ptr [SectionSize],ebx mov dword ptr [SectionSize+4],eax mov ObjAttr.hRootDirectory,eax mov ObjAttr.pObjectName,eax mov ObjAttr.uAttributes,eax mov ObjAttr.pSecurityDescriptor,eax mov ObjAttr.pSecurityQualityOfService,eax mov dword ptr [SectionOffset],eax mov dword ptr [SectionOffset+4],eax mov ViewSize,eax mov KeepingMapAddress,eax ;Создаём секцию для хранения оригинального образа. invoke ZwCreateSection,addr KeepingSectionHandle,SECTION_ALL_ACCESS,addr ObjAttr,addr SectionSize,PAGE_EXECUTE_READWRITE,SEC_COMMIT,0 test eax,eax jnz exit_ ;Проецируем секцию в текущий процесс. Далее в неё будет считана копия всей проекции модуля. invoke ZwMapViewOfSection,KeepingSectionHandle,-1,addr KeepingMapAddress,0,0,addr SectionOffset,addr ViewSize,ViewShare,0,PAGE_READWRITE test eax,eax jnz err_map_keeping_ invoke PsReadVirtualMemoryProtected,-1,MemoryInformation.BaseAddress,KeepingMapAddress,MemoryInformation.RegionSize,0 test eax,eax jnz err_read_rgn_fatal_ ;Освобождаем проекцию модуля. ;invoke ZwUnmapViewOfSection,-1,MemoryInformation.BaseAddress mov ebx,MemoryInformation.BaseAddress mov dword ptr [SectionOffset],ebx mov dword ptr [SectionOffset + 4],0 mov RegionMapAddress,ebx mov eax,MemoryInformation.RegionSize mov ViewSize,eax invoke ZwMapViewOfSection,KeepingSectionHandle,-1,addr RegionMapAddress,0,0,addr SectionOffset,addr ViewSize,ViewShare,AT_ROUND_TO_PAGE,MemoryInformation.Protect ;STATUS_INVALID_VIEW_SIZE equ 0C000001Fh test eax,eax jnz err_read_rgn_fatal_ xor eax,eax jmp err_read_rgn_fatal_ err_read_rgn_fatal_dbg_: mov eax,STATUS_SINGLE_STEP err_read_rgn_fatal_: push eax invoke ZwUnmapViewOfSection,-1,KeepingMapAddress pop eax err_map_keeping_: push eax invoke ZwClose,KeepingSectionHandle pop eax exit_: ret PsProtectImage2 endp Вроди с кодом все ок, но когда делаю Unmap - прога тихо выгружается, а когда не делаю, ZwMapViewOfSection возвращает STATUS_INVALID_VIEW_SIZE. Не подскажите что делать?
TSS, понимаю. 1) получаем данные секции 2) создаем левую секцию с нужными размерами 3) читаем туда оригинальную сексию 4) Unmap'им оригинальную секцию 5) проэцируем на это же место скопированную но с другими атрибутами Что тут непонятного
Анмапнуть можно только всю проекцию, одну секцию нельзя, если попытаться то будет освобождена проекция всего модуля. Тоесть читать все секции, мапить их, но для одной установить соответствующие атрибуты.
Clerk Кстати экспериментировал тут с твоим кодом - при Unmap что-то там с TLS отваливается походу. Например дельфовые проги после этого не пашут.
TSS может перестать показывать свой ум (! вернее его отсутствие) отмечаясь в каждой теме связанной с системным программированием?!
Clerk Например? Образ получается один в один как до унмапа. VCL активно юзает АПИ типа TlsGetValue/TlsSetValue - вот они как раз похоже и не пашут.
Вобщем с дельфовыми прогами прикол в следующем: Код (Text): 0040551C 83C4E4 add esp, -1C <- FindHInstance 0040551F 6A1C push 1C 00405521 8D542404 lea edx, [esp+04] 00405525 52 push edx 00405526 50 push eax 00405527 E8A0BDFFFF call 004012CC -> VirtualQuery 0040552C 817C241000100000 cmp dword ptr [esp+10], 00001000 00405534 7506 jnz 0040553C 00405536 8B442404 mov eax, [esp+04] 0040553A EB02 jmp 0040553E 0040553C 33C0 xor eax, eax 0040553E 83C41C add esp, 1C 00405541 C3 ret Это код ищет модуль, в котором "живет" объект (чтобы загрузить из него нужный ресурс - в нашем случае TForm1). При маппинге памяти кусочками у нас получилось, что базой является уже не $400000, а адрес нашей секции, к которой принадлежит запрашиваемый адрес - в данном случае это $401000. Соотвественно при вызове FindResourceA передается левый указатель на ImageBase ну и ессно венда просто не видит ресурсы.
Код (Text): AT_EXTENDABLE_FILE equ 00002000h ;Allow view to exceed section size MEM_TOP_DOWN equ 00100000h ;Allocate at highest possible address SEC_NO_CHANGE equ 00400000h ;Disable changes to protection of pages AT_RESERVED equ 20000000h ;Valid but ignored AT_ROUND_TO_PAGE equ 40000000h ;Adjust address and size if necessary А SEC_NO_CHANGE работает ?
Вобщем насколько я понял проблему в х64 при маппинге адреса должны быть кратны 64 килам и даже для х32 приложений весь этот код под х64 работать не будет.
Угу в любой х64 винде ВСЕГДА используется 64К и невозможно использовать 4К передавая параметр AT_ROUND_TO_PAGE - просто не поддерживается.
d2k9 Угу - ZwMapViewOfSection возвращает статус 0xC00000F7 (невалидный 9-ый параметр - он же push AT_ROUND_TO_PAGE)