Простой шаблон кейгена. Перевод.

Discussion in 'Реверсинг' started by KindEcstasy, 28 Dec 2007.

Thread Status:
Not open for further replies.
  1. KindEcstasy

    KindEcstasy Banned

    Joined:
    30 Sep 2006
    Messages:
    105
    Likes Received:
    64
    Reputations:
    54
    Простой шаблон кейгена
    ( перевод статьи Simple KeyGen Templeate by ARTeam/Goppit)
    ARTeam Win32 Assembly for Crackers / 6
    перевёл: KindEcstasy [ kindecstasy@inbox.ru ]​



    В этом уроке мы напишем простой кейген и добавим в него пример кода простой генерации ключа, которая в последствии может быть улучшена до настоящего алгоритма генерации выдранного из любого программного обеспечения. Так же мы добавим в кейген код который позволяет копировать наш готовый (сгенерированный ключ ) в буффер обмена windows.

    Как обычно запустите WinAsm, создайте новый проект - standart exe project. И добавьте новый скрипт ресурса и создайте новый диалог и иконку (как в предидущих уроках).

    Добавьте 2 контрола "EditBox" чтобы вводить наше имя и показывать наш серийник. 2 статические надписи, чтобы подписать где какое поле находиться и 3 кнопки, как показанно на рисунке:

    [​IMG]

    Измените стиль для DialogBox, добавив свойство DS_CENTER. К надписям примените свойство SS_CENTERIMAGE, а к полю где будет выводиться серийник примените свойство ES_READONLY. Скрипт вставлен в исходный код проекта как simplekeygen.rc

    Теперь переключитесь в главный исходник программы ( simplekeygen.asm ) и вставьте код из нижепреведённого листинга. Вот главный код тела програмы:

    [​IMG]

    Вот код функции диалога:

    [​IMG]

    Процедура генерации серийника, которая и вычисляет правильный номер:

    [​IMG]

    Теперь давайте проанализируем приведённый выше код:

    Переменные

    Есть 2 неинициализированные переменные строчного типа в которые будут помещены имя которое ввёл пользователь и сгенерированный серийный номер.

    Функция диалога

    По кнопке Generate мы просто получаем имя введённое пользователем из поля ввода для имени (Name) и сохраняем его в строчную переменную NameBuffer, вызываем нашу процедуру генерации и выводим полученный в результате серийный номер в поле для серийника (Serial).

    Кнопка Copy вызывает копирование всего что находиться в поле ввода серийника в буффер обмена. Вызывается это посылкой windows-сообщения полю для ввода серийника. Это намного просще, чем писать отдельную функцию для проделывания этой операции. Кстати заметьте что по спецификации из Win32.hlp, текст который должен быть скопирован, должен быть сперва выделен!:

    [​IMG]

    Сообщение которое позволяет выделить всё что находиться в editbox приведено ниже:

    [​IMG]

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

    Функция кнопки Exit была описанна в ранних уроках (прим. перев. Она просто завершает программу)


    Процедура генерации и метки

    Функция генерации - простой пример действия который меняет порядок символов в строке введённой в поле для имени (Name). Заметьте что мы не передаём функции никаких параметров, так же как и функция в свою очередь ничего не возвращает. Так что сдесь нет никакой необходимости в обьявлении прототипа функции и вызова её с помощью Invoke.

    Сначала процедура генерации была написанна без следующих строк:

    Code:
    test eax,eax
    jle NOINPUT
    NOINPUT:
    
    Но, нажатии на кнопку Generate вызывало сбой если буффер (переменная) NameBuffer был пуст (то есть пользователь не вводил ничего в поле для имени). Первая функция lstrlen подсчитывает длинну строки в буффере NameBuffer и возвращает результат в регистре EAX. Выдержка из Win32.hlp: "Функция lstrlen возвращает длинну в байтах (для ANSI версии) или в символах (Unicod версия) заданной строки (нулевой символ прерывания строки не учитываеться)".

    Test eax,eax устанавливает флаг нуля если регистр EAX равен 0 (нулю) и совершаеться условный переход jle (Jump if Less or Equal) к метке NOINPUT и затем выполняется инструкция RET, если флаг нуля установлен!

    Метки - это что-то вроде закладок, которыми вы можете подписать какой-то кусок (часть) кода для того чтобы в последствии совершать условные прыжки к этим меткам.
    Когда вы определяете метку вы должны поставить после ней двоеточие, но когда вы вызываете метку или делаете на неё прыжок - двоеточие не пишеться (прим. перев: LABEL1: <- обьявили метку JMP LABEL1 <- прыгнули на метку).

    Если длинна строки в EAX больше чем 0 (нуль), то длинна копируеться в регистр ECX по средствам инструкции MOV. ECX обычно используеться как счётчик который указывает сколько раз должна совершиться цикл (LOOP). В нашем примере мы используем это чтобы пройтись по всем символам в строке.

    Затем в регистры ESI & EDI кладуться адреса в памяти переменных NameBuffer & SerialBuffer. Эти два регистра обычно используються в качестве источника и приёмника в строковых операциях.

    @@: обьявляет ананимную метку. В длинных конструкциях используеться много переходов и/или циклов. Это заставляет нас обьявлять много разных имён для наших меток, но MASM может использовать ананимные метки для коротких прыжков и циклов. Для того чтобы использовать ананимную метку:

    JMP @F - совершает прыжок вперёд по коду к ближайшей метке @@:
    JMP @B - совершает прыжок назад по коду к ближайшей метке @@:

    Соответственно F - Forward, B - Backward.

    В общем конструкция перевода строки выглядит следующим образом:

    Сначала счётчик ECX уменьшаеться на 1, так что финальный проход по циклу (петля) заканчиваеться на 0 (нуль) а не на 1. То есть если длинна строки была 6 символов, тогда ECX будет "петлять" от 5 до 0 и конструкция повториться 6 раз.
    ESI содержит адрес первого символа переменной NameBuffer, то когда ECX=0, ESI+ECX - указывают на следующий символ и когда ECX=5, ESI+ECX - указывают на последний символ в строке.

    Первая инструкция MOV копирует последний байт (символ) из NameBuffer в младший байт регистра EDX ( DL ).
    Вторая инструкция MOV копирует этот байт на место первого байта в переменной SerialBuffer (адрес которой записанн в регистре EDI)
    Потом значение EDI увеличиваеться на 1чтобы указать на второй байт переменной SerialBuffer и приготовиться ко второму проходу по циклу (ко второй петле).

    И наконец инструкция OR (логическое ИЛИ) используеться с регистром ECX, которая установит флаг нуля если ECX достиг нуля. Инструкция JA (Jump if above) совершит прыжок, если флаг нуля НЕ установлен. Другими словами цикл будет продолжаться до тех пор пока ECX не достигнет нуля. Когда выполнение дойдёт до RET мы выйдем из функции в главную процедуру окна (диалога).

    Это очень простой способ написания функции. Вы можете передавать функции параметр и получать возвращаеме значения в отличии от результата в EAX. Обьявление прототипа позволит вам вызвать вашу функцию с помощью Invoke. В следующих уроках мы добавим обложку для нашего кейгена и вставим в него музыку и графику.


    автор: Goppit | ARTeam
    перевод: robo9 <kindecstasy@inbox.ru>
    оригинал можно скачать по этой ссылке:
    http://team-x.ru/guru-exe/Tutorials/Coding/Win32Assembler%20Coding%20for%20Crackers%20v1.1.zip
     
    #1 KindEcstasy, 28 Dec 2007
    Last edited: 30 Dec 2007
    3 people like this.
  2. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    757
    Likes Received:
    336
    Reputations:
    215
    а в чем смысл писать кейген на ассемблере? потому, что крякеры других языков не знают или может показать свой профессионализм? только тогда к чему этот windelphiasm? или научить других ассемблеру?
    кейген это исследование алгоритма генерации серийного номера по имени, ничего подобного в статье не упоминается. его безусловно на ассемблере писать проще, но вот красочную обертку делать на нем же смысла нет, тем более для отдельной статьи.
     
    2 people like this.
  3. KindEcstasy

    KindEcstasy Banned

    Joined:
    30 Sep 2006
    Messages:
    105
    Likes Received:
    64
    Reputations:
    54
    Ну во первых писал это не я. Я только перевел на русский. А во вторых цель данной статьи не написание кейгена, а создание платформы (заготовки) для будущих кейгенов. Статья расчитанна на новичков и алго генерации как такового нет, просто паказанно как создать темплейт. Я начал переводить её потому, что посчитал её интересной для новичков. А смысл написания кейгенов на ассемблере прост как веник - потому что выходные файлы самые маленькие по размеру и что этот язык напрямую связан с крэкингом. Крекеры безусловно знают и другие языки программирования, просто за ассемблером они проводят большую часть своего времени, а не потому что они хотят казаться профессионалами (каждый в чём-то профи). Алгоритм создания ключа по имени упоминаеться просто он очень лёгкий (это как бы пример такой ). И нету здесь никаких красочных обложек просто форма и кнопки ....
     
    1 person likes this.
  4. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,650
    Likes Received:
    754
    Reputations:
    397
    бля, вот только хотел написать это, потом увидел пост зако, где он это уже написал...
    плюсадин! нахер это надо неясно, вон slesh выкладывал traceroute на осенблере, и думает что ему в репу плюсики поставят, ему даже плюсиков не поставили! гыгы

    да уж, неибаться классная цель статьи. написать заготовку для месагбокса - вот это проффесионально. создается впечатление, что диалоговые окна (но осенблере конечно!!!) значат больше, чем сам кейген.

    Ещё один заблуждающийся.. Стереотипы пиздец. Не пробовал в студии делать? Ужаснешься! Ты там увидишь оптимизацию, который в этом асм-коде нет. Особенно это касается call [длинный дворт], который в студии заменяется на call регистр, в который заранее кладется адрес. Хотя бы это. Мб тоже самое в студии (правильно сделаное) будет весить ещё меньше. Или столько же. Из-за выравнивания :)
    Да и НАХЕРА маленький размер? Маленький размер нужен лоадеру. Иначе лоадер - просто не будет работать. Маленький размер нужен трояну. Но уже не настолько. А вот кейгену маленький размер впизду не сдался. Если это своеобразный понт, то он отнимает времени и сил, а толк от него, конечно, специфический: "просто-так".

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

    Короче какое-то разъяснение новичка, только что освоившего пару машинных инструкций, плюс прочитавшего про DialogBoxParam в MSDN ...

    К счастью, к автору это ничего отношения не имеет, потому что он только переводил.
    Аффтар плюсадин.
     
    1 person likes this.
  5. KindEcstasy

    KindEcstasy Banned

    Joined:
    30 Sep 2006
    Messages:
    105
    Likes Received:
    64
    Reputations:
    54
    Спасиб ;)

    Ну чтож такое то... ну для ньюбисов же писали. Кстати другие его туториалы более профессионально написанны и в плане сорцов. Там примеры и лоадеров и чего тока нету. Просто доходчиво всё разьеснено и понятно. Имхо, для новичков самое то!

    Кстати ARTeam довольно сильная команда реверсеров в частности и Goppit

    А по поводу зачем они пишут на асемблере, ну ещё наверное потому что мало кто из них представляет что такое классы да и если знают то по наслышке... Ассемблер для них это язык №1 вот и пишут на нём. Некоторые пишут и на Delphi и С++ но это всё равно уже не то... /

    Ага но перед этим то в регистр нужно ещё какойто адрес впиндюрить...

    по почкам не бейте так как это всего лишь имхо...
     
    #5 KindEcstasy, 28 Dec 2007
    Last edited: 29 Dec 2007
  6. zl0y

    zl0y Banned

    Joined:
    13 Sep 2006
    Messages:
    414
    Likes Received:
    270
    Reputations:
    109
    Да лан нормально,для новичков сойдет в конце концов начинать же с чего надо,а на кеза не обращай внимания он уже кончает...
     
  7. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,650
    Likes Received:
    754
    Reputations:
    397
    Вы дадите мне закончить? Пожалуйста, дайте мне закончить.

    Ладно, я кончил.
     
  8. KindEcstasy

    KindEcstasy Banned

    Joined:
    30 Sep 2006
    Messages:
    105
    Likes Received:
    64
    Reputations:
    54
    Упс... мои извенения не увидел (
     
    1 person likes this.
  9. GoreMaster

    GoreMaster Elder - Старейшина

    Joined:
    28 May 2007
    Messages:
    120
    Likes Received:
    32
    Reputations:
    4
    Кез,тебе по-моему везет, ты вечно находишь какое-то говно =)))
    А этих темплейтов для кейгенов туева хуча =)))
    http://webfile.ru/1663271
    нашел на винте
    Что-то мне подсказывает,что ребята там серьезные и про классы уж точно они знают =)))
     
  10. KindEcstasy

    KindEcstasy Banned

    Joined:
    30 Sep 2006
    Messages:
    105
    Likes Received:
    64
    Reputations:
    54
    GoreMaster
    Это метафора - так как в основном используется ассемблер ;)

    И темплейтов хоть и много но тут написанно как его запрограммировать...
    И ЭТО не я писал так что я бы выслуiал лучше мнения о качестве перевода а не всякий оффтоп ;)
     
  11. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,650
    Likes Received:
    754
    Reputations:
    397
    А чего, ну нормальное качество, песдато, молодец. Просто если тебя на античате не критикуют - значит все норм, всем понравилось, можешь не волноваться :) Т.е. не к чему придраться. Т.к. если бы было к чему придраться - поверь, придрались бы уже :)

    Ввввооооововововов, именно. Вот про что я и говорил. Твои слова звучат так в переводе на русский:
    "самая главная непостижимая вещь вещь - это классы си плюс плюс! я про них не особо знаю, но говорят, что классы - это проффесионально, не то, что ваш осенблер, а прям по - взрослому".
     
    #11 KEZ, 31 Dec 2007
    Last edited: 31 Dec 2007
    1 person likes this.
  12. GoreMaster

    GoreMaster Elder - Старейшина

    Joined:
    28 May 2007
    Messages:
    120
    Likes Received:
    32
    Reputations:
    4
    Тут ты прав,так как не было необходимости
    нет,просто говорят,что про классы реверсеры хоть что-то да должны знать
    З.Ы.:КЕЗ, с наступившим тебя, не пей много бутирата в Новом 2008 году
     
  13. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    395
    Reputations:
    297
    Тему закрываю во избежание продолжения оффтопа. По делу уже все было сказано.
     
Loading...
Thread Status:
Not open for further replies.