Board.KolibriOS.org https://board.kolibrios.org/ |
|
Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? https://board.kolibrios.org/viewtopic.php?f=2&t=3733 |
Page 1 of 2 |
Author: | floppy121 [ Sun Jun 24, 2018 1:08 am ] |
Post subject: | Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
После того как пользователь пообщался в IRCC (чат клиент) и вышел из него, логи чата и личных сообщений из области данных программы - могут остаться в оперативной памяти, а это угроза безопасности! Поэтому нужно вставить в код обработки нажатия крестика в верхней панели функцию стирания области данных. У меня уже есть функция которая принимает на вход два аргумента: адрес (откуда стирать) и размер (сколько стирать). Но как узнать эти значения? Очень важно правильно определить начало области данных, но этого недостаточно: если мы укажем слишком маленький размер то сотрём не всё, а если слишком большой - выйдем за пределы области данных и можем повредить соседний процесс |
Author: | Ray [ Sun Jun 24, 2018 8:38 am ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
Если ты внутри программы, то ты и так знаешь буфер и его размер, если вне её то ничего сделать не сможешь из-за защиты страниц (получить исключение #PF). |
Author: | 0CodErr [ Sun Jun 24, 2018 12:28 pm ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
Не совсем понимаю сути проблемы, но в любом случае, это не задача самого процесса. Ведь процесс можно прибить, ничего ему не сказав, безо всякого "нажатия крестика" — через диспетчер задач. |
Author: | floppy121 [ Sun Jun 24, 2018 1:16 pm ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
0CodErr wrote: Не совсем понимаю сути проблемы я ищу способ получить адрес начала области данных и её размер каким-то универсальным способом вроде системного вызова, который не будет зависеть от внутреннего устройства конкретной программы 0CodErr wrote: это не задача самого процесса. Когда юзер закроет программу таким способом, будет сам виноват что его чат остался в оперативке Ведь процесс можно прибить, ничего ему не сказав, безо всякого "нажатия крестика" - через диспетчер задач. ![]() Ray wrote: Если ты внутри программы, то ты и так знаешь буфер и его размер, если вне её то ничего сделать не сможешь из-за защиты страниц (получить исключение #PF). Если я нахожусь внутри программы, как определить адрес области данных и весь её размер? Просто если я буду очищать только конкретный буфер - то могу что-то упустить из виду: например неправильно определить его размеры и стереть не всё, или не заметить второй небольшой буфер который промежуточно где-то используется и содержит небольшие фрагменты чатаПоэтому я и ищу универсальный способ просто стереть всю область данных. А для этого мне нужно правильно определить её адрес и размер. Должен же быть какой-то способ получить эти значения? Начало и конец области данных как-то помечаются в оперативке, может быть специальными заголовками? |
Author: | GerdtR [ Thu Jun 28, 2018 9:33 pm ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
Такое, наверное, только через драйвер реализовать можно. Фишка в том, что сначала прога получает кусок оперативы в границах от 0 до цифры указанной в заголовке проги. Дальше прога может вызвать ф68.12 и она будет выделен уже после памяти проги, причём через промежуток. Ну то есть виртуальное пространство проги будет что-то вроде: 0..4000h, 5000h..6000h. Если взять цифру из ф9 с инфой о потраченой опервативе, и зачистить с 0 по эту цифру... то вывалится в эксэпшн. А узнать, какие именно страницы выделены проге можно только от ядра. Так что гляди в сторону ядра. Реализовать реально, но несколько сложновато. "если слишком большой - выйдем за пределы области данных и можем повредить соседний процесс" - это точно не светит. Попытка писать в закрытую область убивает процесс. |
Author: | tsdima [ Fri Jun 29, 2018 12:11 pm ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
GerdtR wrote: Такое, наверное, только через драйвер реализовать можно. Это не решит проблему, когда программа убивается диспетчером задач. Как вариант - хранить данные зашифрованными, расшифровывать маленькими кусочками, выводить на экран и тут-же обнулять область памяти с расшифрованными данными. |
Author: | 0CodErr [ Sat Jun 30, 2018 9:24 am ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
GerdtR wrote: "если слишком большой - выйдем за пределы области данных и можем повредить соседний процесс" - это точно не светит. Кстати, да, не можем: каждый процесс выполняется в своём адресном пространстве.tsdima wrote: GerdtR писал(а): Действительно, не решит.Такое, наверное, только через драйвер реализовать можно. Это не решит проблему, когда программа убивается диспетчером задач. Но можно попытаться без драйвера обойтись(хотя всё равно так делать не рационально). Можно попробовать вариант с SysFn68.24:SetExceptionHandler, у Page-Fault Exception (#PF) номер 14. Сам я не использовал ни разу эту функцию, просто предположу:
Если #PF не возникло, то эта страница в данный момент выделена. Но страницы могли быть освобождены во время работы ещё до выхода. Если только сделать свою HeapFree, делающую что-то до вызова системной HeapFree. floppy121 wrote: Если я нахожусь внутри программы, как определить адрес области данных и весь её размер? Размер выделенной области кратен размеру страницы.В справке так и написано: Quote: Функция выделяет целое число страниц (4 Кб) А указатель возвращает системная функция при выделении памяти — просто сохраняй этот указатель для дальнейшего использования.Ещё один не менее тупой способ:
а затем выделить один большой кусок и делать с ним, что хочешь |
Author: | 0CodErr [ Mon Jul 02, 2018 10:28 am ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
floppy121 wrote: Если я нахожусь внутри программы, как определить адрес области данных и весь её размер? 0CodErr wrote: Но самое логичное решение: если нужны указатели и размеры областей — нужно хранить эту информацию в программе и обращаться к ней по мере необходимости. Вот правильное решение, то, что я имел в виду: http://websvn.kolibrios.org/filedetails ... 0#line-368Code: ; Erase RAM areas which could contain the connection details |
Author: | Siemargl [ Wed Jul 04, 2018 12:50 am ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
ОСистема заботится о стирании и недоступности данных из других/новых процессов. Тема бесполезна. |
Author: | floppy121 [ Wed Jul 04, 2018 7:20 pm ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
0CodErr wrote: Вот правильное решение, то, что я имел в виду: http://websvn.kolibrios.org/filedetails.php?repname=Kolibri+OS&path=%2Fprograms%2Fnetwork%2Fircc%2Fircc.asm&rev=7300#line-368 Да, это единственное решение которое пока работает: вручную искать все места в оперативке где могло что-то остаться,и заполнять их нулями до того как программа высвободит память обратно в ОС. Полного успеха мы пока не добились: осталось как минимум три буфера где остались важные данные, про это написал в WARNING здесь - viewtopic.php?f=11&p=70875 Возможно, проще было бы модифицировать код системной функции 68 - http://wiki.kolibrios.org/wiki/SysFn68/ru - чтобы при вызове mcall 68, 13 для любой области памяти она заполнялась нулями перед освобождением, но боюсь такой вариант не примут в "официальные исходники", а число "локальных модов" не хочется увеличивать |
Author: | 0CodErr [ Thu Jul 05, 2018 10:09 am ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
Siemargl wrote: ОСистема заботится о стирании и недоступности данных из других/новых процессов. Тема бесполезна. Прежде, чем чесать своим языком, стоило заглянуть в код ядра и убедиться, что никто ничего не стирает. А потому что зачем? Кому надо(приложению) — тот и обнуляет память. А для тех, у кого всё-таки есть желание разбираться с кодом, вот тестовый пример, суть вот в этом месте: Code: ................................................. Attachment:
|
Author: | Siemargl [ Thu Jul 05, 2018 7:51 pm ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
Serge писал viewtopic.php?p=68348#p68348 |
Author: | 0CodErr [ Thu Jul 05, 2018 8:21 pm ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
Siemargl wrote: Serge писал А ты сам не в состоянии исходник посмотреть? ![]() Code: f68:Ну и см. пример выше viewtopic.php?p=70878#p70878 |
Author: | 0CodErr [ Thu Jul 05, 2018 9:38 pm ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
Похоже проблема только с выделением .bss, а HeapAlloc вроде отрабатывает. Хмм... а какую конкретно помять имел в виду Serge? Serge wrote: память, выделяемую для приложения
|
Author: | floppy121 [ Thu Jul 05, 2018 11:48 pm ] |
Post subject: | Re: Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё? |
Siemargl wrote: ОСистема заботится о стирании и недоступности данных из других/новых процессов Если бы это было действительно так, то в дампе памяти виртуальной машины, снятой после закрытия приложения IRCC, я бы ничего не обнаружил (и этой темы бы не было). Но к сожалению там осталось по крайней мере три буфера, а это значит: после закрытия IRCC система не стала занулять память освобождённую IRCC, а просто пометила её страницы как доступные для использования новыми процессами
|
Page 1 of 2 | All times are UTC+03:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |