|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 9, 2004 18:11:06 Для демонстрации разницы между реальным адресом нашей программы в памяти и дельта-смещением этого адреса (относительно ожидаемого) предлагается следующий фрагмент: ; получить в ebx адрес для локальной переменной в стеке push eax mov ebx, esp add ebx, 4 ; получить в ebp текущий адрес нашего кода call $+5 pop ebp ; изменить параметры доступа к памяти (+разрешение записи) invoke VirtualProtect, ebp, 1000h,\ PAGE_EXECUTE_READWRITE, ebx .if eax == 0; error invoke MessageBox, NULL, addr MsgB1, addr MsgCap, MB_OK .endif ; выравнять стек pop eax ; получить в ebp дельта-смещение нашего кода call get_delta ;теперь адресуемся к коду с использованием смещения в ebp lea edi, [ebp + @@m1] xor dword ptr [edi], 0h @@m1: nop nop nop nop jmp exit ; определить смещение get_delta: call $+5 delta: pop ebp sub ebp, offset delta ret exit: ... И, в заключение, хотелось бы добавить по поводу вирусов. И нормального программного обеспечения, кстати. Со времен DOS-а не приходилось мне писать самомодифицирующиеся программы, тогда все это работало на ура. А под Win2000 как то не возникало такой необходимости, и вот результат... Если бы не заинтересовался бы я этой темой (вирусами), так мог никогда бы и не узнать, что нельзя оказывается просто так писать в секцию кода... Это я к тому, что написание вирусов знакомит со многими техниками, которые в ином мире могут никогда не встретиться, а знать которые может оказаться очень и очень важно. А сами вирусы - гадость, конечно, редкая. Тут я полностью согласен с The Svin. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.046 |