2

嘿,所以我想如果我制作一个生成随机密码的小应用程序,然后让应用程序运行所有可能性并尝试查看密码是什么,告诉我它尝试了多少次,那会很酷。有时应用程序工作有时它崩溃取决于密码是什么。我想知道我可以做些什么来阻止它通过使用最多的内存而崩溃。这就是方法。

-(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];

                        }

                    }
                }
            }
        }
    }
         });

} 

我应该在那里做些什么来阻止它崩溃?

4

3 回答 3

4

如果您的应用程序内存不足,很可能是因为您正在用大量对象填充自动释放池,直至内存耗尽。

天真地,您可以使用@autoreleasepool{}其中一个内部for()循环。

但是,大多数密码输入系统会立即将密码散列成一些不可反向散列的字符串,然后将其与存储的散列进行比较。因此,您的方法不太可能对测试密码有用。您可能需要实现相同的散列。

我曾经在我公司的用户密码数据库上运行密码破解程序(有点像John the Ripper ),自动向密码弱的任何人发送电子邮件。我们最终解雇了一个人,因为他们无法想出一个无法在几分钟内被破解者破解的密码(还有其他原因,性质类似)。

于 2013-05-17T15:45:31.853 回答
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];

    }
}
于 2013-05-17T15:37:09.287 回答
0

stringWithFormat:返回一个自动释放的字符串。这意味着在该方法调用返回(并且自动释放池耗尽)之前它不会被清理,因此您的内存不足。如果您不使用 ARC,则可以显式初始化并释放字符串:

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

如果您使用的是 ARC,请@autoreleasepool在其中一个内部循环周围添加一个,我建议您使用该string4循环。

于 2013-05-17T15:42:03.100 回答