Re[8]: Программа крэшится до точки входа, на стадии загрузки
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 01.03.18 22:10
Оценка:
Здравствуйте, okman, Вы писали:

O>Кажется, я начинаю догадываться, в чем может быть дело.

O>У приложения нет секции .reloc (релоков), т.е. исполняемый модуль не поддерживает загрузку по произвольному адресу:

Вот так находка!
Большущее спасибо, буду разбираться с опциями. Пока что только успел попробовать /FIXED:NO, но он релокаций не добавил (что ожидаемо, ибо это и так умолчальное значение для программ), а на большее времени пока не удалось выкроить. Плюс возникли непонятки, чем вообще отличаются опции /FIXED:NO и /DYNAMICBASE…
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[9]: Программа крэшится до точки входа, на стадии загрузки
От: okman Беларусь https://searchinform.ru/
Дата: 02.03.18 05:57
Оценка: 3 (1)
Здравствуйте, CaptainFlint, Вы писали:

CF>Пока что только успел попробовать /FIXED:NO, но он релокаций не добавил (что ожидаемо, ибо это и

CF>так умолчальное значение для программ), а на большее времени пока не удалось выкроить.

Релокаций здесь не добавлено, потому что код очень компактный и без CRT.
Видимо, он получился полностью базонезависимым и секция релоков ему просто не нужна.

CF>...чем вообще отличаются опции /FIXED:NO и /DYNAMICBASE…


Когда указан флаг 'FIXED:NO', генерируется секция релоков, но система все равно в
первую очередь будет пытаться загружать модуль по предпочтительному адресу
, и
только если это невозможно, например адрес уже занят другим модулем, будет
перемещать его.

Когда указан флаг 'DYNAMICBASE', система сразу пытается загружать модуль по
произвольному адресу
(рандомному, см. технологию ASLR). HIGHENTROPYVA добавляет
еще больше рандомности в этот процесс.

Разница, насколько я понимаю, лишь в этом.

Кстати, на последних Виндах можно программно запретить запуск приложений, скомпиленных
без поддержки релоков + ASLR, см. SetProcessMitigationPolicy + ProcessASLRPolicy.
Re[10]: Программа крэшится до точки входа, на стадии загрузки
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 02.03.18 07:36
Оценка:
Здравствуйте, okman, Вы писали:

CF>>Пока что только успел попробовать /FIXED:NO, но он релокаций не добавил (что ожидаемо, ибо это и

CF>>так умолчальное значение для программ), а на большее времени пока не удалось выкроить.

O>Релокаций здесь не добавлено, потому что код очень компактный и без CRT.

O>Видимо, он получился полностью базонезависимым и секция релоков ему просто не нужна.

Но ведь если бы он получился базонезависимым, то проблема бы не возникла? Раньше же говорилось:
>У приложения нет секции .reloc (релоков), т.е. исполняемый модуль не поддерживает загрузку по произвольному адресу:


O>Когда указан флаг 'FIXED:NO', генерируется секция релоков, но система все равно в

O>первую очередь будет пытаться загружать модуль по предпочтительному адресу
, и
O>только если это невозможно, например адрес уже занят другим модулем, будет
O>перемещать его.

O>Когда указан флаг 'DYNAMICBASE', система сразу пытается загружать модуль по

O>произвольному адресу (рандомному, см. технологию ASLR). HIGHENTROPYVA добавляет
O>еще больше рандомности в этот процесс.

O>Разница, насколько я понимаю, лишь в этом.


Примерно так я и подумал, но потом задумался: а с точки зрения исполняемого файла-то какая разница? Либо он поддерживает загрузку по произвольному адресу, либо не поддерживает. А уж всегда система будет его пытаться перемещать или только иногда — это уже её, системы, дело.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[11]: Программа крэшится до точки входа, на стадии загрузк
От: okman Беларусь https://searchinform.ru/
Дата: 02.03.18 09:39
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

O>>Релокаций здесь не добавлено, потому что код очень компактный и без CRT.

O>>Видимо, он получился полностью базонезависимым и секция релоков ему просто не нужна.

CF>Но ведь если бы он получился базонезависимым, то проблема бы не возникла? Раньше же говорилось:

>>У приложения нет секции .reloc (релоков), т.е. исполняемый модуль не поддерживает загрузку по произвольному адресу:

Мне кажется, проблема возникает из-за того, что DYNAMICBASE и/или HIGHENTROPYVA не могут работать правильно,
если у модуля нет релоков. Даже если там полностью базонезависимый код и ему эти релоки не нужны.

Создание модуля без CRT — это сам по себе достаточно редкий сценарий и вряд ли Microsoft тестирует его
так тщательно, как требуется.

Возможно, это какой-то баг в системном загрузчике модулей. Больше пока добавить нечего

Возможно, я вообще заблуждаюсь и на самом деле проблема 0xC0000005 кроется где-то в совершенно другом месте.
Отредактировано 02.03.2018 9:40 okman . Предыдущая версия .
Re[11]: Программа крэшится до точки входа, на стадии загрузки
От: EreTIk EreTIk's Box
Дата: 02.03.18 10:52
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

CF>Но ведь если бы он получился базонезависимым, то проблема бы не возникла? Раньше же говорилось:


Проблема возникает у запускающего процесса: родительскому процессу надо указать точку входа в первую нить процесса. У проблемного файла какой image base указан в заголовке файла на диске? Случайно не 000000013fb30000 == 000000013fb31000 (точка падения) — 1000 (entry point) ?
Re[8]: Программа крэшится до точки входа, на стадии загрузки
От: drVanо Россия https://vmpsoft.com
Дата: 05.03.18 14:13
Оценка:
Здравствуйте, okman, Вы писали:

CF>>Эх, как бы эти "третьи силы" теперь ущучить… желательно без ядерного отладчика и без "раздевания" системы от всех установленных программ…


O>Кажется, я начинаю догадываться, в чем может быть дело.

O>У приложения нет секции .reloc (релоков), т.е. исполняемый модуль не поддерживает загрузку по произвольному адресу:

Релоки для вызова EntryPoint НЕ НУЖНЫ!

P.S. Дя и судя по всему процесс 64-х битный где с вероятностью 99.9% релоки не нужны и всему остальному (курить мануалы про RIP адресацию).
Отредактировано 05.03.2018 14:17 drVanо . Предыдущая версия .
Re[9]: Программа крэшится до точки входа, на стадии загрузки
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 05.03.18 14:32
Оценка:
Здравствуйте, drVanо, Вы писали:

V>Релоки для вызова EntryPoint НЕ НУЖНЫ!


Теоретически, да, не должны быть нужны. Но, возможно, это какой-то баг в загрузчике, который не может корректно обработать смещение точки входа при отсутствии релоков. Во всяком случае, других гипотез, объясняющих накопленные факты, пока не нашлось.

V>P.S. Дя и судя по всему процесс 64-х битный где с вероятностью 99.9% релоки не нужны и всему остальному (курить мануалы про RIP адресацию).


Тем не менее, когда собираю с CRT, таблица релоков появляется.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[12]: Программа крэшится до точки входа, на стадии загрузки
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 05.03.18 14:33
Оценка:
Здравствуйте, EreTIk, Вы писали:

CF>>Но ведь если бы он получился базонезависимым, то проблема бы не возникла? Раньше же говорилось:


ETI>Проблема возникает у запускающего процесса: родительскому процессу надо указать точку входа в первую нить процесса. У проблемного файла какой image base указан в заголовке файла на диске? Случайно не 000000013fb30000 == 000000013fb31000 (точка падения) — 1000 (entry point) ?


Image base: 0000000140000000
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[10]: Программа крэшится до точки входа, на стадии загрузки
От: drVanо Россия https://vmpsoft.com
Дата: 05.03.18 14:40
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

CF>Теоретически, да, не должны быть нужны. Но, возможно, это какой-то баг в загрузчике, который не может корректно обработать смещение точки входа при отсутствии релоков. Во всяком случае, других гипотез, объясняющих накопленные факты, пока не нашлось.


Больше похоже на баг в каком-нить гавноантивирусе.

CF>Тем не менее, когда собираю с CRT, таблица релоков появляется.


Вы бы хоть скинули ссылку на сам бинарник без CRT.
Re[8]: Программа крэшится до точки входа, на стадии загрузки
От: drVanо Россия https://vmpsoft.com
Дата: 05.03.18 14:46
Оценка:
Здравствуйте, okman, Вы писали:

O>
O>OPTIONAL HEADER VALUES

O>    8160  DLL characteristics
O>            High entropy VA supported
O>            Dynamic base
O>            NX compatible
O>            Terminal server aware
O>


O>Также важно, что в заголовке не указан флаг 'Relocations stripped' (см. опцию /FIXED компоновщика), по которому

O>система могла бы точно понять, что приложение должно загружаться по строго фиксированному адресу:

Насколько я знаю 'Relocations stripped' вообще никак не влияет на загрузку имейджа по разным адресам. Влияет только 'Dynamic base'
Re[11]: Программа крэшится до точки входа, на стадии загрузки
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 05.03.18 15:34
Оценка:
Здравствуйте, drVanо, Вы писали:

CF>>Теоретически, да, не должны быть нужны. Но, возможно, это какой-то баг в загрузчике, который не может корректно обработать смещение точки входа при отсутствии релоков. Во всяком случае, других гипотез, объясняющих накопленные факты, пока не нашлось.


V>Больше похоже на баг в каком-нить гавноантивирусе.


Проявляется одинаково на двух машинах. На одной KAV, на другой только предустановленный Defender. Оба пробовал отключать, безрезультатно (хотя понимаю, что без деинсталляции это неполная проверка).

CF>>Тем не менее, когда собираю с CRT, таблица релоков появляется.


V>Вы бы хоть скинули ссылку на сам бинарник без CRT.


Вот проблематичный вариант (/DINAMICBASE, без CRT): https://yadi.sk/d/XTeelPX33T3g5K

На всякий случай, выкладываю прочие тестовые варианты:
с CRT: https://yadi.sk/d/g-PEPVaO3T3g55
без CRT, /DYNAMICBASE:NO /FIXED:NO : https://yadi.sk/d/4rDSscRR3T3g5B
без CRT, /DYNAMICBASE:NO /FIXED : https://yadi.sk/d/ZGUM0H-f3T3g5D

По заголовкам видно, что хоть релоков нет ни у одного из бес-CRT-шных вариантов, флаг IMAGE_FILE_RELOCS_STRIPPED имеется только у /FIXED. Именно этот вариант я сейчас использую как основной, и он пока ни разу не падал.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[12]: Программа крэшится до точки входа, на стадии загрузки
От: drVanо Россия https://vmpsoft.com
Дата: 05.03.18 16:06
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

CF>На всякий случай, выкладываю прочие тестовые варианты:

CF>с CRT: https://yadi.sk/d/g-PEPVaO3T3g55
CF>без CRT, /DYNAMICBASE:NO /FIXED:NO : https://yadi.sk/d/4rDSscRR3T3g5B
CF>без CRT, /DYNAMICBASE:NO /FIXED : https://yadi.sk/d/ZGUM0H-f3T3g5D

CF>По заголовкам видно, что хоть релоков нет ни у одного из бес-CRT-шных вариантов, флаг IMAGE_FILE_RELOCS_STRIPPED имеется только у /FIXED. Именно этот вариант я сейчас использую как основной, и он пока ни разу не падал.


Конечно их нет при "/DYNAMICBASE:NO"
Re: Программа крэшится до точки входа, на стадии загрузки
От: кт  
Дата: 08.03.18 10:08
Оценка:
Кажется, мелочь одну забыли глянуть. Когда падает — по указанному адресу память не выделена (в отладчике вопросительные знаки). Но в этом случае по заданному ENTRY POINT адресу все нормально?
Там действительно адрес первой команды?
Re[2]: Программа крэшится до точки входа, на стадии загрузки
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 08.03.18 10:25
Оценка:
Здравствуйте, кт, Вы писали:

кт>Кажется, мелочь одну забыли глянуть. Когда падает — по указанному адресу память не выделена (в отладчике вопросительные знаки). Но в этом случае по заданному ENTRY POINT адресу все нормально?

кт>Там действительно адрес первой команды?

Если взять адрес, по которому загружен модуль (с точки зрения отладчика), и перейти по этому адресу +1000, то да, там мой код.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[3]: Программа крэшится до точки входа, на стадии загрузки
От: кт  
Дата: 08.03.18 11:23
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

CF>Если взять адрес, по которому загружен модуль (с точки зрения отладчика), и перейти по этому адресу +1000, то да, там мой код.


Ожидаемо, но и непонятно. Отладчик ведь не сам загружает файл, а выполняет стандартные действия операционной системы. При этом все нормально, файл загрузился на "свое" место. И вдруг вместо Entry Point только что загруженного файла вызов по непонятному адресу. Разгадка должна находиться где-то в предыдущей сотне выполненных команд.
Re: Программа крэшится до точки входа, на стадии загрузки
От: ononim  
Дата: 09.03.18 14:52
Оценка:
Когда не крэшится, запуститесь по windbg и выполните в нем команду:
sxe ld
..и проследите какие модули будут подгружаться в ваш процесс. Все очень похоже на крэш изза когото кто извне заинжектить чета пытается. Первое подозрение — на security сьюты
Как много веселых ребят, и все делают велосипед...
Re: Программа крэшится до точки входа, на стадии загрузки
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 25.05.18 14:33
Оценка: 8 (1)
Что-то вылетела у меня из головы эта темка… Поковырялся и забыл. Чтобы не висела совсем уж в воздухе, отпишусь тут о результатах.

В итоге я попробовал взять исходный проблемный файл, в котором и динамическая база, и релоков нет, и флага об отсутствии релоков нет, и просто воткнуть прямо в заголовок скомпилированного файла этот флаг (IMAGE_FILE_RELOCS_STRIPPED). Сделал это уже давно (не меньше месяца назад), и до сих пор оно больше ни разу не падало, а используется эта утилитка очень активно. Думаю, гипотезу о влиянии флага на загрузчик можно считать подтверждённой.

Разумеется, остаётся открытым вопрос, почему оно вообще идёт вразнос, когда флага нет, но, видимо, это можно списать на какой-то внутренний виндобаг, где разработчики просто не учли такой сценарий. На будущее буду иметь в виду такую особенность и либо править проект, чтоб после сборки флаг автоматом добавлялся, либо ручками выставлять его в хекс-редакторе.

Спасибо всем за помощь и участие!
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[2]: Программа крэшится до точки входа, на стадии загрузки
От: reversecode google
Дата: 25.05.18 17:18
Оценка:
CF>В итоге я попробовал взять исходный проблемный файл, в котором и динамическая база, и релоков нет, и флага об отсутствии релоков нет, и просто воткнуть прямо в заголовок скомпилированного файла этот флаг (IMAGE_FILE_RELOCS_STRIPPED). Сделал это уже давно (не меньше месяца назад)

это отключает ASLR
а падало потому что винда в процессе работы может образ файла двигать в памяти
Re[3]: Программа крэшится до точки входа, на стадии загрузки
От: flаt  
Дата: 25.05.18 17:52
Оценка:
Здравствуйте, reversecode, Вы писали:


R>а падало потому что винда в процессе работы может образ файла двигать в памяти


Правда может?
Re[4]: Программа крэшится до точки входа, на стадии загрузки
От: reversecode google
Дата: 25.05.18 18:19
Оценка:
F>Правда может?

вы дебагером когда нибудь пользовались ?
в нём это хорошо видно
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.