Задача гарантированно решается только заменой зараженного файла на оригинальный. Что антивирус, частично, и делает: обнаруживает и удаляет, а пользователю остается только вернуть файл из бекапа или дистрибутива и снова его проверить. Если нет ни бекапа, ни исходного файла в дистрибутиве, то задача не имеет гарантии, т.к. нужно знать, как зараженный файл используется операционкой и как вирус активируется. В простейшем случае, это exe или dll, просто доп. блок с кодом в конце файла и перехват каких-то точек исполнения в оригинальном коде (измененные несколько байт в основном коде). В сложном случае — что угодно, задача не решаемая. Кроме нативных исполняемых exe/dll могут быть еще компилируемые форматы (напр. для .net), скрипты (программы в исходном коде, например js), косвенные воздействия (определенная порча данных, обрабатывая которые, программа поведет себя нужным для злоумышленника образом).
Восстановление простейшего случая сводится у убиранию лишнего кода и восстановлению кода в точке перехвата. Вот тут и нужны знания ассемблера и куча времени, чтобы понять, что же было в старом коде. Эти байты могли как быть скопированы в блок вируса, так и затерты безвозвратно.
Вывод: шансов на восстановление мало, трудозатраты огромны, проще восстановить из бекапа или дистрибутива. Возвращаемся к исходной позиции: антивирус — решение проблемы.
И не задачу я назвал обывательской, а подход без нужных знаний и опыта. Потому что их надо много.