Сейчас на форуме: hgdagon, asfa (+3 невидимых)

 eXeL@B —› Программирование —› Нужна помощь в борьбе с виром
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 22.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 02 июня 2007 00:55
· Личное сообщение · #1

Вот вчем вопрос: пишу лечилку от вира. Но эта сволота убила нужные доки. Поэтому столкнулся с проблемою: 1) как вычислить size of image?
2) исходник какой нить проги на дельфе, которая работает с секциями?
3) как деасемблировать, тоесть E9E23CFBFF -> JMP 0040FCEE?
Или пример проги на Дельфе, которая умеет все выше перечисленоё



Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 02 июня 2007 01:16
· Личное сообщение · #2

AnXIouS пишет:
1) как вычислить size of image?

Поищи исходники SDTrestore, там был код, рассчитывающий GetTotalImageSize по секциям; он на С, но я не вижу причины, по которым тебе нужен имено дельфи-код.
AnXIouS пишет:
2) исходник какой нить проги на дельфе, которая работает с секциями

Если с С не cможешь перевести в Дельфи, то врядли стоит браться за работу с файлами РЕ-формата...

AnXIouS пишет:
3) как деасемблировать, тоесть E9E23CFBFF -> JMP 0040FCEE?


Например:

00400000 JMP 00500000 (E9FBFF0F00)
E9 - JMP
FBFF0F00 это число 0x000FFFFB (задом наперед) 0x000FFFFB = 0x00500000 - 0x00400000 - 0x5
(5 - длина команды, 5 байт)

-----
Research is my purpose




Ранг: 34.1 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 02 июня 2007 01:23 · Поправил: Shad0vv
· Личное сообщение · #3

Сдаётся мне цель как раз противоположная.
Но всё же.. Найди прогу от "PE optimizer" от Dr.Golova, вместе с ней идут сорсы, там как раз всё описано.
На счет дизассемблирования, в сети есть описание систематизации команд, я например это всё отрыл в книге Юрова "Assembler 2-е издание".



Ранг: 103.1 (ветеран), 3thx
Активность: 0.070.01
Статус: Участник

Создано: 02 июня 2007 08:49
· Личное сообщение · #4

AnXIouS
На wasm есть дизассемблерный движок на асме

-----
Crack your mind, save the planet





Ранг: 282.8 (наставник), 24thx
Активность: 0.260
Статус: Участник
win32.org.ru

Создано: 02 июня 2007 09:00
· Личное сообщение · #5

Styx пишет:
На wasm есть дизассемблерный движок на асме

Читай выше - нужно на дельфи... Есть дизасм движек, мб он на васме, от рема, написан на дельфи.

-----
may all your PUSHes be POPed!




Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 02 июня 2007 14:19
· Личное сообщение · #6

дельфи тоже люблю, но для разнообразия
http_//bigspider.altervista.org/CodingTutes/spider10.zip
http_//bigspider.altervista.org/ToolsAndProgs/spider20.zip



Ранг: 22.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 02 июня 2007 18:22
· Личное сообщение · #7

Во первых сенкс. Во вторых: с++ знаю недостаточно (опирался на инфу, вирусом снесённую) это 1; вирус неравнодушен к с++, а дельфи не трогает это 2;
люблю я дельфю...
С-шные исходняки всеравно пригодятся, так как для дельфи добра такой тематики мало.



Ранг: 22.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 03 июня 2007 01:07
· Личное сообщение · #8

>вирус неравнодушен к с++, а дельфи не трогает это 2
кинь семпл виря что-ли, а то что-то интересно, как это он такой избирательный...



Ранг: 22.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 03 июня 2007 07:20
· Личное сообщение · #9

Скинь мне на е-мейл свой е-мейл, и я те пришлю его.



Ранг: 22.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 03 июня 2007 08:58
· Личное сообщение · #10

забавно, а мыло я откуда узнаю? =)
check PM.



Ранг: 22.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 03 июня 2007 19:11
· Личное сообщение · #11

Ноччу будет. Бо инет через мабилу.



Ранг: 22.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 04 июня 2007 00:14
· Личное сообщение · #12

WolfHunter, уже отправил.
Я сегодня с ним немного разобрался: зовут его win32.expiro.c, выловил Нодом, но с лечением проблема.
По личной статистике добавлю: не трогает некоторые протекторы и пакеры, а также продукты Борландов. И файлы убил скорей всего не он.




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 04 июня 2007 01:25
· Личное сообщение · #13

AnXIouS

ImageSize = ImageBase + LastSectionRVA + LastSectionSize

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!




Ранг: 22.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 04 июня 2007 01:34
· Личное сообщение · #14

GPсH, вот это конкретно, сенкс.
Осталось только научится удалять секции, и УнВир будет готов. :-D



Ранг: 14.1 (новичок)
Активность: 0=0
Статус: Участник

Создано: 04 июня 2007 07:35
· Личное сообщение · #15

GPcH пишет:
ImageSize = ImageBase + LastSectionRVA + LastSectionSize


ImageBase то, зачем?




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 04 июня 2007 10:48 · Поправил: Hellspawn
· Личное сообщение · #16

ganjman пишет:
ImageBase то, зачем?



кстати да, база не нужна, да и размер (если считать таким образом) может получиться не точный...
лучше всего пройтись по секциям и суммировать их размер, делая поправку на выравнивание!

-----
[nice coder and reverser]




Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 04 июня 2007 11:03
· Личное сообщение · #17

Hellspawn
Это зачем? Не могу представить себе такую ситуацию. Или ты про то, что последня секция в списке может оказаться не последней по размещению в памяти?



Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 04 июня 2007 11:04
· Личное сообщение · #18

#define ibaseDD *(PULONG)&ibase

BOOL GetHeaders(PCHAR ibase, PIMAGE_FILE_HEADER *pfh, PIMAGE_OPTIONAL_HEADER *poh, PIMAGE_SECTION_HEADER *psh)
{
PIMAGE_DOS_HEADER mzhead=(PIMAGE_DOS_HEADER)ibase;

if((mzhead->e_magic!=IMAGE_DOS_SIGNATURE) || (ibaseDD[mzhead->e_lfanew]!=IMAGE_NT_SIGNATURE))
return FALSE;

*pfh=(PIMAGE_FILE_HEADER)&ibase[mzhead->e_lfanew];
if (((PIMAGE_NT_HEADERS)*pfh)->Signature!=IMAGE_NT_SIGNATURE)
return FALSE;

*pfh=(PIMAGE_FILE_HEADER)((PCHAR)*pfh+sizeof(IMAGE_NT_SIGNATURE));

*poh=(PIMAGE_OPTIONAL_HEADER)((PCHAR)*pfh+sizeof(IMAGE_FILE_HEADER));
if ((*poh)->Magic!=IMAGE_NT_OPTIONAL_HDR32_MAGIC)
return FALSE;

*psh=(PIMAGE_SECTION_HEADER)((PCHAR)*poh+sizeof(IMAGE_OPTIONAL_HEADER) );
return TRUE;
}

int GetTotalImageSize(PIMAGE_DOS_HEADER pdh, PIMAGE_FILE_HEADER pfh, PIMAGE_OPTIONAL_HEADER poh, PIMAGE_SECTION_HEADER psh)
{
int Size=0;
int Alignment = poh->SectionAlignment;

if(poh->SizeOfHeaders % Alignment == 0)
{
Size += poh->SizeOfHeaders;
} else
{
int Mul = poh->SizeOfHeaders / Alignment;
Mul++;
Size += (Mul*Alignment);
}

unsigned int i;
for(i=0; i < pfh->NumberOfSections; i++)
{
if(psh[i].Misc.VirtualSize)
{
if(psh[i].Misc.VirtualSize % Alignment == 0)
{
Size+= psh[i].Misc.VirtualSize;
} else
{
int Mul = psh[i].Misc.VirtualSize / Alignment;
Mul++;
Size += (Mul*Alignment);
}
}
}
return Size;
}

Похожий код используется в SDTrestore.

-----
Research is my purpose





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 04 июня 2007 11:09 · Поправил: Hellspawn
· Личное сообщение · #19

asd пишет:
Это зачем? Не могу представить себе такую ситуацию. Или ты про то, что последня секция в списке может оказаться не последней по размещению в памяти?


много чего может быть, поверь мне на слово...

Error_Log - вот корректный код, могу на дельфи для кучи кинуть

-----
[nice coder and reverser]




Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 04 июня 2007 11:41
· Личное сообщение · #20

Hellspawn
Неа, не поверю. За 2 года ниразу не натыкался на файл, для которого это не работало бы.



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 04 июня 2007 12:19
· Личное сообщение · #21

Error_Log
*psh=(PIMAGE_SECTION_HEADER)((PCHAR)*poh+sizeof(IMAGE_OPTIONAL_HEADER) );

Так делать не стоит. Заголовки секций не обязательно идут следом за OptionalHeader.(пример - файлы пакованые винупаком 0.39, и ещё где-то видел.)
начало таблица секций = адрес начала OptionalHeader + поле SizeOfOptionalHeader которое лежит в FileHeader

if(psh[i].Misc.VirtualSize % Alignment == 0)
{
Size+= psh[i].Misc.VirtualSize;
} else
{
int Mul = psh[i].Misc.VirtualSize / Alignment;
Mul++;
Size += (Mul*Alignment);
}

тут другая проблема - если поле VirtualSize = 0, то следует брать поле SizeOfRawData и ровнять его по SectionAlignment. Могу выложить такой файлик.

И ещё я сам не пробовал, но такое вроде возможно сделать, хотя и изврат. Если между секциями дырки будут - то твой алгоритм тоже не сработает.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 04 июня 2007 14:09 · Поправил: Hellspawn
· Личное сообщение · #22

asd

у меня есть парочка, только щас найти не могу (какие-то скремблеры были, это типо защита от
дампа была) так как пока не занимаюсь анализатором...

з.ы. так что с сабжем? написал ТС антивиря?

-----
[nice coder and reverser]




Ранг: 22.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 04 июня 2007 15:30
· Личное сообщение · #23

>И ещё я сам не пробовал, но такое вроде возможно сделать, хотя и изврат.
>Если между секциями дырки будут - то твой алгоритм тоже не сработает.
а я вот попробовал. масм32 + ручки. результат в аттаче.

01.exe - дыра между хидером и 1-й секцией.
02.exe - 01.exe, только SizeOfHeaders изменен так чтоб после выравнивания не было дыры.
03.exe - дыра между 1-й и 2-й секциями.

на Вин2k запускается только 02.exe.

>з.ы. так что с сабжем? написал ТС антивиря?
what is "ТС"?

0cb6_04.06.2007_CRACKLAB.rU.tgz - 1.rar



Ранг: 22.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 04 июня 2007 15:36
· Личное сообщение · #24

ЗЫ лечилка для сабжа пишется за пол часа, или час максимум(это если с ПЕ умно работать).



Ранг: 50.2 (постоянный)
Активность: 0.010
Статус: Участник

Создано: 04 июня 2007 16:37
· Личное сообщение · #25

WolfHunter пишет:
what is "ТС"?

AFAIK, Topic Starter



Ранг: 22.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 05 июня 2007 00:52
· Личное сообщение · #26

Написал, но только на половину: никак с секциями не могу разобратся, чото не прёт удаление.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 05 июня 2007 14:33
· Личное сообщение · #27

AnXIouS пишет:
Написал, но только на половину: никак с секциями не могу разобратся, чото не прёт удаление.


уменьшаешь кол-во секицй в заголовке на 1, трёшь заголовок секции (40 байт), пересчитываешь
sizeofimage, и сохраняешь всё это дело в новый файл, но без посл, секции... наверное как-то так...

-----
[nice coder and reverser]




Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 05 июня 2007 15:13
· Личное сообщение · #28

или лучьше просто OEP найди и поставь в заголовок, если конечно вир что-нибудь наподобии UEP не использует - тогда ищи переход на вирус и анализируй, как он старые байты востанавливает.



Ранг: 22.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 06 июня 2007 00:16
· Личное сообщение · #29

С удалением секций более-менее разобрался, завтра должен дописать. Но ещо несколько вопросов: чо за фрукт - боундимпорт; и какой использовать вид доступа к файлу, какой лучше - паскалевский, маппинга или файлстрин.



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 06 июня 2007 05:15
· Личное сообщение · #30

AnXIouS пишет:
боундимпорт

Это один из видов импорта. Почитать можно, к примеру в одной из статей(2 вроде) из цикла "От зелёного к красному" - есть на васме. Лучше не мучайчся, а просто сотри указатель на него.


. 1 . 2 . >>
 eXeL@B —› Программирование —› Нужна помощь в борьбе с виром
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати