2013-05-17 4 views
2

Эй, так что я подумал, что было бы здорово, если бы я сделал небольшое приложение, которое сгенерировало случайный пароль, а затем приложение выполнило все возможности и попыталось выяснить, что пароль подсказывает мне, как он много раз пытался это сделать. Иногда приложение работает, иногда он падает, зависит от того, что такое пароль. Я хотел знать, что было что-то, что я мог сделать, чтобы остановить его от сбоев, используя до большой памяти. Это метод.закончился из памяти из цикла for

-(void)hackString 
{ 
    NSString *string; 
    NSString *string1; 
    NSString *string2; 
    NSString *string3; 
    NSString *string4; 
    NSString *string5; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){ 


    NSString *hackedString; 

    for (string in self.validLetters) { 
    //[hackedString appendString:string]; 
     for (string1 in self.validLetters) { 
      //[hackedString appendString:string1]; 
      for (string2 in self.validLetters) { 
       //[hackedString appendString:string1]; 
       for (string3 in self.validLetters) { 
        //[hackedString appendString:string1]; 
        for (string4 in self.validLetters) { 
         for (string5 in self.validLetters) { 
          hackedString = [NSString stringWithFormat:@"%@%@%@%@%@%@",string,string1,string2,string3,string4,string5]; 
          // NSLog(@"%@",hackedString); 
          [self testStringWithPassword:hackedString]; 

         } 

        } 
       } 
      } 
     } 
    } 
     }); 

} 

Есть ли что-нибудь, что я должен делать, чтобы остановить его от сбоев?

+2

Вы используете цикл O (n^6)! – CodaFi

+0

для жизни меня, я не могу понять, какого черта вы хотите достичь с этой сумасшедшей 6 глубокой петлей. Строить все возможные строки с действительными буквами? – John

+2

@John Yup - это взломщик паролей на 6 символов, что я могу сказать. Увлекательный учебный взлом; эта кроличья дыра идет глубоко. – bbum

ответ

1

Есть ли что-нибудь, что я должен делать, чтобы остановить его от сбоев?

Ты уверен, программа врежется? Если ваша программа действительно терпит крах, вы должны получить журнал сбоев или консольное сообщение, в котором сообщается, где он разбился, и вы должны иметь возможность увидеть место, где он разбился в отладчике.

Возможно, ваша программа просто занимает очень много времени, потому что вы просите ее генерировать каждую комбинацию из шести строк от validLetters. В зависимости от обстоятельств также возможно, что ваша программа будет убита сторожевым процессом в операционной системе.

С другой стороны, ваша программа действительно может быть сбой, потому что у нее заканчивается память. Вы выделяете память каждый раз, когда вы вызываете -stringWithFormat:, что создает новую строку с автореализацией. Поскольку вы никогда не позволяете запустить цикл цикла, пул автозапуска никогда не будет истощен. Если ваша программа занимает слишком много времени, чтобы найти строку, которую она ищет, вы можете легко использовать всю имеющуюся у вас память. Таким образом, чтобы начать, попытайтесь поместить свою сокровенную for петлю внутри @autorelease блока, как:

@autorelease { 
    for (string5 in self.validLetters) { 
     hackedString = [NSString  stringWithFormat:@"%@%@%@%@%@%@",string,string1,string2,string3,string4,string5]; 
          // NSLog(@"%@",hackedString); 
     [self testStringWithPassword:hackedString]; 

    } 
} 
+2

OP говорит, что у его программы заканчивается память, и, учитывая эту конструкцию цикла, я могу, конечно, понять, почему. Поскольку это dispatch_sync(), он не будет блокировать основной поток. – bbum

+0

@bbum Спасибо, я пропустил это 'dispatch_async()'. – Caleb

0

stringWithFormat: возвращает autoreleased строки. Это означает, что он не очищается до тех пор, пока этот вызов метода не вернется (и пул автозапуска не будет исчерпан), поэтому у вас закончилась нехватка памяти. Если вы не используете ARC, вы можете явно инициализации и освободить строки:

hackedString = [[NSString alloc] initWithFormat:@"%@%@%@%@%@%@",string,string1,string2,string3,string4,string5]]; 
[self testStringWithPassword:hackedString]; 
[hackedString release]; 

Если вы используете ARC, добавьте @autoreleasepool вокруг одной из внутренних петель, я хотел бы предложить цикл string4.

+1

'@ autoreleasepool' - это не только функция ARC ... –

+0

@flexaddicted Я знаю, но прямой init/release более эффективен, чем пул. – Kevin

+1

Без сомнения. Я имею в виду * Если вы используете ARC, ... * Cheers. –

4

Если ваше приложение заканчивается из-за нехватки памяти, это, скорее всего, потому, что вы заполняете пул авторефератов множеством объектов до уровня исчерпания памяти.

Наивно, вы можете использовать @autoreleasepool{} вокруг одной из внутренних петель for().

Однако большинство систем ввода пароля сразу же вводят пароль в какую-то строку без обратного хэширования, которая затем сравнивается с сохраненным хэшем. Таким образом, маловероятно, что ваш подход будет полезен для тестирования паролей. Вероятно, вам нужно будет реализовать одно и то же хеширование.

Я использовал для запуска взломщика паролей (вроде как John the Ripper) в базе данных пользователя моей компании, отправляя автоматические письма всем, чей пароль был слабым. Мы закончили тем, что уволили одного человека, потому что они были неспособны думать о пароле, который не мог быть побежден взломщиком в течение нескольких минут (были другие причины, похожие по природе).

Смежные вопросы