Binary digit, wasm`овцы. вопрос по pe-формату: У меня вопросы по формату исполнимых файлов, Portatible Executable. Если следовать именам инклуда winnt.h, то меня интерисуют следую- щие поля: SizeOfStackReserve и SizeOfStackCommit Про два этих поля я читал в Питреке, статье Касперски и даже в упа- ковщиках от Volodya не нашел исчерпывающего ответа на вопрос о том, что же эти поля представляют? Замечу не расплывчатых а достаточных для понимания сведений, но это относительно моего интелекта, возмож- но кто-то читал и понял истинное значение этих полей. А поэтому будьте добры ответить на этот вопрос. ;############################3 Вопрос по инструментарию: Когда то я уже задавал вопрос по импорту, но придется еще раз его задать.Если написать код: invoke MessageBox,addr txt_1,addr txt_2,MB_OK то ассемблер из пакета masm32 для этого вида импорта сделает следую- щую цепочку: call MessageBox MessageBox: jmp dword [address] Но кто то мне говорил, что есть какой то красивый "?.bat"-файл, кото- рый позволит делать цепочку: call dword [address] Если не ошибаюсь, то это был bogrus. Порывшись по нэту и потероризиро- вав гугла, я натыкался на записи, что можно сделать ЭТУ ЦЕПОЧКУ, но этом ГДЕ это файл скачать(читай рабочую ссылку!) я не нашел! Попрошу уважаемое собрание о том, что если кто-то имеет или знает ссыл- ку, замечу РАБОЧУЮ, то просьба поделиться на int20h@yandex.ru!
EvilsInterrupt Надеюсь, эта ссылка окажется рабочей… А вообще-то, этот вопрос не раз всплывал здесь: соседний топик Насчёт первого вопроса: это обсуждалось уже и вроде бы даже на этом форуме. Если просто, то поле SizeOfStackReserve указывает загрузчику, сколько памяти зарезервировать под стек (по аналогии с VirtualAlloc(…,MEM_RESERVE,…) ). То есть, память будет зарезервирована, но не выделена. SizeOfStackCommit даёт указание выделить определённый размер памяти под стек. Чаще всего, выделяется 4кб памяти (1 страница под Win2k), а резервируется 1 Мб. Если ты читал про РЕ, то помнишь, что за выделенной страницей идёт ещё одна: сторожевая. Это хорошо описано в «Упаковщиках».
И ещё. Если в заголовке РЕ не указывать эти поля, то система выделит память, размером в 1 страницу (SYSTEM_INFO.dwPageSize), а зарезервирует 64 Кб (SYSTEM_INFO.dwAllocationGranularity). А насчёт "аналогии с VirtualAlloc" — тут даже не аналогия. Система при создании стека пользуется именно этой функцией: Код (Text): LPVOID lpStack = NULL; lpStack = VirtualAlloc(lpStack,dwSizeOfStackReserve,MEM_RESERVE,PAGE_READWRITE); lpStack += dwSizeOfStackReserve - wSizeOfStackCommit; // если выделяется не вся память (dwSizeOfStackReserve) // то определяется сторожевая страница if(dwSizeOfStackReserve > dwSizeOfStackСommit){ lpStack -= SysInfo.dwPageSize; dwSizeOfStackCommit += SysInfo.dwPageSize; IsGuardPage = TRUE; } else { IsGuardPage = FALSE; } lpStack = VirtualAlloc(lpStack,dwSizeOfStackCommit,MEM_COMMIT,PAGE_READWRITE); if(IsGuardPage){ VirtualProtect(lpStack,SysInfo.dwPageSize,PAGE_GUARD | PAGE_READWRITE,&dwOldProtect); }