Троян против Ирана на неизвестном языке программирования

cnews.ru — Самый известный троян современности написан на неизвестном языке программирования, утверждают в «Лаборатории Касперского». По мнению экспертов, это указывает на многомиллионные инвестиции в разработку Duqu и на государственный заказ по его созданию.
Новости, Компьютеры | sputn1k 07:14 08.03.2012
56 комментариев | 81 за, 0 против |
#1 | 08:51 08.03.2012 | Кому: Всем
> Самый известный троян современности написан на неизвестном языке программирования

если язык неизвестен, то как эту программу машина обрабатывает и воспринимает?
#2 | 08:55 08.03.2012 | Кому: честный
> если язык неизвестен, то как эту программу машина обрабатывает и воспринимает?

Видимо на языке Любви: он универсален.
#3 | 09:07 08.03.2012 | Кому: честный
>> Самый известный троян современности написан на неизвестном языке программирования
>
> если язык неизвестен, то как эту программу машина обрабатывает и воспринимает?

Любой язык программирования, который компилирует, на выходе даёт исполняемые файлы и библиотеки (в случае винды это *.exe и *.dll), которые может понять любой компьютер. Анализируя эти файлы, можно примерно понять, на каком языке программирования был изначально написан код, потому что у каждого компилятора есть особенности, которые можно распознать. Тут товарищи ничего распознать не смогли, и соотв. сделали такие выводы.

З.Ы.Твое утверждение верно для языков, программы на которых представляют собой не набор машинных команд, а собственно код на этом самом языке, типа Java и JavaScript, для исполнения этих программ на компьютере должна быть установлена программа, которая понимает код языка, например Java virtual Machine.
#4 | 09:09 08.03.2012 | Кому: Utgart
> З.Ы.Твое утверждение верно для языков, программы на которых представляют собой не набор машинных команд, а собственно код на этом самом языке, типа Java и JavaScript, для исполнения этих программ на компьютере должна быть установлена программа, которая понимает код языка, например Java virtual Machine.

это не утверждение, а вопрос.
ибо я в программировании дуб дубом.

всегда казалось, что бы машина могла понимать язык программирования, у неё должен быть установлен дешифровщик или что-то в этом духе.
#5 | 09:09 08.03.2012 | Кому: Utgart
> З.Ы.Твое утверждение верно для языков, программы на которых представляют собой не набор машинных команд, а собственно код на этом самом языке, типа Java и JavaScript, для исполнения этих программ на компьютере должна быть установлена программа, которая понимает код языка, например Java virtual Machine.

Java компилирует в специальный байт-код, который уже обрабатывает JVM.
Ты, видимо, говоришь про скриптовые языки типа Perl, PHP, Python — тысячи их.
#6 | 09:11 08.03.2012 | Кому: Oshib-kun
>> З.Ы.Твое утверждение верно для языков, программы на которых представляют собой не набор машинных команд, а собственно код на этом самом языке, типа Java и JavaScript, для исполнения этих программ на компьютере должна быть установлена программа, которая понимает код языка, например Java virtual Machine.
>
> Java компилирует в специальный байт-код, который уже обрабатывает JVM.
> Ты, видимо, говоришь про скриптовые языки типа Perl, PHP, Python — тысячи их.

ну идея была в этом, да. Ну плюс ещё и в том, что для того, чтобы программа начала исполнятся, нужно знать язык её исполнения и что-то дополнительно поставить на компьютер, чтобы он начал понимать язык программирования.

А так да - имел ввиду интерпретаторы,
#7 | 09:15 08.03.2012 | Кому: честный
> всегда казалось, что бы машина могла понимать язык программирования, у неё должен быть установлен дешифровщик или что-то в этом духе.

Язык программирования компилируется в машинные исполняемые коды, которые понимает процессор. Человеку они ни о чём не скажут — открой любой екзешник в блокноте.
#8 | 09:16 08.03.2012 | Кому: Utgart
> ну идея была в этом, да. Ну плюс ещё и в том, что для того, чтобы программа начала исполнятся, нужно знать язык её исполнения и что-то дополнительно поставить на компьютер, чтобы он начал понимать язык программирования.

С помощью спец. утилит можно упаковывает приложение и все его файлы данных в один exe-файл. Вместе с exe-файлом могут быть помещены необходимые для его работы (dll, dbf и т.п.). Запакованное приложение работает в точности как оригинальное, причем программисту не требуется вносить изменения в исходный код.
Для запуска таких файлов достаточно наличие Операционной системы, "понимающей" данный тип файлов.
А на каком они там языке написаны, Операционной системы - абсолютно похрену.
#9 | 09:18 08.03.2012 | Кому: Utgart
> А так да - имел ввиду интерпретаторы,

Считаю, надо пояснить что процессор не понимает скриптовые языки напрямую, просто интерпретатор переводит их в машинные коды на лету.
wb »
#10 | 09:18 08.03.2012 | Кому: Всем
Может это был непосредственно машинный код, без всяких языков и компиляторов?
#11 | 09:20 08.03.2012 | Кому: Oshib-kun
> Считаю, надо пояснить что процессор не понимает скриптовые языки напрямую, просто интерпретатор переводит их в машинные коды на лету.

Микропроцессор (давайте правильно его называть) - вообще нихрена не понимает. Большей частью, он умеет передвигать регистры и другой хренью заниматься, для обычного пользователя - совершенно неведомой.
#12 | 09:27 08.03.2012 | Кому: wb
> Может это был непосредственно машинный код, без всяких языков и компиляторов?

Тоже подумалось что на ассемблере писалось.
Что, кстати, тоже указывает на нехилые трудовые (а значит и финансовые) затраты.
Но у Касперского не дураки сидят, им видней.
#13 | 09:29 08.03.2012 | Кому: честный
>> Самый известный троян современности написан на неизвестном языке программирования
>
> если язык неизвестен, то как эту программу машина обрабатывает и воспринимает?

Машинные команды они из ноликов и единичек

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

При компиляции в машинный код, можно отследить некоторые закономерности.
#14 | 09:29 08.03.2012 | Кому: Oshib-kun
> Тоже подумалось что напрямую в ассемблер писалось.

Ассемблер и машинный код - разные вещи.

> Что, кстати, тоже указывает на нехилые трудовые (а значит и финансовые) затраты.


Настоящие кулхацкеры - и пишут всё в машинных кодах. Это не так сложно, как кажется. Здесь не финансовые затраты, а скорее кто-то из подлинных программеров старой школы, а сейчас таких почти нет.

> Но у Касперского тоже не дураки сидят, им видней.


Да, у них программисты толковые.
#15 | 09:31 08.03.2012 | Кому: wb
> Может это был непосредственно машинный код, без всяких языков и компиляторов?

Может, но очень трудоемко, и надо иметь соответствующим образом повернутые мозги.

Обычные трояны скорее всего так не пишутся.
wb »
#16 | 09:33 08.03.2012 | Кому: Oshib-kun
>> Может это был непосредственно машинный код, без всяких языков и компиляторов?
>
> Тоже подумалось что на ассемблере писалось.
> Что, кстати, тоже указывает на нехилые трудовые (а значит и финансовые) затраты.
> Но у Касперского не дураки сидят, им видней.

Компиляторы ассемблера тоже следы оставляют (машинный код, «протоассемблер» – это немного другое). А что касается сложности, то помнится в СССР тысячи людей писали программы на МК-61 - тут примерно тоже самое.
#17 | 09:33 08.03.2012 | Кому: Xenos
> Обычные трояны скорее всего так не пишутся.

Хм... а мне казалось, что как раз так и пишутся, потому как засунуть маленькую программку в любой первый попавшийся *.exe файл так, чтобы не повлияло на размер, - это проще всего в машинных кодах.
#18 | 09:34 08.03.2012 | Кому: Srg_Alex
> Ассемблер и машинный код - разные вещи.

Команды ассемблера напрямую соответствуют командам машины.
#19 | 09:36 08.03.2012 | Кому: Srg_Alex
>> Обычные трояны скорее всего так не пишутся.
>
> Хм... а мне казалось, что как раз так и пишутся, потому как засунуть маленькую программку в любой первый попавшийся *.exe файл так, чтобы не повлияло на размер, - это проще всего в машинных кодах.

Это когда было? Кто будет с нуля писать подключение к интернету?
#20 | 09:37 08.03.2012 | Кому: Xenos
> Команды ассемблера напрямую соответствуют командам машины.

И шо? Только писать в Ассемблере - это одно, а машинными кодами - совсем другое.
wb »
#21 | 09:37 08.03.2012 | Кому: Xenos
>>> Обычные трояны скорее всего так не пишутся.
>>
>> Хм... а мне казалось, что как раз так и пишутся, потому как засунуть маленькую программку в любой первый попавшийся *.exe файл так, чтобы не повлияло на размер, - это проще всего в машинных кодах.
>
> Это когда было? Кто будет с нуля писать подключение к интернету?

Если это разработка "серьезных людей", то почему нет?
#22 | 09:40 08.03.2012 | Кому: wb
>>>> Обычные трояны скорее всего так не пишутся.
>>>
>>> Хм... а мне казалось, что как раз так и пишутся, потому как засунуть маленькую программку в любой первый попавшийся *.exe файл так, чтобы не повлияло на размер, - это проще всего в машинных кодах.
>>
>> Это когда было? Кто будет с нуля писать подключение к интернету?
>
> Если это разработка "серьезных людей", то почему нет?

В статье собственно про это речь.
#23 | 09:53 08.03.2012 | Кому: wb
> Может это был непосредственно машинный код, без всяких языков и компиляторов?

Нет, потому что код определённо построен по парадигме ООП(объектно ориентированного программирования).
[censored]

Использование ООП на асcемблере("просто машинный код" на нём и пишется), удел продвинутых мазохистов, а не профессионалов.

Скорее всего, его написали на OCaml.
#24 | 10:04 08.03.2012 | Кому: Oshib-kun
>> всегда казалось, что бы машина могла понимать язык программирования, у неё должен быть установлен дешифровщик или что-то в этом духе.
>
> Язык программирования компилируется в машинные исполняемые коды, которые понимает процессор. Человеку они ни о чём не скажут — открой любой екзешник в блокноте.

а чем компилируется?

машинные исполняемые коды это нолики и единички?
#25 | 10:12 08.03.2012 | Кому: честный
> а чем компилируется?
> машинные исполняемые коды это нолики и единички?

1) Компилируется компилятором и в результате получается исполнимый файл(в случае винды *.exe).
Компиляция проходит ещё на машине программиста и спец программ на машину пользователя ставить не надо.
2) Да, машинные коды это просто набор логических Да и Нет, то есть нули и единицы. Для удобства чтения и написания, они группируются в хексы(пары шестнацитеричных цифр). Для ещё большего удобства существуют ассемблеры, в которых хексы заменяются очень примитивными командами.
#26 | 10:18 08.03.2012 | Кому: BookWorm
> 2) Да, машинные коды это просто набор логических Да и Нет, то есть нули и единицы.

Я бы не стал так упрощать.

Нули и единички это номера команд, адреса памяти, цифры, буквы.
#27 | 10:22 08.03.2012 | Кому: Всем
Можно проще наглядно :) показать: как будет выглядить простейшая задача, - вывести на дисплей "Hello, world!" на языке Ассемблера, с расшифрокой машинных кодов:

Адрес Код Метка Команда
----- -------- ----- ------------------
0100 1E push DS
0101 B4 09 mov AH,09
0103 BA 10 01 mov DX,offset @H
0106 0E push CS
0107 1F pop DS
0108 CD 21 int 21H
010A 1F pop DS
010B B8 00 4C mov AX,4C00H
010E CD 21 int 21H
0110 48 @H: db "Hello, world!$"
0111 65
0112 6C
0113 6C
0114 6F
0115 2C
0116 20
0117 77
0118 6F
0119 72
011A 6C
011B 64
011C 21
011D 24
wb »
#28 | 10:24 08.03.2012 | Кому: Xenos
>> 2) Да, машинные коды это просто набор логических Да и Нет, то есть нули и единицы.
>
> Я бы не стал так упрощать.
>
> Нули и единички это номера команд, адреса памяти, цифры, буквы.

Один и тот же код может быть как командой, так и символом – зависит от места, которое этот код занимает.
#29 | 10:41 08.03.2012 | Кому: wb
>>> 2) Да, машинные коды это просто набор логических Да и Нет, то есть нули и единицы.
>>
>> Я бы не стал так упрощать.
>>
>> Нули и единички это номера команд, адреса памяти, цифры, буквы.
>
> Один и тот же код может быть как командой, так и символом – зависит от места, которое этот код занимает.

Разумеется. Я к тому, что код не сводится к простейшему да или нет
#30 | 10:43 08.03.2012 | Кому: Srg_Alex
> mov AH,09

[Ностальгирует]
#31 | 10:47 08.03.2012 | Кому: Xenos
>> mov AH,09
>
> [Ностальгирует]

А вот тебе!!! :

0100 CF iret

(iret - возвpат из подпpогpаммы обpаботки пpеpывания)


:)
#32 | 10:48 08.03.2012 | Кому: BookWorm
> 1) Компилируется компилятором и в результате получается исполнимый файл(в случае винды *.exe).
> Компиляция проходит ещё на машине программиста и спец программ на машину пользователя ставить не надо.

а, всё, понятно.
спасибо.
wb »
#33 | 10:57 08.03.2012 | Кому: Всем
Кстати, есть замечательная флеш-игра для объяснения основных понятий программирования, и ассемблера в частности. Можно рекомендовать для школьников младших классов:[censored]
#34 | 11:28 08.03.2012 | Кому: честный
>> 1) Компилируется компилятором и в результате получается исполнимый файл(в случае винды *.exe).
>> Компиляция проходит ещё на машине программиста и спец программ на машину пользователя ставить не надо.
>
> а, всё, понятно.
> спасибо.

То, что сказал камрад BookWorm верно для многих случаев. Однако, все-же, это упрощение, например, даже сейчас в Windows 7, еще есть исполняемые файлы (.com) [привет прошлому веку]. Да и для скомпилированных программ может потребоваться некое внешнее окружение - ведь программы не работают сами-по-себе в пустоте. Их должен кто-то запустить. Затем этот кто-то должен предоставить им функции которых эти программы требуют и т.п.

Это я к тому, что есть простое и понятное обьяснение и есть куча деталей. :-)
#35 | 11:45 08.03.2012 | Кому: Srg_Alex
>> если язык неизвестен, то как эту программу машина обрабатывает и воспринимает?

> Видимо на языке Любви: он универсален.


Берём гнусь с либами, пересобираем с максимальной оптимизацией (на любой платформе).

Берём исходник виря на «си» (не «-плюс-плюс»...) и компиляем с максимальной оптимизацией этим самым gcc.

Получаем ни на что не похожий код для целевого проца и, вообще, для целевой архитектуры.

В коде -- ни одной сигнатуры, в данных -- ни единого намёка на сборку знакомыми средствами, имеем вирь -- чисто вирь. Привет криптоматематикам.
#36 | 11:46 08.03.2012 | Кому: Utgart
> потому что у каждого компилятора есть особенности, которые можно распознать.

Есть ли подтверждение твоим словам? Ссылки, плиз.
#37 | 11:49 08.03.2012 | Кому: Srg_Alex
> А на каком они там языке написаны, Операционной системы - абсолютно похрену.

ППКС. Как (в прошлом) программер -- утверждаю то же самое.
#38 | 11:53 08.03.2012 | Кому: Oshib-kun
> Тоже подумалось что на ассемблере писалось.

WATCOM C тебе ведом? :)
#39 | 11:54 08.03.2012 | Кому: Xenos
> При компиляции в машинный код, можно отследить некоторые закономерности.

WATCOM C тебе ведом?
#40 | 11:55 08.03.2012 | Кому: Srg_Alex
>> Но у Касперского тоже не дураки сидят, им видней.

> Да, у них программисты толковые.


Не заметил.
#41 | 11:57 08.03.2012 | Кому: Xenos
>> Ассемблер и машинный код - разные вещи.

> Команды ассемблера напрямую соответствуют командам машины.


Платформа DEC-PDP/11-M -- есть у тебя примеры соответствия команд языка «SUPERMAC-11» и машинных кодов?
#42 | 11:59 08.03.2012 | Кому: Antic
>> потому что у каждого компилятора есть особенности, которые можно распознать.
>
> Есть ли подтверждение твоим словам? Ссылки, плиз.

У каждого компилятора есть свой "почерк". Примеры - использование регистров, вызов функций ОС, работа со стеком и т.п.
Разумеется, речь идет только о вероятности.

[censored]
[censored]
Искусство дизассемблирования К. Касперски
#43 | 12:18 08.03.2012 | Кому: Srg_Alex
> Можно проще наглядно :) показать: как будет выглядить простейшая задача, - вывести на дисплей "Hello, world!" на языке Ассемблера, с расшифрокой машинных кодов:

> Адрес Код Метка Команда

> ----- -------- ----- ------------------
> 0100 1E push DS
> 0101 B4 09 mov AH,09
> 0103 BA 10 01 mov DX,offset @H
> 0106 0E push CS
> 0107 1F pop DS
> 0108 CD 21 int 21H
> 010A 1F pop DS
> 010B B8 00 4C mov AX,4C00H
> 010E CD 21 int 21H
> 0110 48 @H: db "Hello, world!$"
> 0111 65
> 0112 6C
> 0113 6C
> 0114 6F
> 0115 2C
> 0116 20
> 0117 77
> 0118 6F
> 0119 72
> 011A 6C
> 011B 64
> 011C 21
> 011D 24

.code
ORG 100h
PUSH CS
POP DS ; хотя это только для наглядности, в реале x86 эти действия выполняет слишком долго (от 4 до 6 тактов), есть хакерская комбинация дублирования CS в DS за 2 такта, но я вам про неё не скажу :)))

MOV AH, 09h
MOV DX, offset @Msg
INT 21h

MOV AX, 4C00h
INT 21h

.data
@Msg: DB "HELL'o world!", 13, 10, "$"


Да, действительно, вывод на экран 13 значащих символов занимает 20h байтов на диске и примерно 200h байтов в «нижней» DOS-памяти (а меньше, собственно, и никак -- память выделяется «параграфами»).

Когда я в позднесоветские годы работал программером в НИИ, у нас было соревнование: кто напишет наикратчайшую (в смысле размеров .COM-файла) программу, совершающую полезные действия. Я в 16 байтов уложил перемигивание лампочек на клавиатуре. Код не помню, т.к. оно писалось в отладчике, сразу в командах, и исходника у этой проги НЕТ... :)))
#44 | 12:20 08.03.2012 | Кому: vick
>>> потому что у каждого компилятора есть особенности, которые можно распознать.

>> Есть ли подтверждение твоим словам? Ссылки, плиз.


> У каждого компилятора есть свой "почерк". Примеры - использование регистров, вызов функций ОС, работа со стеком и т.п.


Ты писал компиляторы?

> Разумеется, речь идет только о вероятности.


Разумеется.

>[censored]

>[censored]
> Искусство дизассемблирования К. Касперски

Понятно. Сигнатуры -- они и в Африке сигнатуры.

WATCOM C тебе знаком?
#45 | 12:25 08.03.2012 | Кому: Srg_Alex
> 0100 CF iret

Эта команда снимает со стека сразу 4 байта. Поскольку при запуске .COM-файла на стеке ничего не лежит, снятие 4-х байтов (SS:SP--, SP--, SP--, SP--) приводит к рандомному long JMP'у, то есть, это просто «бросок в никуда».

Результат непредсказуем.

UPD: Сцуко, а на стеке лежит short-адрес возврата в ОСь, оказывается... Забыл я... Так что сработает. Мля... :( :)))
#46 | 12:49 08.03.2012 | Кому: Antic
>> Да, у них программисты толковые.
> Не заметил.

Ну, в своё время, мне программеры говорили, что у них толковая команда. Вот вспомнил их мнение. Но как ты сам понимаешь, - предмет вопроса не мой, потому за что купил, за то и продаю.

>Эта команда снимает со стека сразу 4 байта. Поскольку при запуске .COM-файла на стеке ничего не лежит, снятие 4-х байтов (SS:SP—, SP—, SP—, SP—) приводит к рандомному long JMP'у, то есть, это просто «бросок в никуда».


Этой командой я камрада Xenos'а, попытался выдернуть из ностальгии в реальную жизнь. :)
#47 | 13:02 08.03.2012 | Кому: Antic
>>>> потому что у каждого компилятора есть особенности, которые можно распознать.
>
>>> Есть ли подтверждение твоим словам? Ссылки, плиз.
>
>> У каждого компилятора есть свой "почерк". Примеры - использование регистров, вызов функций ОС, работа со стеком и т.п.
>
> Ты писал компиляторы?

А ты ? Очевидно, чтобы обладать подобными знаниями непременно надо писать компиляторы. Про отладку без символов, месье не слышал.

>> Разумеется, речь идет только о вероятности.

>
> Разумеется.
>
>>[censored]
>>[censored]
>> Искусство дизассемблирования К. Касперски
>
> Понятно. Сигнатуры -- они и в Африке сигнатуры.

> WATCOM C тебе знаком?


Ты это у всех спрашиваешь ?
#48 | 15:31 08.03.2012 | Кому: Antic
>>> Но у Касперского тоже не дураки сидят, им видней.
>
>> Да, у них программисты толковые.
>
> Не заметил.

WATCOM C им не ведом!
#49 | 15:49 08.03.2012 | Кому: Srg_Alex
> 010E CD 21 int 21H

[умничает]
Это ты высокий уровень применяешь. А можно через БИОС, но лучше конечно сразу через порты.
#50 | 18:51 08.03.2012 | Кому: Всем
> Мда. Программа, написанная на ассемблере - уже никому не понятна (с) мой знакомый програмист.

Каждый август в Питере проходит Chaos Constructions.
Когда-то я не пропускал данных мероприятий: там были номинации 4к и 64к (демки, которые не должны превышать объёмом 4 000 байт и 64 000 соответственно).
Вотт что делали когда-то на ассемблере:
[censored]
[censored]
[censored]

Сейчас пишут на С, Visual C, и прочих высокоуровневых языках.
Войдите или зарегистрируйтесь чтобы писать комментарии.