Гипотетическая ситуация. Пусть все 4 Гб адресного пространства адресуют writeable memory. Задача написать код, который заполнит все эти 4 Гб неким однобайтовым значением. Значение по вашему выбору. Не забываем, что код тоже находится в этих 4 Гб. Для однобайтового значения я увидел пока только одно решение. Для 2-4-байтового решений больше.
rep stos и rep movs – особые инструкции. Заполнение будет продолжаться даже после перезаписи выполняемого кода в памяти.
по rep movsb понял, что заполняющая команда может быть > 1 байта. мой вариант mov eax,90909090h mov [eax],0d0ffh jmp eax такая шутка еще в голову пришла. не одним байтом, но все равно мне чемто push 9024048f jmp esp
qqwe Прикольно, но не совсем понятно почему это должно работать. Что будет, когда call затрёт свой же адрес nop-ми?
medstrax1 как можно затереть всю память не затерев сам код? или имеется в виду, что сам код, включая подготовочный, должен состоять из одного байта или из нескольких одинаковых байт? уточните задачу.
qqwe Так оно дойдёт до адреса 90909090h и пойдёт выполнять нопы, но ниже адреса 90909090h тоже нужно писать.
Код (Text): std xor eax, eax dec eax mov esi, eax dec eax mov edi, eax sub eax, 14 mov ecx, eax not eax rep movsb movaps xmm0, [eax] movaps [ecx], xmm0 movaps [ecx+1], xmm0
наверное так Код (Text): 0x00000000 rep stosd 0x00000002 std 0x00000003 mov eax, 90h 0x00000008 mov edi, -1 0x0000000d jmp 0 ничто не мешает нам, находясь в высших адресах, загрузить в начало этот код и сделать jmp 0x2
medstrax1 Код (Text): format PE section '.text' readable writable executable entry $ push edi xor edx, edx mov eax, $42 ; inc edx mov ecx, eax ; bytecount call @f mov eax, edx pop edi retn @@: lea edi, [$] mov byte [edi + ecx], $C3 ; retn rep stosb nop int3 Код (Text): C:\Users\xk\Desktop>lolstos & echo !errorlevel! 54 (Предполагается, что настройки кэширования подходящие, а во время заполнения не придут прерывания).