Решение
prgrant наиболее простое.
Если нужно разобраться, то разворачиваешь последний бакапп (или устанавливаешь все с нуля, в общем делаешь рабочую чистую от вируса копию) и начинаешь сравнивать по файлам (и базы данных тоже, бывают проекты от не очень оригинальных архитекторов, которые хранят код в базе, отличным примером может быть следующее - в проекте есть уязвимость, при которой ряд запросов со стороны клиента запускают скрипт на сервере, поэтому достаточно в шаблоне, который хранится в базе, добавить скрипт этого заражения и вот, первый клиент автоматически запускает код на сервере)
Другим способом, т.е. чисто аналитическим, разобраться бывает нереально сложно, тем более у тебя много проектов развернуто.
Вирус может лежать в базе данных, в файлах проекта, во временных файлах, в логах, в изображениях, в расширенных атрибутах файлов, вечно в оперативной памяти (вариант когда вирус появляется после запроса злоумышленника через дыру в проекте) и т.п.
p.s. само собой цель - не только найти и удалить файлы вируса, но найти дыру и закрыть ее, так как если этого не сделать, вирус вернется. Обычно обновляют кодовую базу сайтов и пролводят аудит безопасности, минимальный, хотя бы фаервол настроить и закрыть все что не должно торчать 'наружу'