Показать сообщение отдельно

  #28  
Старый 27.06.2007, 15:15
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Для Microsoft Visual Studio 7 (она же 2003 .NET):

Если нет желания таскать за собой рантайм в том или ином виде, а при его отключении линкер орёт на неразрешенные ссылки на __chkstk, ___securitycookie и @__security_check_cookie@4, можно обойтись следующей реализацией этого (писал сам )

Код:
// будем тока выделять место в стеке под переменные
extern "C" __declspec(naked) void _chkstk()
{
	__asm
	{
		// Enter: EAX = size

		xor ebx, ebx
		xchg [esp], ebx  // запоминаем адрес возврата
		add esp, 4  // удаляем его
		sub esp, eax  //  выделяем место
		push ebx  // кладем адрес возврата на место и возвращаемся
		retn
	}
}

// любое число, в принципе, но чтобы оно было "случайное", а не вида 00010000.
// хороший вариант - 19237845 или BACBBAFD или что-нибудь в этом роде
extern "C" DWORD_PTR __security_cookie = 0x5F8E34B0;

// проверка на переполнение буфера
extern "C" void _fastcall __security_check_cookie(DWORD_PTR cookie)
{
	if(__security_cookie != cookie)   // можно добавить ченить более умное при ошибке
		__asm int 3;
}

Последний раз редактировалось _Great_; 27.06.2007 в 15:18..
 
Ответить с цитированием