Эта статья будет про режим /mode +x в Ирц.. И про то, как же его можно расшифровать? Потому как всегда легче и приятней знать IP собеседника. Мало ли кто там - на другом конце провода? Начнем! Для начала я взяла и посмотрела исходники irсd (Rusnet). Для Каждой сети свой метод. Ну чтож - у нас народ пользуется Руснетом. про него и напишем.. Вот они: Code: if (!IsRusnetServices(sptr)) { /* ** false data for usermode +x. After really long discussion ** it's been concluded to false last three octets of IP ** address and first two parts of hostname to provide ** the reasonable compromise between security and ** channels ban lists. Host.domain.tld is mapped to ** crc32(host.domain.tld).crc32(domain.tld).domain.tld ** and domain.tld to crc32(domain.tld).crc32(tld).domain.tld ** respectively --erra ** ** some modification there: eggdrop masking compatibility ** with the same hide availability ** Let's say crcsum() is crc32 of complete hostname. Then: ** a12.b34.sub.host.domain.tld -> crcsum().crc32(sub.host.domain.tld).host.domain.tld ** a12-b34.sub.host.domain.tld -> crcsum().crc32(sub.host.domain.tld).host.domain.tld ** comp.sub.host.domain.tld -> crcsum().crc32(sub.host.domain.tld).host.domain.tld ** a12.b34.host.domain.tld -> crcsum().crc32(b34.host.domain.tld).host.domain.tld ** a12-b34.host.domain.tld -> crcsum().crc32(crcsum()).host.domain.tld ** sub.host.domain.tld -> crcsum().crc32(crcsum()).host.domain.tld ** a12.b34.domain.tld -> crcsum().crc32(b34.domain.tld).domain.tld ** a12-b34.domain.tld -> crcsum().crc32(crcsum()).domain.tld ** host.domain.tld -> crcsum().crc32(crcsum()).domain.tld ** a12.dom2usr.tld -> crcsum().crc32(crcsum()).dom2usr.tld ** domain.tld -> crcsum().crc32(crcsum()).domain.tld ** domain. -> crcsum().crc32(domain.crcsum()).domain **/ char *s = sptr->sockhost; char *c = s + strlen(s); int n = 0; while (c > s) { c--; if (*c == '.' && (++n) == 3) /* 4th dot reached */ break; else if (*c <= '9' && *c >= '0') break; } if (n) /* hostname second level or above... duh */ { int len; /* ignore digits in second-level domain part when there are no minus signs --erra */ if (c > s && n == 1) while (c > s && *c != '.') { if (*c == '-') { do c++; while (*c != '.'); break; } c--; } else /* *c cannot reach \0 - see above */ while (*c != '.') c++; s = c; while (s > sptr->sockhost && *(--s) != '.'); if (*s == '.') /* s is part for second crc32 */ s++; if (s == sptr->sockhost) /* it needs crc32(crcsum()) */ s = user->host; /* finished gathering data, let's rock */ strcpy(user->host, b64enc(gen_crc(sptr->sockhost))); strcat(user->host, "."); strcat(user->host, b64enc(gen_crc(s))); len = strlen(user->host); n = len + strlen(c) - HOSTLEN; if (n > 0) /* overrun protection */ user->host[len - n] = '\0'; strcat(user->host, c); } else if (c == s) /* are there hosts w/o dots? Yes */ { strcpy(user->host, sptr->sockhost); #if 0 /* stupid masking, really */ strcat(user->host, "."); strcpy(user->host, b64enc(gen_crc(user->host))); strcat(user->host, "."); strcat(user->host, b64enc(gen_crc(user->host))); strcat(user->host, "."); strcat(user->host, sptr->sockhost); #endif } else /* IP address.. reverse search */ { char *pfx; s = strrchr(user->host, '.'); if (!s) { ircstp->is_kill++; sendto_one(cptr, ":%s KILL %s :%s (Bad hostmask)", ME, sptr->name, ME); sptr->flags |= FLAGS_KILLED; return exit_client(NULL, sptr, &me, "Bad hostmask"); } *s = '\0'; DupString(pfx, b64enc(gen_crc(user->host))); s = strchr(user->host, '.'); /* keep 1st octet */ if (!s) { ircstp->is_kill++; sendto_one(cptr, ":%s KILL %s :%s (Bad hostmask)", ME, sptr->name, ME); sptr->flags |= FLAGS_KILLED; return exit_client(NULL, sptr, &me, "Bad hostmask"); } strcpy(++s, b64enc(gen_crc(sptr->sockhost))); strcat(user->host, "."); strcat(user->host, pfx); strcat(user->host, ".in-addr"); MyFree(pfx); } } С++! Я его, конечно же, не знаю, но все равно это дает нам стимул копать дальше! то есть из этих исходников вполне понятно, что все шифруется все Алгоритмом crc32.. crc(Cyclic Redundancy Code ) - аббревиатура расшифровывается как циклический избыточный код. Этот алгоритм полностью обратим для коротких паролей.. (до 4-х символов) и также частично обратим для всех остальных. Было доказано, что для нахождения коллизии (пароля, контрольная сумма которого будет такая же, как и у оригинального) потребуется не более 7 печатных символов. А для подбора пароля к хэшу потребуется не более минуты.. Из этого мы можем сделать вывод, что алгоритм Cyclic Redundancy Code является частично обратим, чем меньше знаков - тем легче мы можем его расшифровать, а если же как в хосте - то можно сбрутить очень быстро, так как хост шифруется частично в режиме +x! Конечно, можно пуститься в долгие рассуждения, но я постаралась найти брутеры и способы расшифровки crc32. Чем же отличается сrс от сrс32? Рассмотрим на примере "таблицы", виток каждого цикла составляет 1 байт: "простой" алгоритм(т.е. однобитовый) прост. но так как он работает на битовом уровне, его трудно закодировать (даже в C), а эффективность его низка, так как полный цикл выполняется по биту. Для увеличения скорости работы нам необходимо найти способ заставить алгоритм работать с блоками, большими чем бит. Такими блоками могут быть полубайты (4 бита), байты, (8 бит), слова (16 бит) и длинные слова (32 бита), и даже более длинные фрагменты, если мы сможем с ними работать. Полубайты не выровнены на границу байта, поэтому нам будет неудобно их использовать, и для увеличения скорости работы с таким алгоритмом нам нужно выравнивание по байтам - большинство алгоритмов работают именно с байтами. И именно по этой причине нам удобнее использовать алгоритм crc32, так как он выровнен по байтам. так как я сама чуть тут не запуталась нарисую небольшой пример такой "таблицы" Вот так примерно все это выглядит, поэтому преимущества crc32 налицо. Но давайте я всеже напишу про ирц.. так как это частично обратимый алгоритм - легче его будет брутить. Я добыла в нечестном бою исходники брутфорса на асме. Это если вдруг понадобится восстановить что-нибудь дболее существенное, чем IP: Code: ;===================================================================== format pe gui include '%fasminc%\win32a.inc' ;===================================================================== first = '0' flast = 'z' +1 ;===================================================================== serial rb 1024 crc32_table dd 000000000h, 077073096h, 0EE0E612Ch, 0990951BAh, 0076DC419h, 0706AF48Fh, 0E963A535h, 09E6495A3h, 00EDB8832h, 079DCB8A4h dd 0E0D5E91Eh, 097D2D988h, 009B64C2Bh, 07EB17CBDh, 0E7B82D07h, 090BF1D91h, 01DB71064h, 06AB020F2h, 0F3B97148h, 084BE41DEh dd 01ADAD47Dh, 06DDDE4EBh, 0F4D4B551h, 083D385C7h, 0136C9856h, 0646BA8C0h, 0FD62F97Ah, 08A65C9ECh, 014015C4Fh, 063066CD9h dd 0FA0F3D63h, 08D080DF5h, 03B6E20C8h, 04C69105Eh, 0D56041E4h, 0A2677172h, 03C03E4D1h, 04B04D447h, 0D20D85FDh, 0A50AB56Bh dd 035B5A8FAh, 042B2986Ch, 0DBBBC9D6h, 0ACBCF940h, 032D86CE3h, 045DF5C75h, 0DCD60DCFh, 0ABD13D59h, 026D930ACh, 051DE003Ah dd 0C8D75180h, 0BFD06116h, 021B4F4B5h, 056B3C423h, 0CFBA9599h, 0B8BDA50Fh, 02802B89Eh, 05F058808h, 0C60CD9B2h, 0B10BE924h dd 02F6F7C87h, 058684C11h, 0C1611DABh, 0B6662D3Dh, 076DC4190h, 001DB7106h, 098D220BCh, 0EFD5102Ah, 071B18589h, 006B6B51Fh dd 09FBFE4A5h, 0E8B8D433h, 07807C9A2h, 00F00F934h, 09609A88Eh, 0E10E9818h, 07F6A0DBBh, 0086D3D2Dh, 091646C97h, 0E6635C01h dd 06B6B51F4h, 01C6C6162h, 0856530D8h, 0F262004Eh, 06C0695EDh, 01B01A57Bh, 08208F4C1h, 0F50FC457h, 065B0D9C6h, 012B7E950h dd 08BBEB8EAh, 0FCB9887Ch, 062DD1DDFh, 015DA2D49h, 08CD37CF3h, 0FBD44C65h, 04DB26158h, 03AB551CEh, 0A3BC0074h, 0D4BB30E2h dd 04ADFA541h, 03DD895D7h, 0A4D1C46Dh, 0D3D6F4FBh, 04369E96Ah, 0346ED9FCh, 0AD678846h, 0DA60B8D0h, 044042D73h, 033031DE5h dd 0AA0A4C5Fh, 0DD0D7CC9h, 05005713Ch, 0270241AAh, 0BE0B1010h, 0C90C2086h, 05768B525h, 0206F85B3h, 0B966D409h, 0CE61E49Fh dd 05EDEF90Eh, 029D9C998h, 0B0D09822h, 0C7D7A8B4h, 059B33D17h, 02EB40D81h, 0B7BD5C3Bh, 0C0BA6CADh, 0EDB88320h, 09ABFB3B6h dd 003B6E20Ch, 074B1D29Ah, 0EAD54739h, 09DD277AFh, 004DB2615h, 073DC1683h, 0E3630B12h, 094643B84h, 00D6D6A3Eh, 07A6A5AA8h dd 0E40ECF0Bh, 09309FF9Dh, 00A00AE27h, 07D079EB1h, 0F00F9344h, 08708A3D2h, 01E01F268h, 06906C2FEh, 0F762575Dh, 0806567CBh dd 0196C3671h, 06E6B06E7h, 0FED41B76h, 089D32BE0h, 010DA7A5Ah, 067DD4ACCh, 0F9B9DF6Fh, 08EBEEFF9h, 017B7BE43h, 060B08ED5h dd 0D6D6A3E8h, 0A1D1937Eh, 038D8C2C4h, 04FDFF252h, 0D1BB67F1h, 0A6BC5767h, 03FB506DDh, 048B2364Bh, 0D80D2BDAh, 0AF0A1B4Ch dd 036034AF6h, 041047A60h, 0DF60EFC3h, 0A867DF55h, 0316E8EEFh, 04669BE79h, 0CB61B38Ch, 0BC66831Ah, 0256FD2A0h, 05268E236h dd 0CC0C7795h, 0BB0B4703h, 0220216B9h, 05505262Fh, 0C5BA3BBEh, 0B2BD0B28h, 02BB45A92h, 05CB36A04h, 0C2D7FFA7h, 0B5D0CF31h dd 02CD99E8Bh, 05BDEAE1Dh, 09B64C2B0h, 0EC63F226h, 0756AA39Ch, 0026D930Ah, 09C0906A9h, 0EB0E363Fh, 072076785h, 005005713h dd 095BF4A82h, 0E2B87A14h, 07BB12BAEh, 00CB61B38h, 092D28E9Bh, 0E5D5BE0Dh, 07CDCEFB7h, 00BDBDF21h, 086D3D2D4h, 0F1D4E242h dd 068DDB3F8h, 01FDA836Eh, 081BE16CDh, 0F6B9265Bh, 06FB077E1h, 018B74777h, 088085AE6h, 0FF0F6A70h, 066063BCAh, 011010B5Ch dd 08F659EFFh, 0F862AE69h, 0616BFFD3h, 0166CCF45h, 0A00AE278h, 0D70DD2EEh, 04E048354h, 03903B3C2h, 0A7672661h, 0D06016F7h dd 04969474Dh, 03E6E77DBh, 0AED16A4Ah, 0D9D65ADCh, 040DF0B66h, 037D83BF0h, 0A9BCAE53h, 0DEBB9EC5h, 047B2CF7Fh, 030B5FFE9h dd 0BDBDF21Ch, 0CABAC28Ah, 053B39330h, 024B4A3A6h, 0BAD03605h, 0CDD70693h, 054DE5729h, 023D967BFh, 0B3667A2Eh, 0C4614AB8h dd 05D681B02h, 02A6F2B94h, 0B40BBE37h, 0C30C8EA1h, 05A05DF1Bh, 02D02EF8Dh ;===================================================================== buffer rb 1024 result rb 1024 filename db 'bruteforce.log',0 complete db 'брутфорс окончен!',13,10 size = $-complete align 1024 ;===================================================================== entry $ invoke CreateFile,filename,GENERIC_READ+GENERIC_WRITE,\ FILE_SHARE_READ+FILE_SHARE_WRITE,0,CREATE_ALWAYS,\ FILE_ATTRIBUTE_NORMAL,0 mov ebp,eax mov eax,-4*8 @@: mov dword[serial+4*8+eax],first mov dword[serial+4*8+eax+4],first add eax,4*2 jnz @b ;===================================================================== @0: mov ecx,dword[serial+4*0] xor ecx,0xff mov eax,dword[crc32_table+ecx*4] xor eax,0x00ffffff mov dword[buffer+4*0],eax @1: mov ecx,dword[serial+4*1] xor ecx,eax shr eax,8 and ecx,0xff xor eax,dword[crc32_table+ecx*4] mov dword[buffer+4*1],eax @2: mov ecx,dword[serial+4*2] xor ecx,eax shr eax,8 and ecx,0xff xor eax,dword[crc32_table+ecx*4] mov dword[buffer+4*2],eax @3: mov ecx,dword[serial+4*3] xor ecx,eax shr eax,8 and ecx,0xff xor eax,dword[crc32_table+ecx*4] mov dword[buffer+4*3],eax @4: mov ecx,dword[serial+4*4] xor ecx,eax shr eax,8 and ecx,0xff xor eax,dword[crc32_table+ecx*4] mov dword[buffer+4*4],eax @5: mov ecx,dword[serial+4*5] xor ecx,eax shr eax,8 and ecx,0xff xor eax,dword[crc32_table+ecx*4] mov dword[buffer+4*5],eax @6: mov ecx,dword[serial+4*6] xor ecx,eax shr eax,8 and ecx,0xff xor eax,dword[crc32_table+ecx*4] ;===================================================================== mov ebx,eax shr eax,8 and ebx,0xff xor eax,not 0x0a463daa ; not(CRC32(пароль инсталляции)) mov ecx,first @@: mov edx,ebx xor edx,ecx cmp eax,dword[crc32_table+edx*4] jz @found inc ecx cmp ecx,flast jnz @b ;===================================================================== @next: inc dword[serial+4*6] cmp dword[serial+4*6],flast mov eax,dword[buffer+4*5] jnz @6 mov dword[serial+4*6],first inc dword[serial+4*5] cmp dword[serial+4*5],flast mov eax,dword[buffer+4*4] jnz @5 mov dword[serial+4*5],first inc dword[serial+4*4] cmp dword[serial+4*4],flast mov eax,dword[buffer+4*3] jnz @4 mov dword[serial+4*4],first inc dword[serial+4*3] cmp dword[serial+4*3],flast mov eax,dword[buffer+4*2] jnz @3 mov dword[serial+4*3],first inc dword[serial+4*2] cmp dword[serial+4*2],flast mov eax,dword[buffer+4*1] jnz @2 mov dword[serial+4*2],first inc dword[serial+4*1] cmp dword[serial+4*1],flast mov eax,dword[buffer+4*0] jnz @1 mov dword[serial+4*1],first inc dword[serial+4*0] cmp dword[serial+4*0],flast jnz @0 jmp exit ;===================================================================== @found: mov dword[serial+7*4],ecx xor ecx,ecx @@: mov eax,dword[serial+ecx*4] mov byte[result+ecx],al inc ecx cmp ecx,8 jnz @b mov word[result+ecx],0x0a0d invoke WriteFile,ebp,result,10,esp,0 jmp @next ;===================================================================== exit: invoke WriteFile,ebp,complete,size,esp,0 invoke CloseHandle,ebp invoke ExitProcess,0 ;===================================================================== data import library kernel32,'kernel32.dll' include '%fasminc%\apia\kernel32.inc' end data ;===================================================================== Вот один из брутфорсов: находит всевозможные подходящие варианты на этот хэш (На наше счастье, их может быть несколько) скорость примерно 20 млн\сек! Этот Брутфорс написал LAZAR. Вот еще один.. Вроде бы он побыстрее: Еще один брутфорс Все это добро компелируется фасмом! (flat assembler, fasm) также есть и способы попроще для задач поменьше.. Раз уж статья написана с подачи Ирц, то грех не воспользоваться возможностями Ирц. В ирц есть отличный бот, который декодирует небольшие коды. Имя бота - robo! Пробив его по хуису узнала, что живет он на каналах: #topki, #nothing, #moi-alizee, #freeware, #orsk, #boltalka, #mytest, #kashenizm, #, #myxo4ka, #fleur. Команда такая: .dh (то, что зашифровано) - в ответ выдается сообщение нотисом. С ирц вроде разобрались.. Но есть еще полезные функции.. например связанные с архивами: Архивы.. у вас никогда не было такого, что архив поврежден, или неожиданный конец архива? Вот у меня было - попробую и в этом разобраться.. Но вот выкладываю программку, которая восстанавливает архивы, точнее архиватор считает архив целым засчет изменения сrс32 хэша! Что самым прямым образом относится к теме: RAR Repair Tool 3.1 (Shareware, но прога крякнутая )) Ключевые возможности Rar Repair Tool: - восстановление RAR и SFX архивов, созданных любой версией RAR; - восстановление многотомных архивов; - независимо от размера файлов (4 Gb и более); - обработка нескольких архивов по списку; - полная автоматизация процесса восстановления; - поддержка Drag&Drop; Сама прога тут А теперь я попытаюсь обьяснить принцип работы: архиватор - тоже вещь написанная людьми, и они повреждаются при транспартировке, неправильной упаковке. В crc32 коде могут быть ошибки при упаковке. Что приводит к повреждению архива.. С форматом RAR самой частой является ошибка с повреждением циклического кода.. То есть код при упаковке\распаковке не совпадает с исходным. Программы, которые восстанавливают архивы как-бы "восстанавливают" или "собирают" поврежденный код.. В итоге файлы можно извлечь.. Конечно без потерь может не обойтись, но это лучше чем ничего! Ну вот примерно мы разобрались в коде crc32! поврежден архив? Восстановим.. нужен IP врага в ирц - а он гад шифруется? Получим... Но перед использованием надо знать примерный принцип работы для того, чтобы не быть юзерами, которые кликают по экрану мышкой в поисках ответа.. Удачи вам в ваших происках ) ПС: Спасибо за неоценимую помощь в написании статьи blackybr, и begin end'у за идею )
ну и нафига ты это написал? напиши еще 4то любищь овощи... ЗЫ: статей рулез, много нето4ностей, но для на4ала довольно неплохо ЗЫЫ: можно как продолжение статейки написать про колизии в алго Crc32 для подделки файлов с неизменной подписью
я спп сорс не понял если честно, что за sptr? это какая-то стандартная структура (или класс)? =\ PS если бы были хидеры, я бы посмотрел в них, но их нет почему-то. PPS кто здесь? PPPS Это я пишу не затем, что бы писать, просто и правда не очень понятно
ProTeuS, овощи ) Может быть я и дорасту до продолжения этой статейки! а написала ее для того, чтобы при необходимости можно было расшифровать(Брутить) сrс32. В интернете достаточно мало данных об этом. Не каждый слышал.. сама раньше не слышала.. Раз мы занимаемся компами - почему бы не восполнить этот пробел? ) tclover, к сожалению, я ни в Си и ни в Асме не разбираюсь. Исходник первый для понимания того - чем и как шифруется. А второй - брут.. Ну и там третий.. и компонентов пара к нему..
в репе у неё +1 Вскрываем crc32 18.05.2007 11:25 alextoun складывается порой очучение шо скопипатсено, и передаланно типо, я писал. Много не точностей почемуто мне тоже так кажеца слишком качественно сделано. и не в её стиле
Мля, что значит не в моем? Я уже и написать не могу чтоли? Если у кого есть что добавить - пишите - я добавлю. НЕ все знаю.. Добавлю от вашего имени.. Исходники тока не мои.. остальное мое.. ПС: я ему в личку написала. он ничего не добавил ничего ( Ну и зачем тогда писать? Статья моя..
>> Ну просто обидно.. Писала, не верят... я - верю ) >> Надеюсь, что понравилась.. ) мне - не особо, т.к. ты не очень то разобралась в том, о чем пишешь.. а еще.. русский язык.. чего только стоит, например, фраза: "архиватор - тоже вещь написанная людьми, и они повреждаются при транспартировке, неправильной упаковке.".. )
гы, сорри за мой французский ))) Может и не особо разобралась.. Кто разберется лучше может дописать статью.. уже от своего имени.. только вот леса рук не вижу )
>> Кто разберется лучше может дописать статью.. уже от своего имени.. ну уж нет, теперь это твой священный долг - дописывать и улучшать эту статью.. )) главная проблема этой статьи - отсутствие четкой структуры.. и это отсутствие проявляется с первого же предложения.. смотри: статья называется "Вскрываем crc32", а начинается "Эта статья будет про режим /mode +x в Ирц..".. (тут надо бы сразу определиться про что все-таки статья).. а потом оказывается, что статья еще и про ремонт архивов... всегда нужно держать в голове, а еще лучше, написать где-нибудь, план свой будущей статьи.. например, для твоей статьи он мог бы быть таким: 1. введение (здесь кратко пишем - о чем статья, чем она будет интересна/полезна читателю.) 2. вводное описание crc 3. брутфорс crc 4. "про ирц" ) 5. "про архивы" )) 6. заключение 7. ссылки по теме, гритсы и прочая лабуда у тебя пункты 1 и 2 отсутствуют напрочь... =/ а перед тем как выкладывать статью, ее желательно прочитать пару раз вслух и проверить на предмет орфогрфических и пунктуационных ошибок, в ворде, например..