Здравствуйте! У меня такая проблема: пытаюсь записать свой код в выравнивающие нули секции. При записи кода руками(в hex редакторе) все нормально. Но вот при записи программным путем - Access Violation на инструкции movsb/stosb. Адрес для записи кода вычисляю так : VA секции + VirtualSize. Вот код(в месте где эксепшен стоит коммет): Код (Text): format PE GUI 5.0 include '%fasminc%\win32ax.inc' include '%fasminc%\myMacro.inc' IB equ 400000h section '.code' code writeable readable executable include '%fasminc%\importm.inc' kernel32: include '%fasminc%\kernel32.inc' dd 0 user32: include '%fasminc%\user32.inc' dd 0 codeX: xor esp,esp endX: szFileName db 'test.exe',0 hFile dd ? OEP dd 0 entry $ X_INIT kernel32 invoke CreateFileA,szFileName,GENERIC_ALL,FILE_SHARE_READ+FILE_SHARE_WRITE,0,OPEN_EXISTING,0x80,0 push eax;FILE HANDLE===== invoke CreateFileMappingA,eax,0,PAGE_EXECUTE_READWRITE,0,0,0 push eax;CREATE FILE MAPPING HANDLE==== invoke MapViewOfFile,eax,FILE_MAP_ALL_ACCESS,0,0,0 push eax;MAP VIEW OF FILE HANDLE====== ;получаем OEP add eax,[eax+3Ch] mov ecx,[eax+40] add ecx,IB mov [OEP],ecx ;находим последнюю секцию виртуально и физически. xor ecx,ecx mov cx,[eax+6] ;push cx dec cx push eax;POINTER TO NT HEADER add eax,248 test cx,cx mov edi,[eax+20];edi - физическое смещение первой секции. mov esi,[eax+12];esi - виртуальное смещение первой секции jz _write _nextSec: add eax,40;переходим к следующей секции cmp edi,[eax+20] cmp esi,[eax+12] jns _next mov edi,[eax+20];r_off последней секции mov esi,[eax+12];VA последней секции. _next: loop _nextSec mov ebp,[eax+16] test ebp,ebp jz _exit _write: add esi,[eax+8] add esi,[esp+4] mov edi,esi mov esi,codeX mov ecx,endX-codeX _movsb: movsb;ACCESS VIOLATION when writing inc eax inc edi loop _movsb _change: _exit: invoke UnmapViewOfFile invoke CloseHandle invoke CloseHandle,[hFile] invoke ExitProcess,0
MaxOn Физически не находите, для этого нужно мапить физическую память, нормально этим хал занимается. Возник сепшин - описание его и контекст в студию.
Clerk Код (Text): ExceptionCode C0000005 ExceptionFlags 0 ExceptionRecord 0 ExceptionAddress 0040117E NumberParameters 2 ExceptionInformation 1 ContextFlags 1003F Dr0 0 Dr1 0 Dr2 0 Dr3 0 Dr6 0 Dr7 0 FloatSave FFFF027F regSegGs FFFF0000 regSegFs FFFFFFFF regSegEs 0 regSegDs 0 regEdi 0 regEsi FFFF0000 regEbx 00000000 regEdx 01050104 regEcx 0000D1D8 regEax 0 regEbp 0 regEip 0 regSegCs 0 regEFlags 0 regEsp 0 regSegSs0 ExtendedRegisters 0 litrovith Я как бы русский!
MaxOn, видно ж, что при выполнении movsb в esi и edi - чото не то... не судьба взять отладчик и посмотреть почему? код выше - нечитабелен, учись использовать структуры, virtual at...
Freeman Код (Text): ContextFlags 1003F Код (Text): regEip 0 regSegCs 0 regEFlags 0 Ядро не позволит обнулить кодовый селектор.