Алгоритм шифрования паролей в CuteFTP 5.0 XP
Однажды полетел у меня винт. И файлы с паролями к сайтам и ФТПшниками повредились, а набирать это вручную не хотелось. Покопался я в своих бесчисленных программах – залез в папку CuteFTP 5.0 и увидал там неприметные файлы sm.dat и sm.bak – они были одинаковы и в них открытым текстом были написаны имена моих ФТП акаунтов с узернамами и адресами! Вот и чудо, я спасён. Ноони оказались, как показала практика XOR ом =).
В формате примерно таком:
===
Tred_________ _ _ _ 192.168.0.1_kas_эээ _ _ яяяяяяяяяяяя_ _ _ _ _ Ъ”э?°э?
===
Где явно можно различить что:192.168.0.1 – адрес kas – имя “эээ” – пароль интересно зашифрованный (:).
Ну ясно меня пробило написать расшифровщик и я придумал создать новый акаунт с паролем из всех возможных 256 символов.Тем более длина пароля и шифрованного слова совпадали.
И сделал. На мое удивление, я увидел зашифрованную строку из каракулей букв и цифр.
Но на этом страдание не кончилось я взял то, что получил и поменял старый пароль на строку каракулей и с ужасом увидел в файлике свой пароль.
Ну, естесно, я собрал все коды и их переводы в один файл (список приведен ниже). И начал устанавливать разницу между кодами шифрованного пароля – увидел, что все отличаются на 4 разных числа (200 184 72 56).
Ну а коль делать было нечего я собрал все коды рассортировал, начал устанавливать зависимость и заметил, что шифрованные коды идут не равномерно (а я уж обрадовался), коды чередуются в странном порядке по 8 кодов.
Очень интересно перекодировки чередуются по 8 кодов в 32 разных группах, ниже приведены таблицы.
До 16 группы идет чередованное сложение с числом, а после 16 симметричное вычитание по столько же значений, но в обратном порядке. Я долго-придолго думал, как же они реализовали такую тему в одну формулу, и решил, что одной формулой там и не пахнет. Так как хоть 2 оператора IF там должно было присутствовать.
Тем более никакой разницы никто и никогда не почует. Алгоритм мне показался весьма интересным, и расшифровать его было очень интересно так как это мой первый расшифрованный алгоритм. :) Могу также сказать что удивило меня в алгоритме так это то что если код символа шифруется из 1 в 201, то тоже самое можно сказать и о шифровке из 201 в 1. Так что расшифровать пароль не составляет труда и нет никаких формул и муторных дешифраторов!
ТОесть эта формула одновременно шифрует и дешифрует. Потом я приметил, что, и разница кодов на определенное число тоже чередуется! И я решил написать себе памятку вот она внизу. И до меня дошло, как они шифровали пароли: До 127 шло вычитание, а после – шло сложение тех же самых чисел в обратном прядке.
Но при программном дешифровании были проблемы с проверкой, поэтому это я реализовал не в консоли, а через WinAPI, так как CuteFTP 5.0 не консольное приложение ;).
Вобщем эти цифры (если кто не понял) – это ASCII коды символов а через дефис написаны их шифрованые/дешифрованные коллеги! Чтобы перекодировать нужно переводить, но я этот процесс малость запрограммировал исходик вы можете откопать далее.
Перечислены операции дешифровки для различных групп:
–[1]– 0-200 1-201 2-202 3-203 4-204 5-205 6-206 7-207 |
–[2]– 8-192 9-193 10-194 11-195 12-196 13-197 14-198 15-199 |
–[4]– 24-208 25-209 26-210 27-211 28-212 29-213 30-214 31-215 |
–[3]– 16-216 17-217 18-218 19-219 20-220 21-221 22-222 23-223 |
–[5]– 32-232 33-233 34-234 35-235 36-236 37-237 38-238 39-239 |
–[6]– 40-224 41-225 42-226 43-227 44-228 45-229 46-230 47-231 |
–[7]– 48-248 49-249 50-250 51-251 52-252 53-253 54-254 55-255 |
–[8]– 56-240 57-241 58-242 59-243 60-244 61-245 62-246 63-247 |
–[9]– 64-136 65-137 66-138 67-139 68-140 69-141 70-142 71-143 |
–[10]– 72-128 73-129 74-130 75-131 76-132 77-133 78-134 79-135 |
–[11]– 80-152 81-153 82-154 83-155 84-156 85-157 86-158 87-159 |
–[12]– 88-144 89-145 90-146 91-147 92-148 93-149 94-150 95-151 |
–[13]– 96-168 97-169 98-170 99-171 100-172 101-173 102-174 103-175 |
–[14]– 104-160 105-161 106-162 107-163 108-164 109-165 110-166 111-167 |
–[15]– 112-184 113-185 114-186 115-187 116-188 117-189 118-190 119-191 |
–[16]– 120-176 121-177 122-178 123-179 124-180 125-181 126-182 127-183 |
–[17]– 128-72 129-73 130-74 131-75 132-76 133-77 134-78 135-79 |
–[18]– 136-64 137-65 138-66 139-67 140-68 141-69 142-70 143-71 |
–[19]– 144-88 145-89 146-90 147-91 148-92 149-93 150-94 151-95 |
–[20]– 152-80 153-81 154-82 155-83 156-84 157-85 158-86 159-87 |
–[21]– 160-104 161-105 162-106 163-107 164-108 165-109 166-110 167-111 |
–[22]– 168-96 169-97 170-98 171-99 172-100 173-101 174-102 175-103 |
–[23]– 176-120 177-121 178-122 179-123 180-124 181-125 182-126 183-127 |
–[24]– 184-112 185-113 186-114 187-115 188-116 189-117 190-118 191-119 |
–[25]– 192-8 193-9 194-10 195-11 196-12 197-13 198-14 199-15 |
–[26]– 200-0 201-1 202-2 203-3 204-4 205-5 206-6 207-7 |
–[27]– 208-24 209-25 210-26 211-27 212-28 213-29 214-30 215-31 |
–[28]- – 216-16 217-17 218-18 219-19 220-20 221-21 222-22 223-23 |
–[29]– 224-40 225-41 226-42 227-43 228-44 229-45 230-46 231-47 |
–[30]– 232-32 233-33 234-34 235-35 236-36 237-37 238-38 239-39 |
–[31]– 240-56 241-57 242-58 243-59 244-60 245-61 246-62 247-63 |
–[32]– 248-48 249-49 250-50 251-51 252-52 253-53 254-54 255-55 |
Теперь я приводжу вам список операций которые проводились для шифрования/дешифрования паролей в файле: Номер группы – операция.
1 +200 2 +184 3 +200 4 +184 5 +200 6 +184 7 +200 8 +184 |
9 +72 10 +56 11 +72 12 +56 13 +72 14 +56 15 +72 16 +56 |
17 -56 18 -72 19 -56 20 -72 21 -56 22 -72 23 -56 24 -72 |
25 -184 26 -200 27 -184 28 -200 29 -184 30 -200 31 -184 32 -200 |
Так вроде с цифрами закончили, ну а если вы пролистали в надежде найти готовый исхоник, то вам повезло я его не зажал. Вот он милый приведен ниже. И немного расскажу как работает этот код – Работа основана на простом многократном сравнении. Если код совпадает с нашей таблицей то выполняем соответствующую операцию и возвращаем расшифрованный код символа. Я проверял что функция не может ошибиться если передвавть в нее значения от 1 до 255, иначе функция должна вернуть NULL. Что означает ошибку.
#include “windows.h”
crypt(int s){ //Это функция получает значение кода символа и передает дешифрованный код
if(s<=127) //Проверка на половинку
{
if( (s>=0 && s<8) || (s>=16 && s<24) || (s>=32 && s<40) || (s>=48 && s<56) )
{
s+=200; //Операция
return s; //Вернем код шифров_символа
}
else //Если не подошло то катаем дальше
{
if( (s>=8 && s<16) || (s>=24 && s<32) || (s>=40 && s<48) || (s>=56 && s<64) )
{
s+=184;
return s;
}
else
{
if( (s>=64 && s<72) || (s>=80 && s<88) || (s>=96 && s<104) || (s>=56 && s<64) )
{
s+=72;
return s;
}
else
{
if( (s>=72 && s<80) || (s>=88 && s<96) || (s>=104 && s<112) || (s>=120 && s<184) )
{
s+=56;
return s;
}
} } } }
else
{
if( (s>=128 && s<136) || (s>=144 && s<152) || (s>=160 && s<168) || (s>=176 && s<184) )
{
s-=56;
return s;
}
else
{
if( (s>=136 && s<144) || (s>=152 && s<160) || (s>=168 && s<176) || (s>=184 && s<192) )
{
s-=72;
return s;
}
else
{
if( (s>=192 && s<200) || (s>=208 && s<216) || (s>=224 && s<232) || (s>=240 && s<248) )
{
s-=184;
return s;
}
else
{
if( (s>=200 && s<208) || (s>=216 && s<224) || (s>=232 && s<240) || (s>=248 && s<256) )
{
s-=200;
return s;
} } } } }
return 0;
}
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
int number = crypt(236); //Код символа который нужно шифровать/дешифровать
char *string; //Переменные
string = new char [10];
itoa(number,string,10); //Превратим зашифрованный код в строкуMessageBox(0,string,”Это код символа из пароля зашифрованного CuteFtp 5.0 xp”,0);
return 0;
}
Автор не несет никакой ответственности за то, что могут сделать с этим кодом другие люди. Пусть они хоть их в троянцы вставляют. Эта статья приведена строго в ознакомительных целях для того чтобы показать авторам программы, что даже новичок расшифровал достаточно сложный алгоритм. На других компьютерах и ОС алгоритм не проверялся и это значит, что я не отвечаю за то, как поведет себя программа с другими версиями ОС и CuteFTP. А если вы используете мою статью то ссылка на автора обязательна, рассчитываю на ваше самоуважение.