Чтобы протестировать DEP написал тест, как и ожидалось с включенным DEP он не пашет, но почему пашет SVKProtector, вроде ж и VirtualProtect не использует? Код (Text): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.code' code readable executable align 4 start: push 0 ; for ExitProcess mov ecx, size sub esp, ecx mov esi, L1 mov edi, esp @@: lodsb stosb loop @B mov eax, [MessageBox] call esp add esp, size call [ExitProcess] L1: push 0 push 0 push szStack push 0 call eax retn nop ; чтобы соблюсти кратность 4 nop size = $ - L1 section '.data' data readable writeable szStack db "Stack",0 section '.idata' import data readable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include '%fasminc%\APIA\KERNEL32.INC' include '%fasminc%\APIA\USER32.INC' _182304541__Stack.exe
такой вариант должен по идее работать с включенным DEP, хотя я не пробовал Код (Text): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.code' code readable executable align 4 start: push 0 ; for ExitProcess mov ecx, size sub esp, ecx mov esi, L1 mov edi, esp @@: lodsb stosb loop @B mov eax, esp invoke VirtualProtect, eax, size, PAGE_EXECUTE_READWRITE, OldProtect mov eax, [MessageBox] call esp mov eax, esp invoke VirtualProtect, eax, size, [OldProtect], OldProtect add esp, size call [ExitProcess] L1: push 0 push 0 push szStack push 0 call eax retn nop ; чтобы соблюсти кратность 4 nop size = $ - L1 section '.data' data readable writeable szStack db "Stack",0 OldProtect dd ? section '.idata' import data readable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include '%fasminc%\APIA\KERNEL32.INC' include '%fasminc%\APIA\USER32.INC'
M$ поддерживает совместимость со всем дерьмовым софтом криворуких программистов. Причем они эмулируют даже ОШИБКИ СТАРЫХ ВЕРСИЙ ОС! По мне, так пусть бы защищенные кривыми протекторами программы не работали (на радость их создателям . Помоему нельзя в целях совместимости захламлять систему всяким говном, но к сожалению M$ придерживается иного подхода.
ужс, они ещё бы сингы вирей и троянов добавили... для совместимости =))) Причём в статьях о DEP всё так красиво расписано, а оказывается запаковал вирь свкп и нету DEP`а.
Кстати ещё вопросик по теме DEP`а: у меня на host винде (XPSP2) по дефолту грузится ядро ntoskrnl.exe и DEP _не пашет_, на guest винде под VMware (та же XPSP2) по дефолту грузится ядро ntkrnlpa.exe (интересно, с какой радости ? %) ведь у меня 1Гб оперативки, а не более 4-х Гб после которых по идее должно включатся PAE) и при этом DEP там _пашет_. Если host винде вручную указать грузить ядро ntkrnlpa.exe то DEP там включается. Собственно вопрос - почему такое происходит и почему DEP не пашет с ntoskrnl.exe ? Добавлено: с варей понятно, там в конфиге сам прописывал paevm = "TRUE" чтоб винда установилась.
Правильно, так правильно, но тогда объясните плиз почему у меня ни в 98 ни в xp (celeron 1300) не работает а ведь должна вроде? Смотрю в отладчике call сначала помещает в стек адрес возврата, потом переходит по адресу в регистре, ;который уже изменился и мы попадаем на 4 байта выше. Код (Text): ;0006FFAC 2F DAS <<-- попалаем сюда ;0006FFAD 1040 00 ADC BYTE PTR DS:[EAX],AL ;0006FFB0 6A 00 PUSH 0 <<-- а должны попасть сюда ;0006FFB2 6A 00 PUSH 0 ;0006FFB4 68 00204000 PUSH 402000 ; ASCII "Stack" ;0006FFB9 6A 00 PUSH 0 ;0006FFBB FFD0 CALL NEAR EAX ;0006FFBD C3 RETN ну и соответственно как только я заменяю Код (Text): Call esp на Код (Text): mov ecx,esp ; сохраняем в ecx адрес начала нашего кода call ecx все работает и везде пробовал включить програмный DEP ,но он чего-то не работает, код в стеке выполняется, даже если не использоватьь VirtualProtect
Inv я вот не пойму с чего это оно должно глючить? То-ли windows у тебя неправильная, то-ли проц %) Вот у меня в отладчике сразу на входе в функцию (AMD64, XP sp2 x86): Код (Text): <span style="background-color: #eeeeee]0007FFB0 6A 00 PUSH 0</span><!--back--> 0007FFB2 6A 00 PUSH 0 0007FFB4 68 00204000 PUSH 402000 ; ASCII "Stack" 0007FFB9 6A 00 PUSH 0 0007FFBB FFD0 CALL EAX 0007FFBD C3 RETN 0007FFBE 90 NOP 0007FFBF 90 NOP ---------------------------------------------------- 0007FFAC 0040101B RETURN to Stack.<ModuleEntryPoint>+1B 0007FFB0 006A006A 0007FFB4 40200068 0007FFB8 FF006A00 0007FFBC 9090C3D0 0007FFC0 00000000
В понедельник пойду на работе проверю эту теорию Если это не только мой глюк тогда это недокументированный способ отличить IA32 от AMD64 может кто на 4 пеньке испытает ???
Inv > "пробовал включить програмный DEP, но он чего-то не работает" Программный DEP срабатывает только при обработке исключений См. WinXP SP2 и выполнение кода на стеке
Там есть проверка на известные пакеры. "там" это значит в ядре, если кто не понял Ой, похоже я что-то пропустил... Подскажите, где в ядре происходят эти проверки, и где есть список пакеров которых допускают до августейшего тела?