Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2009, 16:06   #1
dudeboy
 
Регистрация: 02.11.2009
Сообщений: 7
По умолчанию Тестирующая сиситема

Пишу небольшую системку для проверки решений задач учеников. Т.е. ученики посылают в систему файл на паскале/C++/Jav'e, система компилирует и выдает ответ - правильно или нет решена задача (напоминает правила олимпиад по программированию ACM).

Я знаком с большинством нынешних тестирующий систем, к сожалению они далеки от идеала или же как МГУшная системы ejudje - очень сложна в настройках.

Поэтому и решено было написать свою.


На данный момент стоят вопросы:
1. об определении есть ли в кодже ученика ассемблерная вставка.
2. как убивать выполняемое решение ученика по истечению определенного промежутка времени, т.е. если программа ученика написано не оптимально и долго работает, то завершать её автоматически и выдавать ответ что превышено время исполнения
3. Как ограничить программу по памяти, дав ей, к примеру, не более 64Мб.

На этом моменте я застрял, помогите пожалуйста...
dudeboy вне форума Ответить с цитированием
Старый 02.11.2009, 16:10   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

1. Ищи распространенные коды асемблера типа mov или регистры - там ax или sp.
2. По строжевому таймеру, единственная проблема - это критерий когда программа считается завершенной. Таймер периодически проверяет наступление опредленного момента времени и по его наступлении проверяет критерий завершения программы.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 03.11.2009, 07:41   #3
dudeboy
 
Регистрация: 02.11.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
1. Ищи распространенные коды асемблера типа mov или регистры - там ax или sp.
2. По строжевому таймеру, единственная проблема - это критерий когда программа считается завершенной. Таймер периодически проверяет наступление опредленного момента времени и по его наступлении проверяет критерий завершения программы.

Тут же возник еще вопрос:
Парсинг кода это дело простое. Но что если в файле будет обфусцированный код. Возможно ли скрытие реализации ассемблерных вставок ?

Если не возможно, то моя задача сводится к парсингу файла и поска в нем зарезервированных слов в зависимости от ЯП ? К примеру для Delphi/Pascla ищу вставки MOV, для GCC ищу __mov__ и т.д. Так ли это ???
dudeboy вне форума Ответить с цитированием
Старый 03.11.2009, 08:53   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от dudeboy Посмотреть сообщение
Тут же возник еще вопрос:
Парсинг кода это дело простое. Но что если в файле будет обфусцированный код. Возможно ли скрытие реализации ассемблерных вставок ?

Если не возможно, то моя задача сводится к парсингу файла и поска в нем зарезервированных слов в зависимости от ЯП ? К примеру для Delphi/Pascla ищу вставки MOV, для GCC ищу __mov__ и т.д. Так ли это ???
Это как Вы в Делфи сделаете ассемблерную вставку, так чтобы было не ясно, что это ассемблер? И потом, если студент это смог, то уже зачет за фантазию и сообразительность .
В Делфи можно искать слово asm к примеру.
Если сможете договориться с Делфи, то можно читать его отчет о компиляции (у Вас же будут исходники?), а он может рассказать много интересного (например предупреждение об обращении по индексу - так можно отловить типичный способ получения управления в кучу).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 03.11.2009 в 09:12.
Utkin вне форума Ответить с цитированием
Старый 03.11.2009, 09:17   #5
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Каждая ASM вставка начинается со слова asm.

Код:
function WinExecAndWait32(FileName:String; Visibility : integer):integer;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
i:cardinal;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);

StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName,                      { указатель командной строки }
nil,                           { указатель на процесс атрибутов безопасности }
nil,                           { указатель на поток атрибутов безопасности }
false,                         { флаг родительского обработчика }
CREATE_NEW_CONSOLE or          { флаг создания }
NORMAL_PRIORITY_CLASS,
nil,                           { указатель на новую среду процесса }
nil,                           { указатель на имя текущей директории }
StartupInfo,                   { указатель на STARTUPINFO }
ProcessInfo) then Result := -1 { указатель на PROCESS_INF }

else begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,i);
result:=i;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
h:hwnd;
t,r:integer;
begin
t:=gettickcount;
r:=WinExecAndWait32('C:\Documents and Settings\OEM\Project2.exe',1);
if r=0 then
showmessage('Успешно завершено за '+inttostr((gettickcount-t) div 1000)+ ' сек.') else
showmessage('Ошибка: #'+inttostr(r));
end;
pushl $0x18E3DF6B
call ICQ

Последний раз редактировалось Stilet; 03.11.2009 в 11:03.
russian-stalker вне форума Ответить с цитированием
Старый 03.11.2009, 10:44   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Все правильно, ассемблерной вставки нету .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 05.11.2009, 06:02   #7
dudeboy
 
Регистрация: 02.11.2009
Сообщений: 7
По умолчанию

ОК, спасибо.
Так и сделал - парсинг исходника на предмет вхождения "asm"

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

Скомпилированное их решение будет запускаться на сервере. Смысл в том чтобы не погубить сервер решением детей.

Какие основные моменты надо при этом усмотреть ?
dudeboy вне форума Ответить с цитированием
Старый 05.11.2009, 08:32   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Антивирус. Пусть твой сервак отправляет скомпилированное дело на какой-нить сайт по проверке вирусов.
И потом можно парсить, некоторые функции ВинАпи - например запуск сторонней программы, выполнение команд в ShellExcecute и пр.
Просто припугни их, что если будет какая-нибудь вредность от их программы, то студента ждет уголовная ответственность или отчисление в Армию.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 06.11.2009, 06:22   #9
dudeboy
 
Регистрация: 02.11.2009
Сообщений: 7
По умолчанию

По условию решение ученика читает данные из файла input.txt и пишет в файл output.txt
Для каждой задачи есть набор тестов. Т.е. скомпилированному решению ученика даются по очереди тесты от 1 до N.
Есть чекер - программа для проверки данных в выходном файле. Как запустить этот чекер для всех тестов ?

Напрашивается решение для компиляции решения ученика и копирования в папку с этим решением по очереди файлов input.txt, затем выполнение скомпилированного решения и проверка с помощью чекера.

Возможно ли обойтись без такого копирования ?
dudeboy вне форума Ответить с цитированием
Старый 06.11.2009, 08:14   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ну всю работу можно свалить на студента, пусть ему дали один общий файл, а он выдирает каждый раз нужное задание из файла и решение добавляет в конец выходного. Естественно сразу договориться об оформлении, чтобы было ясно где чьи лапы и хвосты.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Тестирующая\обучающая программа Gustaf Помощь студентам 9 25.05.2009 17:55
Тестирующая программа "КРИВЫЕ ВТОРОГО ПОРЯДКА" ivp88 Помощь студентам 3 13.03.2007 11:47
Тестирующая прога KlErik Общие вопросы Delphi 1 30.01.2007 10:06