ПРЕДИСЛОВИЕ:
Бывает такое, что по какой либо причине вы забыли пароль от ICQ, но он остался
сохраненным в JIMM и тогда появляется необходимость выдрать его от туда, но увы
это оказывается очень тяжело. При условии что, пароль нельзя скопировать из
поля ввода и он закрыт звездочками.
Всё что тут будет описано, касается платформы MIDP-2.0 (на других не проверял)
ПРИЧИНА НАПИСАНИЯ СТАТЬИ:
Как-то раз решил сменить пароль от своего шестизнака, но как выяснилось – я
забыл старый пароль. Зато он был сохранен в QIP Infium и JIMM. Все попытки
восстановления через мыло не удались (возможно потому, что номер был инвизом).
При этом Infium был настроен на использование SSL и по этому отснифать не
получилось, а при попытке настроить через обычный коннект, Infium вообще стер
пароль и затребовал его сново.
Готовых реализаций и статей в инете я не нашел.
В виду того, что это был шестизнак, как-то не хотелось использовать публичные
ICQ снифферы, а ставить свой – не было возможности.
Вот и пришлось разбираться с JIMM.
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ:
В платформе MIDP-2.0 данные JAVA приложений хранятся в RMS (Record Management
System). В зависимости от модели телефона RMS в файловой системе может
представлять из себя разного рода файлы. default_rms_*.db или *.rms итд.
Другими словами присутствуют буквы rms. Эти файлы чаще всего находятся в папке
с JAVA приложениями. Это было описано, как всё организовано со стороны
телефона.
Теперь разберемся с JIMM. Для этого понадобились исходники. Архив с исходниками
нам дал следующее:
Прочитав CHANGES выяснилось:
VERSION 0.1 BETA-4 - Password is now encrypted saved (trivial algorithm)
VERSION 0.4.0 - Password is saved in UTF-8 format now
Другими словами теперь мы знаем, что пароль шифрован (простым алгоритмом). А
также то, что все русские символы кодированы в UTF-8
Далее покопавшись в исходниках, была найдена в модуле Util.java следующая
функция:
Код:
public static final byte[] PASSENC_KEY =
explodeToBytes(
Как видно из кода эта функция шифрует / расшифровывает пароль через XOR с
использованием таблицы PASSENC_KEY. Вот мы уже знаем алгоритм по которому в
дальнейшем будет расшифровывать пароль.
Теперь алгоритм наших действий должен быть примерно таков:
1) Запускаем JIMM
2) Добавляем в начало пароля определенные символы, сохраняем и закрываем JIMM
3) Подключаем телефон к компу и скачиваем rms файл
4) Ищем определенную последовательность байт
5) Дешифруем пароль и при необходимости переводим его из UTF-8 в ANSI
ПРАКТИЧЕСКАЯ ЧАСТЬ:
Из дополнительных инструментов нам понадобятся следующие:
- WinHEX или любой другой HEX редактор
- Delphi( для дешифрования пароля)
ШАГ 1
Открываем Delphi. На форму кидаем 2 edit и 2 button
Edit1 – поле ввода
Edit2 – поле вывода
Button1 – будет расшифровывать пароль
Button2 – будет шифровать введенные данные
Код программы:
Код:
const
PASSENC_KEY:array[0..15] of byte = // таблица
для шифрования / дешифрования
function decipherPassword(buf:string):string; // функциядлярасшифрования
var
ret:string;
i:integer;
begin
ret := '';
for i := 0 to
length(buf) - 1 do
ret := ret +
chr(ord(buf[i+1]) xor PASSENC_KEY[i mod 16]);
result := ret;
end;
// Шифрует
procedure TForm1.Button1Click(Sender: TObject);
var
HEXDATA:string;
DATA:string;
i:integer;
begin
HEXDATA :=
edit1.Text;
DATA := '';
for i := 1 to
length(HEXDATA) div 2 do
DATA := DATA +
chr(strtoint('$'+copy(HEXDATA,(i*2)-1, 2)));
edit2.Text := UTF8ToAnsi(decipherPassword(DATA));
end;
// Расшифровывает
procedure TForm1.Button2Click(Sender: TObject);
var
HEXDATA:string;
DATA:string;
i:integer;
begin
DATA :=
decipherPassword (edit1.Text);
HEXDATA := '';
for i := 1 to
length(DATA) do
HEXDATA :=
HEXDATA + inttohex(ord(DATA[i]),2);
edit2.Text := HEXDATA;
end;
ШАГ 2
Запускаем JIMM. Заходим в настройки аккаунта. В начало уже существующего пароля
добавляем 3 цифры – 123(какие именно – роли не играет). Сохраняем настройки и
выходим из JIMMa.
ШАГ 3
Подключаем телефон к компьютеру и копируем все файлы, связанные с rms. В моём
случае(телефон MOTOROLA) я воспользовался P2KTools и скопировал все файлы
C \ kjava \ *.rms. На других телефонах могут быть другие имена файлов.
Далее просмотрев каждый из файлов неоходимо найти именно тот, который нам
нужен. Делаем это через простой поиск ICQ номера, который вбит в настройках. У
меня это оказался j2me9.rms
ШАГ 4
Запускаем скомпилированную программку. В Edit1 вписываем 123 и нажимаем button2
для шифрования этого текста. В поле Edit2 мы получим текст: C214B2 – это как
раз и будет сигнатура для поиска пароля в файле.
ШАГ 5
Открываем найденный файл в WinHEX и ищем наши HEX данные
Поиск -> Поиск HEX-данных (Ctrl + Alt + F) в открывшееся окно вписываем C214B2
и нажимаем OK для поиска. При желании F3 – для продолжения поиска.
Найденные данные должны быть следующего формата
E4 00 N C2 14 B2 XX XX XX XX XX XX 24
N – длинна пароля с учетом того что он перекодирован в UTF-8. ВНИМАНИЕ: N – это шестнадцатеричное значение, так что не
ошибитесь при копировании нужного кол-ва байт.
При этом на счет чисел E4 и 24 я сомневаюсь, т.е. может это просто совпадение.
При этом E4 и 24 – для первого UIN’a, а E5 и 25 – это для второго UIN’a. Так
что не обещаю что у вас они будут.
У меня в нескольких копиях аськи именно эти числа были постоянно.
Если не нашли нужное место, то жмем F3 для продолжения поиска.
Когда необходимый блок данных будет найден, выполним следующие действия:
1) выделим N байт начиная с символов C2 14 B2
2) Правка - > Copy Block -> Hex – значения (CTRL + SHIFT + C). Для того
чтобы поместить в буфер обмена наши данные в HEX виде.
3) Вставляем эти данные в нашу программку в поле edit1 и нажимаем button1 для
дешифрования.
4) В поле edit2 появятся данные 123XXXXXX где XXXXXX – пароль.
Вот и всё. Мы получили пароль.
Данный метод был протестирован на Motorola L6, Motorola L7, И на RMS файлах
создаваемых эмулятором Midp2Exe. Везде удачно получилось дешифровать пароль.