• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Вылет функции после выполнения

  • Автор темы rudeman
  • Дата начала
R

rudeman

Добрый день всем! Подскажите изза чего может возникать у меня ошибка.
Функция следующего вида, часть моего *.ocx.
Код:
typedef struct gss_buffer_desc_struct {
size_t	 length;
void FAR * value;
} gss_buffer_desc, FAR * gss_buffer_t;

void COleLibCtrl::SubmitError() 
{
int size;
char message;
OM_uint32 p_minor_status=0;
gss_buffer_desc message_buffer;
FILE* file;
FILE* cfile;
char* error_message = "d:/error_message.txt";
char* error_size = "d:/acquire.txt";
file = fopen( error_size, "r" );
fscanf(file,"%d",&size);
fclose(file);
message_buffer.length=size;
message_buffer.value=malloc(message_buffer.length);
cfile = fopen(error_message, "r" );
fgets(&message,message_buffer.length, cfile);
fclose(cfile);
message_buffer.value=&message;
HINSTANCE hLIB;
hLIB=LoadLibrary("C:/LIB.dll");
::PFN_MyFunction4 pfnMyFunction4;
pfnMyFunction4=(PFN_MyFunction4)::GetProcAddress(hLIB,"OPEN_PROT");
int iCode=(*pfnMyFunction4)(&p_minor_status,log_path,&hProtHandle);
::PFN_MyFunction5 pfnMyFunction5;
pfnMyFunction5=(PFN_MyFunction5)::GetProcAddress(hLIB,"PROT");
int iCode1=pfnMyFunction5(&p_minor_status, hProtHandle,&message_buffer);
::PFN_MyFunction6 pfnMyFunction6;
pfnMyFunction6=(PFN_MyFunction6)::GetProcAddress(hLIB,"CLOSE_PROT");
int iCode2=pfnMyFunction6(&p_minor_status,&hProtHandle);
message_buffer.value=NULL;
free(message_buffer.value);
hProtHandle = NULL;
::FreeLibrary(hNGsec);
}
Судя по дебагу функция полностью отрабатывает, пишет что returned void, а потом идет вылет...
Код:
First-chance exception in TSTCON32.EXE: 0xC0000005: Access Violation.
Код:
  74696E48  ???
->74696E49  ???
74696E4A  ???
Вроде все отработало, а вылет идет... Я просто в прострации ((
 
M

Maxx

н-да

зачем эта строка кода
message_buffer.value=malloc(message_buffer.length);

если потом делается так
message_buffer.value=&message;

при этом message объявлен как
char message;

и из файла читается в строка размером message_buffer.length в переменную размером в 1 байт
fgets(&message,message_buffer.length, cfile);

а тайный смысл этого я не постиг
message_buffer.value=NULL;
free(message_buffer.value);


а кто проверять будет возвращаемые значения (например, из fopen, malloc и др) и
выгружать dll
 
R

rudeman

Ошибку нашел... достаточно "банальная" оказалась... malloc/new возвращает указатель на область памяти... и соответствующие free/delete освобождают выделеную память только по указателю, который вернулси после создания.А собсна message_buffer.value=&message; - все портило, переприсваивая указатель... в результате после выхода из функции была попытка очистить память "не ту"...
Гуглил на эту тему и пришел к выводу что ошибки компилятора могли бы быть более информативны ))

Maxx, спасиб за ответ, критика оправданая ) Но я просто выкладывал смесь "основного смысла" функции(без проверок, ибо они проходят все норм) и всякого отладочного муссора, который забыл закоментарить типа message_buffer.value=NULL; free(message_buffer.value); ))) Просто код пишу бардачно )))
 
G

gamecreator

Гуглил на эту тему и пришел к выводу что ошибки компилятора могли бы быть более информативны ))
без гугла могу сказать что прежде чем что-то использовать следует ознакомиться с тем, как его использовать и что оно делает.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!