Вверх ↑
Этот топик читают: Гость
Ответов: 157
Рейтинг: 1
#1: 2012-04-21 21:50:48 ЛС | профиль | цитата
У знакомого один вирус испортил много фотографий на компьютере, поиск в поисковике привел на форум касперского где один хороший человек выложил скрипт на питоне который расшифровывает фотографии, но проблема в том что сам скрипт при запуске выдает ошибку, помогите понят в чем проблема в скрипте или же может кто поймет логику вируса есть сам зловред + фотографии с исходниками.
Ниже выкладываю две фотографии и скрипт который должен работать но не работает, для запуска нужен питон 2.7

http://rghost.ru/private/37699950/e310ebbd5b1ff64b17feb5a350dd1b3b

code_27728.txt
карма: 0

0
файлы: 1code_27728.txt [1KB] [107]
Ответов: 5446
Рейтинг: 323
#2: 2012-04-21 22:33:59 ЛС | профиль | цитата
Мартынов, у меня скрипт пишет "warning, secret data is broken" - это значит что исходный файл - не полный. Алгоритм работы:

1. Найти смещение ind строки "0XFF 0XD9", если не найдено (либо находится в конце файла) - выдать сообщение "secret data not found"
2. "Перемещённые" данные (meta) начинаются со смещение ind+2 (т.е. по сути - после этой строки)
3. Длина непрерывного блока данных size - один байт, лежит в конце файла
4. Найти смещение ind2, по которому лежит байт "0x14", если такого нет - выдать сообщение "warning, secret data is broken"
5а. Если байт 0x14 не был найден, то meta - это весь зашифрованный блок, а poses - это последовательность (0, size, size*2, ..., длина meta - 1)
5b. Если байт 0x14 был найден, то зашифрованный блок делится смещением ind2 на две части - meta (от начала блока до ind2) и poses (от ind2 до предпоследнего байта).
6. meta декодируется просто - два раза применить пробразование Hex->Int (т.е. перевести строку из двух букв - запись числа в шестнадцатеричной системе в десятичное число)
7. (если байт 0x14 был найден) poses декодируется чуть сложнее: из каждых 9 байт берётся 3 и 4, и интерпретируются как беззнаковое целое, записанное в формате "big-endian" (т.е. сначала идёт старший байт, затем младший), остальные байты отбрасываются
8. Проводится восстановление исходного файла: по каждому из смещений pos в массиве poses пишется очередной "кусок" из meta размером size, замещая исходные данные

------------ Дoбавленo в 22.33:
Да, если раскомментировать все строки в файле, то пишет "Odd-length string" - значит блок meta был нечётной длины.
карма: 1

1
Голосовали:Мартынов
Ответов: 1841
Рейтинг: 369
#3: 2012-04-21 22:59:25 ЛС | профиль | цитата
"Расшифровка" именно "зараженных" изображений jpg формата на бинарном уровне
см. ниже
------------ Дoбавленo в 22.50:
При создании схемы, в исходник питона не смотрел, просто сравнил 2 файла которые были в архиве и на основе полученной информации была составлена схема.
------------ Дoбавленo в 22.52:
У мультика забыл установить Mode: OnlyOnce
------------ Дoбавленo в 22.59:
Обновлённый вариант с исправленным Mode: OnlyOnce.

Add(MainForm,2953706,21,105)
{
Width=403
Height=189
Caption="Расшифровка изображений:)"
BorderStyle=4
Position=1
}
Add(MultiElementEx,14483189,147,106)
{
@Hint=#19:Расшифровка фоток;)|
Mode=2
AddHint(-59,-36,126,13,@Hint)
}
BEGIN_SDK
Add(EditMultiEx,5704605,21,21)
{
WorkCount=#8:doEvent1|
Width=650
Height=242
link(doEvent1,16522406:doEvent1,[(35,27)(35,55)])
}
Add(FileStream,2466467,346,49)
{
Mode=2
}
Add(Hub,16522406,49,49)
{
link(onEvent1,2466467:doOpen,[])
link(onEvent2,15301168:doFor,[(77,62)(77,125)])
}
Add(DataToFile,2840155,346,119)
{
Point(doPosition)
Point(Position)
link(onGet,15934323:doOperation,[])
link(Stream,2466467:Stream,[])
}
Add(For,15301168,91,119)
{
End=4
link(onEvent,13356560:doEvent1,[])
link(onStop,11596747:doCompare,[(133,132)(133,180)])
}
Add(Hub,13356560,146,119)
{
link(onEvent1,10240284:doWork,[])
link(onEvent2,3295143:doWork,[(167,132)(167,140)])
}
Add(Math,15934323,396,119)
{
link(Op1,12945769:Var1,[(402,105)(388,105)(388,163)])
}
Add(If_else,11596747,396,174)
{
Op2=Integer(392)
link(onTrue,4291106:doEnum,[])
link(Op1,12945769:Var2,[])
}
Add(GetDataEx,12945769,396,158)
{
link(Data,15934323:Result,[])
}
Add(IntegerArray,12432930,441,130)
{
IntArray=['0'=255,'0'=216,'0'=255,'0'=225,'0'=19]
}
Add(ArrayEnum,4291106,441,174)
{
link(onItem,11189386:doEvent1,[])
link(onEndEnum,14820800:In,[(478,187)(478,201)])
link(Array,12432930:Array,[])
}
Add(DoData,6982857,543,174)
{
link(onEventData,16420726:doWork,[])
link(Data,4291106:Index,[(549,162)(648,162)(648,236)(454,236)])
}
Add(Hub,11189386,490,174)
{
link(onEvent1,6982857:doData,[])
link(onEvent2,10545475:doWork,[(531,187)(531,215)])
}
Add(LineBreakEx,8136259,269,126)
{
Caption="GetByte"
Type=1
link(OnEvent,2840155:doGet,[])
}
Add(LineBreakEx,7040423,273,141)
{
Caption="SetPos"
Type=1
link(OnEvent,2840155:doPosition,[(337,147)(337,139)])
}
Add(LineBreakEx,11400302,270,111)
{
Caption="SetByte"
Type=1
link(OnEvent,2840155:doPut,[(337,117)(337,125)])
}
Add(LineBreakEx,16420726,590,174)
{
Caption="SetPos"
}
Add(LineBreakEx,10240284,175,119)
{
Caption="SetPos"
}
Add(LineBreakEx,3295143,174,134)
{
Caption="GetByte"
}
Add(LineBreakEx,10545475,542,209)
{
Caption="SetByte"
}
Add(LineBreak,13404792,299,56)
{
Caption="End"
link(Out,2466467:doClose,[])
Primary=[14820800,193,139]
}
END_SDK
Add(DropFile,9191979,96,106)
{
link(onDropFile,14483189:doEvent1,[])
}
Add(Label,8251437,21,63)
{
Left=40
Top=70
Width=322
Height=20
Font=[Arial,10,0,0,0]
Caption="Перетащите в это окно, зашифрованные фотографии"
}
карма: 1
0
Ответов: 157
Рейтинг: 1
#4: 2012-04-21 23:19:43 ЛС | профиль | цитата
iarspider, спасибо за развернутый ответ у меня голова закипела
CriDos, интересная схема и она работает ... но только на этой фотографии пожалуйста опиши логику которой ты мотивировался при написании своей схемы(чем сравнивал файлы?) откуда ты взял эти числа в массиве ? 255 216 19 ?
Если сравнить файлы и удалить все что не совпадает в оригинальном файле, фотография просматривается но она имеет некоторые дефекты, я так понял этот исходник питона не подходит под данную реализацию вируса...

------------ Дoбавленo в 23.19:
Походу ты возвращаешь хедэр в начальное положение ....
карма: 0

0
Ответов: 1841
Рейтинг: 369
#5: 2012-04-21 23:43:49 ЛС | профиль | цитата
Мартынов, заменяю первые 5 вирусных байтов, на положенные по формату JPG...
Как-то так
------------ Дoбавленo в 23.37:
А массив с INT представлением байтов и сложение лишь для ускорения процесса и корректности замены
Можно например вообще заменить текст R2d8h на яШяб и всё, изображение рабочее

p.s. Сравнивал WinHex'ом.
------------ Дoбавленo в 23.43:
Хотя нет, в данном случае просто заменить как текст, не получится.
карма: 1
0
Ответов: 157
Рейтинг: 1
#6: 2012-04-21 23:56:04 ЛС | профиль | цитата
iarspider, у тебя скрипт запустился? у меня выдает ошибку Applibencodingshex_codec.py42 exceptions.TypeError: Odd-length string
карма: 0

0
Ответов: 5446
Рейтинг: 323
#7: 2012-04-22 01:03:50 ЛС | профиль | цитата
Мартынов, я же написал - либо раскодировщик "не той системы", либо зашифрованный файл не полный
карма: 1

0
7
Сообщение
...
Прикрепленные файлы
(файлы не залиты)