Суть такова. Написал шелл, в котором решил обнулить весь образ файла, из которого был произведен вызов. Далее шелл выполняет какие-то действия, а в конце, так как возвращаться ему в нули не стоит, вызывает ExitProcess. И вроде бы все должно быть нормально, однако в действительности происходит весьма странная ерунда:
Вызывается ExitProcess, в нем RtlExitUserProcess, внутри снова происходят какие-то танцы с бубном, и на моменте вызова LdrShutdownProcess (внутри вызываются какие-то неизвестные функции ntdll) бросает в нули, а конкретнее в какое-то место из .text секции. Запустил Идочку, поглядел, оказалось, что в этом месте расположилась ___vcrt_freefls функция из стандартной библиотеки.
Стало ясно, что для корректного срабатывания необходимо освободить через FlsFree все эти коллбеки. И, боже мой, PEB имеет соответствующие поля для этого. Однако, как оказалось, в них не содержится ровным счетом ничего!
PEB, по идее, должна хранить инфу в следующих полях (но не хранит):
Кустарное решение, которое сработало в частном случае:
Но такое решение мало того, что не присуще джентльменам, так еще и неясно в каком процессе может оказаться шелл, а винда позволяет, как минимум, хранить 1088 коллбеков (так где-то было написано), а макрос из недокументированной документации и вовсе объявляет FLS_MAXIMUM_AVAILABLE равным 4080. Тысячи раз вызывать функцию считаю непрактичным.
Отсюда и возникает вопрос: как получить индексы FLS или список коллбеков.
Вызывается ExitProcess, в нем RtlExitUserProcess, внутри снова происходят какие-то танцы с бубном, и на моменте вызова LdrShutdownProcess (внутри вызываются какие-то неизвестные функции ntdll) бросает в нули, а конкретнее в какое-то место из .text секции. Запустил Идочку, поглядел, оказалось, что в этом месте расположилась ___vcrt_freefls функция из стандартной библиотеки.
Стало ясно, что для корректного срабатывания необходимо освободить через FlsFree все эти коллбеки. И, боже мой, PEB имеет соответствующие поля для этого. Однако, как оказалось, в них не содержится ровным счетом ничего!
PEB, по идее, должна хранить инфу в следующих полях (но не хранит):
C:
_FLS_CALLBACK_INFO* FlsCallbacks;
LIST_ENTRY FlsListHead;
PVOID FlsBitmap;
ULONG FlsBitmapBits[FLS_MAXIMUM_AVAILABLE / (sizeof(ULONG) * 8)];
ULONG FlsHighIndex; //also FlsCount
Кустарное решение, которое сработало в частном случае:
C:
for (DWORD index = 1; index < 6; index++)
FlsFree(index);
Но такое решение мало того, что не присуще джентльменам, так еще и неясно в каком процессе может оказаться шелл, а винда позволяет, как минимум, хранить 1088 коллбеков (так где-то было написано), а макрос из недокументированной документации и вовсе объявляет FLS_MAXIMUM_AVAILABLE равным 4080. Тысячи раз вызывать функцию считаю непрактичным.
Отсюда и возникает вопрос: как получить индексы FLS или список коллбеков.