Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Циклический инкремент паролей (https://forum.antichat.xyz/showthread.php?t=205208)

Pashkela 19.05.2010 18:19

Циклический инкремент паролей
 
Только начал изучать С под Linux, просьба отнестись с пониманием)

Вот у меня такой код, для брута паролей по набору символов:
Код:

#include <stdio.h>
// Сам брут
int go(int ii,char *def_pass,int def_len,char *nabor,int len,char *current){
        unsigned int i=0; 
        while (i < len) {
                current[ii-1] = nabor[i]; // добавляем новый символ
                printf("%s\r",current);// Выводим текущую комбинацию           
                if (ii >1 ){
                    go(ii-1,def_pass,def_len,nabor,len,current);// Рекурсивно вызываем сами себя для заполнения всех позиций
                }else{
                        char *check=current; // Проверяем текущую комбинацию
                        if (strncmp(check,def_pass,def_len) == 0){ // Если совпало
                            printf("[+]Password found! => %s\n",check);
                            exit(1);
                        }
                        check="";// Очищаем переменную с текущим паролем
                }
                i++;
        }
}
int main (int argc, char *argv[])
{
        char *def_pass="013283";// Пароль, который надо найти
        unsigned int def_len = strlen(def_pass);// Длина пароля
        char *nabor="0123456789";// Набор символов, из которых будем генерить пароль
        unsigned int len = strlen(nabor); // Длина набора
        unsigned int i=1;// Минимальная длина пароля
        char *buf;
        while(i <= len){
                printf("[-]Pass length:%d\n",i);
                buf=calloc(sizeof(char),i+1); // Заполняем нулями по длине текущего пароля
                go(i,def_pass,def_len,nabor,len,buf); // Отправляем на брут
                i++;
        }
}

Все работает, но очень медленно. Натолкнулся на такую статью:

http://www.xakep.ru/post/22587/default.asp

но там пример на С++, внимание вопрос:

как внедрить данную идею - "Циклический инкремент паролей" - в код выше. Просто раньше с ассемблерными вставками и вообще программированием на С под никсами не сталкивался. В идеале готовый пример. Спасибо.

d_x 19.05.2010 22:22

Код будет практически мгновенно работать, если ты уберешь строчку

Цитата:

printf("%s\r",current);// Выводим текущую комбинацию
printf каждого пароля жрет приличное время.

Pashkela 19.05.2010 23:15

это ми в курске, это просто демонстрация) Но если это переложить на брут MD5 - без всякий вообще выводов - скорость в 10 раз ниже, чем у PasswordsPro. Отсюда и сабж

Ins3t 19.05.2010 23:25

Цитата:

но там пример на С++
То что они назвали си плюс плюс-ом на самом деле чистый С.

Pashkela 19.05.2010 23:58

пробовал. Не комплится чото "тот чистый си". Мильон ошибок

Ins3t 20.05.2010 00:13

Ясное дело, откуда же в линуксе взяться хедеру windows.h :)

И с ассемблерными вставками в линуксе не так как в винде, но об этом более конкретно сказать не могу )

Так то писать нужно было не:
Цитата:

но там пример на С++
а
Цитата:

нo там пример под Windows
;)

Pashkela 20.05.2010 00:16

спасибо за ценную информацию

d_x 20.05.2010 00:52

Pashkela, там реально пример на чистом СИ, и из windows.h там используется отсилы слово TRUE и ZeroMemory.

Этот код я переписал тебе под gcc:

PHP код:

#include "stdio.h" 

int main(int argccharargv[]) 

  static 
char szPassword[256];
  static 
char szAlphabet[256]; 
  static 
unsigned char bAlphabet[256]; 
  
  
memset(szPassword0sizeof(szPassword)); 
  
strcpy(szAlphabet"ABC"); 
  
memset(bAlphabet0sizeof(bAlphabet)); 

  
int i 00
  while (
1
  { 
    
bAlphabet[k] = (unsigned char)szAlphabet[i]; 
    if (!
szAlphabet[i]) 
      break; 
      
    
= (unsigned char)szAlphabet[i]; 
    
i++; 
  } 

  while (
1
  {
      
__asm
      
(
      
".intel_syntax noprefix\n"
      "pushad\n"
      "L1:\n"
      "movzx eax,byte ptr [edi]\n"
      "xlat\n"
      "test al,al\n"
      "jz L3\n"
      "mov [edi],al\n"
      "jmp LL5\n"
      
      "L3:\n"
      "xlat\n"
      "stosb\n"
      "jmp L1\n"
      
      "LL5:\n"
      "popad\n"
      ".att_syntax\n"
      

      : 
"D" (&szPassword), "b" (&bAlphabet)

      );

    
printf("%s\n"szPassword); 
  } 

  return 
0



Pashkela 20.05.2010 01:00

2 d_x:

йо, а вот это круто, вот это действительно работает, ты мозг, большое спасибо

ps: только ми не вогнал, как тут сработало без AT&T

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

d_x 20.05.2010 01:03

Док правильный нашел, там написано все. А чтобы вырубить at&t, используется директива .intel_syntax, можешь погуглить. Чтобы включить обратно - .att_syntax.


Время: 01:03