Мое почтение всем. Заметил одну не совсем понятную вещь при использовании VirtualProtect. Вот упрощенная модель ситуации: Code (Text): format PE GUI include 'win32a.inc' push str_ntdll call [LoadLibraryA] push str_ki_usr_excpt_disp push eax call [GetProcAddress] and eax, 0xFFFFF000 sub esp, 0x4 push esp push PAGE_EXECUTE_READWRITE push 0x1 push eax call [VirtualProtect] add esp, 0x4 str_ki_usr_excpt_disp: db 'KiUserExceptionDispatcher', 0x0 str_ntdll db 'ntdll.dll', 0x0 data import library kernel32, 'KERNEL32.DLL' import kernel32,\ ExitProcess, 'ExitProcess',\ LoadLibraryA, 'LoadLibraryA',\ GetProcAddress, 'GetProcAddress',\ VirtualProtect, 'VirtualProtect',\ GetLastError, 'GetLastError' end data Вызов VirtualProtect в этом коде завершается ошибкой 0x00000005 (Access Denied). Однако, если убрать 'and eax, 0xFFFFF000' перед вызовом ф-ии, то все Ок. Посмотрел в Olly карту памяти, вроде, при округлении адреса за границы образа ntdll.dll не выхожу. В чем может быть дело? Заранее благодарен.
У меня твой код (с and eax, fffff000h) отработал нормально, первое (и самое бредовое) что приходит в голову может страници по 2К?(вроде где-то читал что и такое бывает) попробуй поигаться с границей и посмотри начиная с какого интервала возвращает ошибку
rain Я думаю, что ты путаешь со страницами 2 MB (это при включенном PAE). +страницы бывают 4 MB (при включенном PSE и установленном флаге PS в PDE). А какая у тебя версия Win? Забыл написать, у меня MS XP Professional, SP2.
да вроде такое в природе есть только на редких архитектурах протестил щас на хр sp1 x64 (wow ессесно), w2k3 sp1, w2k sp4 везде работает)