Русский / Russian English / Английский

Сейчас на форуме: ==DJ==[ZLO], zds (+6 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Основной форум —› Помогите пожалуйста выдрать криптоалгоритм для The Bat! из UnPass(The Bat!)
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 4.6 (гость)
Статус: Участник

Создано: 22 июля 2009 23:34 New!
Цитата · Личное сообщение · #1

Здравствуйте. Проблема заключается в том что программа, написана на делфи, запакована юпиксом + изменена точка входа(насколько я понял). Помучившись, я её все таки распаковал, путём выдирания распакованного кода из памяти и добавлением кривой таблицы импорта(Программа QuickUnpack v2.1).
Далее возникли проблемы в отладчике(OllyDBG). Оригинальная точка входа у меня не определяется и программа при первой загрузке в отладчика останавливается на первом встречном int 3 в ntdll. Ну, поклацав F9 я попадаю в оригинальный процесс, останавливаясь тоже непонятно где(ну якобы на оригинальной точке входа, определённой QUnpack)
Ещё проблема в том, что у меня кривая таблица импорта, т.е. я не могу посмотреть полный список импортируемых ф-ций(ну чтобы забрейкпоинтить в нужном месте разумеется)
Аттачь распакованной программы прилагается, + Ссылка на оригинальную запакованную
[url= http://www.exelab.ru/download.php?action=get&n=NDkw http://www.exelab.ru/download.php?action=get&n=NDkw [/url]
Теперь вопросы по выдиранию алгоритма:
В программе я нахожу такую строку (кстати таких несколько)"+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu vwxyz" ставлю на неё бряк, выполняю программу, ввожу пароль, нажимаю «Зашифровать», бряк не срабатывает, нажимаю «Расшифровать» - бряк сработал – Нахожусь в середине цикла с кучей call’ов, имею зашифрованную строку с паролем в стеке, расшифрованного пароля ещё нет)) Хотя я не уверен что
И с этого места я пытался анализировать что происходит, но так и не допёр. Бегло транслируя через большое количество команд, можно увидеть как по кускам расшифровывается мой пароль но из-за большого количество отвлекающих джампов и каллов я теряюсь. Причём через стек в функции ничего не передаётся! Там всё через регистры и адреса стека. Каким то образом получилось забрекпоинтить прогу при запросе на расшифровку пароля – адрес «004616B1» в стеке имею пароль, и над ним загадочную строчку…
0012F1C0 009A64FC ASCII "#.(?-+"
0012F1C4 009A02B4 ASCII "qwerty"
Откуда появляется это строка разобраться не смог, но по видимому это ключ. При различных паролях он разный.
По шифру:
1. Длинна шифра меняется при различной длине пароля, но при одинаковой длине, имеется статическая часть и динамическая например:
yTzzzmAi81wh8k++ «qwerty»
yTzzzn6xD1sdCk++ «asdfgh»
yTzzznEs91YW6+++ «zxcvbn»
Если, кому не трудно, помогите распаковать программу по-человечески, или укажите адрес команды с которого начинается непосредственное шифрование/дешифрование, я уж постараюсь разобраться! В общем, за любую помощь, советы - буду благодарен.


{ Атач доступен только для участников форума } - tbup__.rar

Ранг: 4.6 (гость)
Статус: Участник

Создано: 25 июля 2009 22:43 New!
Цитата · Личное сообщение · #2

Вот алгоритм декода.
Писал на JS(!!!) так как ща не со своего компьютера и нет компилятора.. кароче мне так удобней было))
Code:
  1. pass = 'yTzzzmAi81wh8k++';
  2. function base64_decode( data,a1,a2,a3 ) {  //ф-ция декода base 64
  3.        var b64 = "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  4.     var o1, o2, o3, h1, h2, h3, h4, bits, i=0, enc='';
  5.  
  6.  do {  //начало))
  7.         h1 = b64.indexOf(data.charAt(i++));
  8.         h2 = b64.indexOf(data.charAt(i++));
  9.         h3 = b64.indexOf(data.charAt(i++));
  10.         h4 = b64.indexOf(data.charAt(i++));
  11.  
  12.         bits = h1<<18 | h2<<12 | h3<<6 | h4;
  13.  
  14.         o1 = bits>>16 & 0xff;
  15.         o2 = bits>>8 & 0xff;
  16.         o3 = bits & 0xff;
  17.  
  18.         if (h3 == 64)      enc += String.fromCharCode(o1);
  19.         else if (h4 == 64) enc += String.fromCharCode(o1, o2);
  20.         else               enc += String.fromCharCode(o1, o2, o3);
  21. while (< data.length);
  22.      return enc;
  23. }
  24. //-------------------------------------------------------------------- -------------------------------------------------------------
  25. function endDECOD (b6d){// Ф-ция окончательного декода
  26. // декодированный base64 пароль представляет собой строку:
  27. //   f9 ff ff ff 23 2e 28 3f 2d 2b (hex)
  28. //где, первые 4-е байта это neg - от длинны пароля
  29. // а остальные байты это перевёрнутый пароль ксореный с 5A
  30. //-------------------------------------------------
  31. len = 0xFF-b6d.charCodeAt(0);//Определяем длинну пароля( вычитаем из FF первый код символа)
  32. pass = b6d.substr(4,b6d.length);// Считываем ксореный пароль(первые 4-е байта не учитываю)
  33. = 0x5A;
  34. res=[];
  35. enc='';
  36. // поскольку пароль перевёрнутый, то начинаем с конца
  37. for (i=len-1;i!=-1; i--){
  38. res[i]=pass.charCodeAt(i)^b;//Ксорим
  39. enc+=String.fromCharCode(res[i]);// переводим в символьный вид
  40. }
  41. return enc;
  42. }
  43. WScript.Echo(endDECOD(base64_decode(pass)));


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


p/s
А чем тут кого троянщики не устраивают? Крекинг это тоже не совсем законное и порядочное дело.
Траянописатели - это двигатель прогресса!))))))))
<< . 1 . 2 .
 eXeL@B —› Основной форум —› Помогите пожалуйста выдрать криптоалгоритм для The Bat! из UnPass(The Bat!)

Видеокурс ВЗЛОМ