ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #5  
Старый 06.04.2010, 03:56
gribodemon
Новичок
Регистрация: 07.06.2009
Сообщений: 4
Провел на форуме:
39074

Репутация: 9
Отправить сообщение для gribodemon с помощью ICQ
По умолчанию

ALSO

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

Код:
__asm int 3
В конец функции FreeOverflowGuardedBuffer

P.S.:

Наверно вы зададите вопрос - как это вообще возможно - попытаться освободить память по неверному указателю ?
Если вы используете замечательный код TC - TransferProgramEx, то эта ошибка может возникнуть. Будьте уверены.
Типа:

Код:
PBYTE gl_pBuffer = NULL;

...
void f()
{
  if (gl_pBuffer) delete[] gl_pBuffer;
  gl_pBuffer = new BYTE[100];
}
Что произойдёт, если вы вызовите неск. раз f(), затем FreeOverflowGuardedBuffer(), и снова попытаетесь вызвать f(), будучи в коде уже другого процесса? Хехе. =)

А как решить эту проблему, не прибегая к полному отказу от оператора delete в функции типа f() ?
Я так понимаю, нужно во временном указателе, до вызова TransferProgramEx запомнить адрес на gl_pBuffer, затем обнулить gl_pBuffer, потом вызвать TransferProgramEx, после её вызова, восстановить gl_pBuffer.

Ну, примерно таким образом это выглядит для случая с блоком по выявлению ошибок памяти ( дополнительный массив структур __allocs_bck & модифицированный код функции TransferProgramEx) :

Код:
struct __allocation {
	void* mem;
	int len;
	char guard_type;
} __allocs [ALLOC_SIZE], __allocs_bck [ALLOC_SIZE];

Код:
	// move memory
#ifdef _DEBUGLITE
	CopyMemory(__allocs_bck, __allocs, sizeof(__allocs));
	ZeroMemory(__allocs, sizeof(__allocs));
#endif

	__CopyMemoryAcrossProcesses( hProcess, (char*) hModule, (char*) Allocated );

#ifdef _DEBUGLITE
	CopyMemory(__allocs, __allocs_bck, sizeof(__allocs));
	ZeroMemory(__allocs_bck, sizeof(__allocs));
#endif


Кто знает более лаконичное решение?

Последний раз редактировалось gribodemon; 06.04.2010 в 04:24..
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Советы при работе с картами памяти alextoun Аппаратное обеспечение 0 12.03.2007 14:32
Ученые раскрыли механизмы работы человеческой памяти dinar_007 Мировые новости 2 12.01.2006 02:54
Bsod экран смерти silveran Чужие Статьи 1 21.12.2005 22:34
Безопасность в Php, Часть Iii k00p3r Чужие Статьи 0 11.07.2005 19:02



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ