Полиморфный вирус дописывает к заражаемой программе: код расшифровщика, команду безусловного перехода, случайные байты и вредоносный код:
Код расшифровщика |
Код заражаемой программы |
E9(JMP) (1 байт) |
Смещение
|
Случайные байты |
Вредоносный код |
При этом вредоносный код записывается в зашифрованном виде. Ниже приведена функция, которая использовалась для шифрования:
// crypto_const – неизвестнаяконстанта;
char encode(char code, const char crypto_const)
{
return (code ^ crypto_const);
}
Кроме того, известно, что для перехода на начало собственно вредоносного кода применяется команда безусловного перехода JMP, которая в незашифрованном виде имеет код E9. После этого следуют 2 байта величины смещения относительно следующей команды. Найдите первые 4 байта расшифрованного вредоносного кода, если известно, что величина этого смещения не больше 250 байт.
Фрагмент кода программы после внедрения вируса:
…
db d5 c8 51 b8 fe 94 8b 89 d0 98 b5 b2 b1 d2 dd b1 d1 d6 cb dd ca cc 98 b5 b2 b1 db d5 c8 b1 d9 d4 94 8b 8ad0 98 b5 b2 b1d2 ddb1 cb dd d9 ca db d0 98 b5 b2 b1 db d5 c8 b1 d9 d4 94 8b8b d0 98 b5 b2 b1 d2 dd b1 dc dd d4 dd cc dd 98 b5 b2 b1 db d5 c8 b1 d9 d4 94 8b 88 d0 98 b5 b2 b1 d2 ddb1 dd c0 d1 cc 98b5 b2 b1 d2 d5 c8 b1 df d7 98
…
Необходимо перебрать все константы от 0x00 до 0xff, выполнив при этом команду «побайтового исключающего ИЛИ» между каждым байтом кода программы и выбранной константой. Перебор осуществляется до тех пор, пока в результирующем бинарном коде не появятся подряд идущие байты «e9» и «00», которые соответствуют коду команды безусловного перехода JMP и первому байту смещения. За байтом «00» будет следовать второй, значащий байт со смещением. Необходимо отсчитать это смещение от текущей позиции и взять четыре байта кода начала вируса.