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

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

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

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

Ошибка чтение/записи в защищенную область

  • Автор темы mibin
  • Дата начала
M

mibin

Не много истории:
В общем так...я написал программу которая создает файл и записывает туда структуру, копирнул это структуру в программу которая должна считывать этот файл и написал код для считывания(ниже приведу пример чтения и записи). Трасером я смог определить, что данные из файла считываются и считываются верно, но! после того как процедура считывания заканчивает свою работу и возвращается в процедуру которая вызвала ее возникает ошибка "чтения/записи в защищенную зону" и еще там было написано что это часто свидетельствует о поврежденной памяти (не думаю что такое возможно сразу на двух компах и то что память цела есть еще одно подтверждение, но об этом позже). Долго ли коротко ли, но мучения мои сегодня принесли первые плоды (я вставил код записи и чтения в процедуру обрабатывающую клик мышки и все заработало без ошибок), получив такой результат я был крайне удивлен, но позже меня удивило еще больше ТО! Что если код ЗАПИСИ и ЧТЕНИЕ из файла лежит в одной программе то все выполняется БЕЗ ОШИБОК даже если в последствии код записи удалить файл будет читаться и читаться без проблем! Но если файл создаю в одной программе, а читаю в другой то вылазиет эта дибильная ошибка.
Вот код записи файла
C++:
using namespace std;

struct licfile {
string name;
float licnum;
int sec;
};


int _tmain(int argc, _TCHAR* argv[])
{
licfile lic;
float id;
float num = 1679;
cout << "Write name: "; cin >> lic.name; cout << endl;
cout << "Write id: "; cin >> id; cout << endl;
lic.licnum = id*num;
cout << "Write sec(0 - unlim): "; cin >> lic.sec; cout << endl;
FILE *file;
file = fopen("lic.k", "wb");
fwrite(&lic, sizeof(licfile), 1, file);
fclose(file);
return 0;
}
Вот код чтения:
C++:
// ..........................................................................
struct licfile 
{
std::string name;
float licnumber;
int sec;
};
// ..........................................................................
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Int16 verify(int id, licfile *license) {
FILE * file;
licfile lic;
file = fopen("lic.k", "rb");
fseek(file, 0L, SEEK_SET);
fread(&lic, sizeof(licfile), 1, file);
fclose(file);
return 1;
}
// ..........................................................................

Это что ж такое получается...я могу прочитать только то что создал а все остальное нет? Помоему это как-то не правильно. Я допускаю что это как-то связано с платформой *.NET так как так прога которая записывает написана в обычной консольке, а которая считывает это уже графика с использованием 4ого Framework'a, может бы он как-то иначе файл обрабатывает файл из-за этого?

Во вложении изображение вылезающей ошибки.
 

Вложения

  • error.JPG
    error.JPG
    58 КБ · Просмотры: 360
G

grigsoft

Тут надо понимать 2 вещи:
1. Записывая структуру в файл (или читая), ты используешь 1 сплошной кусок памяти, занимаемый твоей структурой.
2. string - не лежит в памяти как один кусок. Посмотри чему равен sizeof(licfile), когда в нем лежит строка - думаю, будешь удивлен.
string - это (грубо) всего лишь указатель на область памяти, где лежит твоя строка на самом деле. Почему у тебя работало? А неужели ты ни разу не заглянул в файл, что там записалось-то? А записался туда адрес памяти, где лежала строка. Когда ты этот адрес вычитал - если тебе повезло и строка все еще по этому адресу - то все работает.
 
Мы в соцсетях:

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