Привет, ты наверняка уже наслышан о недавно появившемся вирусе Piggy. Если не в курсе, буду краток: он использует принцип спама по цепочке.
Вот тебе приходит ссылка от человека, мол, flash игра прикольная. Ты пишешь, мол, ага, знаем, спам. И тебе в ответ: нет, мол, не спам, ага. Качаешь, так как немного пьян, и с твоим номером происходит то же самое: пароль меняется, а эта программа висит некоторое время как icq-бот и предлагает твоим друзьям, которые в контакт-листе, скачать себя. Реагирует на слова «бот», «спам» и прочие по-разному, отвечает, даже меняет статус на «печатает…». Некоторые индивиды окрестили этот вирус как вирус с «искуственным интеллектом», так как сейчас такое — большая редкость.
Думаю, со временем такие боты-болтуны захватят этот мир.

Ну что, если такое случилось, то есть возможность вернуть пароль. Автор программы, видимо, ставил эксперимент :) На хабре появилось сообщение о том, как вернуть пароль: piggy меняет также информацию о пользователе, там теперь можно найти 80 цифр в двоичной системе — 0 или 1.
Например, 01011001100101101010010110100001001100000101101000010110110001011011000101101000 это 57606886. Можно не пытаться переводить в десятичную систему, там просто шифр.
Вот статья — link

А вот шифр, который уже разлетелся по интернетам:

0100110010: 1
0101100000: 2
0101100010: 3
0101100100: 4
0101100110: 5
0101101000: 6
0101101010: 7
0101101100: 8
0101101110: 9
0100110000: 0

Символы идут подряд, без пробелов.

Итак, суть сегодняшнего поста.

Функция copy
Призвана получить часть строки из целой. Синтаксис:

function Copy(S; Index, Count: Integer): string;

S — строка или массив, а в нашем случае строка. Index — с какого символа брать кусок (первый символ это первый символ, а не нулевой), Count это, очевидно, количество.
Это конец теории, далее только код и ссылки на скачку.

Введём массив значений

const
  csymbs:array[0..9] of string=('0100110000', '0100110010',
                                '0101100000', '0101100010',
                                '0101100100', '0101100110',
                                '0101101000', '0101101010',
                                '0101101100', '0101101110' );

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

Теперь получим по шифру его значение. Сначала для одного символа.

function checksymbol(c: string): string;
var
  i:integer;
begin
  result:='n'; // на случай чего-то не того
  for i:=0 to 9 do
    if csymbs[i]=c then Result:=IntToStr(i);
end;

Очевидно, мы передадим нашей функции строки из восьми символов.

А теперь общую функцию
Простой цикл, плюс функция copy.

function decode(c: string):string;
var
  i:integer;
begin
  for i:=0 to 7 do
    result:=result+checksymbol(copy(c, i*10+1, 10));
end;

Само приложение я сделал консольным, использовал модули windows, sysutils и clipbrd. Хоть и консольное, но получилось 368Кб.
Как оно работает: копируем в буфер обмена шифр, запускаем программу и получаем результат.

Скачать парсер пароля :)
Скачать исходник

(c) crystalbit, http://parsers.info

Теперь немного ссылок:

  • статья по теме на блоге программиста — link
    В этой статье я нашел картинку:
    piggy :)
    По ней можно видеть действие вируса.

  • и, в качестве постового, я хочу, чтобы ты обратил внимание на блог зелёного кактуса, где он выкладывает вкусности интернета.