Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #71, ОКТЯБРЬ 2006 г.

скрытые фичи C#

ДРОЗДОВ АНДРЕЙ AKA SULVERUS

Спецвыпуск: Хакер, номер #071, стр. 071-076-2


[перебираем стог сена.]

Для наглядности мы напишем брутфорс, который будет подбирать число, равное некому числу n. Вначале загадаем некое число n, равное 68491. Теперь надо, чтобы программа угадала его. Объявляем функцию public static void brute(long diap). Мы будем передавать функции параметры диапазона чисел, в котором она будет искать наше число. Для реализации перебора мы будем использовать написанный нами метод для перегрузки операторов равенства и цикл for.

код брутфорса

public static void brute(long diap)

{

n = 68491; //задаем некое число

NewMessage("w8. Bruteforce working..."); //вызываем событие

for (int i = 0; i < diap; i++) //мутим цикл

{

d = i;

string brute = Convert.ToString(bug.Equals(n, d)); //сравниваем и возвращаем результат в строку

if (brute == "True")

{

BruteComplete(d.ToString()); //вызываем событие при удачном переборе

break;

}

}

if (ok == false)

{

NewMessage("Brete Failed:(");

}

}

Как видно из этого кода, мы сравниваем число n с текущим числом и возвращаем значение в строковый тип данных brute методом System.Convert.ToString(). Если числа равны, то цикл прекращается. Поясню возможно сложившиеся у читателя непонятки относительно методов NewMessage() и BruteComplete(): это не методы, а вызовы событий, которые, в свою очередь, работают с делегатами, а делегаты вызывают методы.

[делегация из Африки.]

Программисты создают массу классов, методов, типов и прочих кусков кода. Все они, так или иначе, взаимосвязаны друг с другом: одни объекты порождают другие, пересылают им какие-то параметры и т.д. Однако все это работает только в одну сторону. А если порожденный объект захочет отослать что-то объекту, который его породил? Раньше в Win32/C/C++ было понятие обратного вызова, но у этого способа был один существенный недостаток: создавался просто указатель на функцию, то есть ссылка на адрес в оперативной памяти, и, следовательно, такой способ приводил к массе ошибок, переполнению буфера и т.д. В языке С++ нет решения подобной проблемы, а в языке C# для ее решения есть специальный класс (System.MulticastDelegate). Благодаря работе делегата, исключаются ошибки переполнения буфера и срыва стека, поскольку при создании делегата указывается не только ссылка на функцию, но и набор передаваемых ей параметров. Объявить делегат очень просто: public delegate void BlahBlah(string Blah). Заметим, что делегат может иметь ссылку на несколько функций: для этого нужно использовать метод MulticastDelegate.Combine(), единственное, что должно быть общего у этих методов - это список параметров. Для оптимизации кода, при совмещении нескольких функций в одном делегате, можно использовать оператор сложения. Таким же образом можно объединять два делегата в один:

Назад на стр. 071-076-1  Содержание  Вперед на стр. 071-076-3