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

06.04.2010, 03:56
|
|
Новичок
Регистрация: 07.06.2009
Сообщений: 4
Провел на форуме: 39074
Репутация:
9
|
|
ALSO
А так же, в этом коде никак не обрабатывается ситуация, если мы хотим освободить память по invalid-указателю.
В реальной программе, с функцией free это привидёт к исключению. Поэтому, я рекомендую добавить
В конец функции 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..
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|