Дорогие форумчане, подсобите информацией, как загрузчик винды помещает образ по случайной базе, при этом не обладая информацией о релоках ? (в моем .exe релоков нет) --- Сообщение объединено, 27 июл 2022 --- Возможно где-то есть флаг, говорящий о том , что образ полностью переносим и при этом не имеет релоков (базонезависим), поэтому так и получается ?
Кстати тоже интересно. Помню они ещё анонсировали принудительное перемещение образов, слинкованых со старыми флагами, по какой-то хитрой схеме.
vitokop, так по ссылке указано, что если нет релоков, то файл не загрузится по force ASLR. Хз как можно загрузить, если нет релоков, откуда и кто должен знать, какие смещения в файле абсолютные? Когда кодят LoadPE , то файлы без релоков тупо грузят по их imagebase (сам PE лоадер билдился с более высокой базой). А так , это надо какой-то ИИ , который на лету дизассемблирует файл и поменяет все, ну или я не понимаю ничего в РЕ файлах.
Более высокая база отличная от стандартной это уже звоночек, обычно базу оставляют стандартной, но сам LoadPE код отрабатывает в виде шеллкода в динамично выделенной памяти Либо как это делается в пакерах просто цепляется новая секция с загрузчиком и делается ребилд файла, что бы точка входа по прежнему оставалась в первой секции кода, как в оригинале Но тут суть не в этом, я до сих пор не понимаю как мой exe без релоков грузится с ASLR по разной базе
Так под x64 есть RIP-адресация (или как там это называлось?), абсолютные адреса могут быть и не нужоны никому).
Могут быть, но это не факт, неизвестно же что там компилятор нахреновертил, может там только RIP адресация, а может и не только она
32-бит: загруженный и файл на диске ОДИНАКОВЫ File Type: EXECUTABLE OFFSET NT HEADER: 256(0100) FILE HEADER VALUES 14C machine (i386) 8 number of sections 2A425E19 time data stamp "06/20/1992 01:22:17" 00000000 file pointer to symbol table 00000000 numbers of symbols 000000E0 size of optional header 818F characteristics Relocation stripped Executable Line numbers stripped Local symbols stripped Lo-Bytes of machine word are reversed 32 bit word machine Hi-Bytes of machine word are reversed OPTIONAL HEADER VALUES 010B magic # PE32 win32 2.25 linker version 006F4600 size of code 00353E00 size of initialized data 00000000 size of uninitialized data 006F461C Address Of Entry Point 00001000 base of code 006F6000 base of data 00400000 image base <+++++++++++++++++++++++++++ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 64 бит Explorer.exe ЗАГРУЖЕННЫЙ FILE HEADER VALUES 00F0: 00004550 { Signature if 0x00004550 then PE} 00F4: 8664 { Machine its: x64 } 00F6: 0008 { NumberOfSections } .................................................... 0104: 00F0 { SizeOfOptionalHeader } 0106: 0022 { Characteristics } { $0002 File is executable (i.e. no unresolved externel references) } { $0020 Application can handle > 2GB address} IMAGE_OPTION_HEADER 0108: 020B { Magic PE32+} .......................................................................... 0118: 0009D3F0 { AddressOfEntryPoint } 011C: 00001000 { BaseOfCode } 0120: 00007FF619F10000 { ImageBase } <===== +++++++++++ На ДИСКЕ Win64 PE file FILE: C:\Windows\explorer.exe SizeOfFile 4 383 480 (0x0042E2F8) SizeOfImage 4 366 336 (0x0042A000) File Type: EXECUTABLE OFFSET NT HEADER: 240(00F0) FILE HEADER VALUES 8664 machine (AMD64) 8 number of sections ........................................................ 0022 characteristics Executable Application can handle > 2GB address OPTIONAL HEADER VALUES 020B magic # (PE32+ win64) ............................................................. 0009D3F0 Address Of Entry Point 00001000 base of code 0000000140000000 image base <===== +++++++++++ --- Сообщение объединено, 28 июл 2022 --- OS: windows 10 LTSE 64-bit
Факт - в x64 RIP-адресация это приматив и дефолт и он не просто "возможен", а он вменяется по умолчанию: https://wasm.in/threads/principy-ko...x86-64-ili-exal-prefiks-cherez-prefiks.34390/ Т.е. нужно проделать дополнительную работу (ненужную в обычной программе) чтобы вернуться из RIP-адресации к абсолютной, а не наоборот. Возможно достаточно проверить, что программа скомпилировано штатным компилятором типа MSVC чтобы делать такое не опасаясь особо. Или действительно есть флаг, что в x64 программе нет извратов.
Да в х64 понятно, а вот как 32 битный файл грузится по произвольному адресу - загадка. Разве что там нет никаких абсолютных смещений, т.е. написан в шеллкод стиле. Посмотреть бы файл.