Состязание гуру. Продолжение...

Тема в разделе "WASM.ASSEMBLER", создана пользователем Morskoivolk, 22 апр 2007.

  1. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    Наконец-таки! Я закончил долбаться со своей прогой. Максимум, что Я смог выжать из нее это 1536 байт. Напоминаю прога генерирует сериал намбер для WinZip 9.0.
    Были учтены все рекомендации и советы на форуме по улучшению и уменьшению программного кода, после чего Практически всю прогу после этого пришлось перелапатить))
    Итак, кто меньше???
    Вот сам код:

    Код (Text):
    1. .386P
    2. .model flat
    3. includelib user32.lib
    4. include D:\masm32\include\windows.inc
    5.  
    6. ;вызываемые функции Windows (внешние ссылки)
    7. extern _imp__DialogBoxParamA@20:dword
    8. extern _imp__GetDlgItem@8:dword
    9. extern _imp__SetFocus@4:dword
    10. extern _imp__MessageBoxA@16:dword
    11. extern _imp__EndDialog@8:dword
    12. extern _imp__GetDlgItemTextA@16:DWORD
    13. extern _imp__SetDlgItemTextA@12:DWORD
    14.  
    15. ;*****Секция неинициализированных данных*****
    16. .DATA?
    17. BUFFER DB 1 DUP(?)
    18.  
    19. .code
    20. start:
    21.     push eax        ;0
    22.     push offset DlgProc ;процедура диалогового окна
    23.     push eax        ;0
    24.     push offset DlgName ;имя шаблона диалога, он связывает .asm и rc.-файлы
    25.     push 400000h    ;hInstance
    26. call _imp__DialogBoxParamA@20 ;создаем программно-модальное диалоговое окно (тащусь от этих слов)
    27.     ret
    28.      
    29. DlgProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    30.     xor ebx,ebx     ;делаем это для того, чтобы заменить все push 0 на push ebx
    31.     mov edi,hWin    ;в edx теперь дескриптор диалогового окна
    32.     mov eax,uMsg    ;сообщение, которое характеризуется одной из константн
    33.       MOV ESI,offset BUFFER ;буфер для пользовательского имени
    34.       sub eax,10h     ;cmp eax,WM_CLOSE;10h
    35.     je @@WM_CLOSE
    36.     sub eax,101h    ;cmp eax,WM_COMMAND;111h
    37.     jne a0
    38. @@WM_COMMAND:
    39.       mov eax,wParam  ;wParam - константа характеризующая событие, которое приходит в диалог. окно
    40.     dec eax         ;cmp eax,IDOK;1
    41.     jne a0          ;прыгаем, если не нажимали IDOK
    42.       PUSH 41         ;максимальное количество символов, которое может принять буфер (я установил 50)
    43.       PUSH ESI        ;offset BUFFER
    44.       PUSH EBX        ;0
    45.       PUSH EDI        ;дескриптор диалогового окна
    46. CALL _imp__GetDlgItemTextA@16
    47.       cmp EAX,6       ;количество символов должно быть >=6
    48.       jl @@ERROR      ;иначе прыг на месаг. бокс с ошибкой
    49. ;Функция генерации серийного номера
    50. ;Инициализируем данные              
    51.       push edi        ;сохранение дескриптора диалогового окна
    52.       push eax        ;сохраняем количество букв нашего имени
    53.       MOV ECX,ESI     ;в ECX помещаем адрес Name
    54.       MOV DL, BYTE PTR [ECX]
    55.       XOR EDI, EDI
    56. ;Генерация последних четырех цифр серийного номера
    57.          @@1:  MOVZX DX, DL
    58.                IMUL EDX, EDI
    59.                ADD EBX, EDX
    60.                INC EDI
    61.                INC ESI
    62.                MOV DL, BYTE PTR DS:[ESI]
    63.                DEC EAX
    64.                JNZ @@1
    65. ;Снова инициализируем данные
    66.       MOV ESI, ECX
    67.       pop edi ;заносим количество букв имени в EDI    
    68.       MOV CL, BYTE PTR [ECX]
    69. ;Генерация первых четырех цифр серийного номера
    70.       @@2:     PUSH 8
    71.                POP EDX
    72.                XOR ECX, ECX
    73.                MOV CH,BYTE PTR [ESI]
    74.                PUSH ESI
    75.       @@3:     MOV ESI, EAX
    76.                XOR ESI, ECX
    77.                TEST SI, SI
    78.                JNS @@4
    79.                ADD EAX, EAX
    80.                XOR EAX, 1021h
    81.                JMP @@5
    82.       @@4:     SHL EAX, 1
    83.       @@5:     SHL ECX, 1
    84.                DEC EDX
    85.                JNZ @@3
    86.                POP ESI
    87.       INC ESI
    88.       MOV CL, BYTE PTR [ESI]
    89.       DEC EDI
    90.       JNZ @@2
    91.       MOVZX ECX, BX ;в ЕСХ вторая часть серийного номера
    92.       ADD EAX, 63h
    93.       MOVZX EAX, AX ;в ЕАХ первая часть серийного номера
    94.      
    95.       shl eax,16  ;Путем магических пассов помещаем весь серийник в EAX,
    96.       or eax,ecx  ;причем в правильном порядке, т.е. сначала первая часть серийника
    97.       xor ebx,ebx ;а потом вторая    
    98.  
    99. ;Далее идет "know-how" моя процедура перевода из 160-ричн. в 10-ричн. сис-му)), написанная за 15 минут, но к удивлению работает))
    100. ;Здесь она начинается
    101.       mov ecx,10h ;основание системы исчисления, из которой мы переводим - 16
    102.       pushad      ;помещаем все регистры в стек от греха подальше
    103.       push 8
    104.       pop ebx     ;счетчик для цикла, т.к. у нас S/N это 8 символов, то цикл будет повторяться 8 раз
    105. @@A:
    106.       xor edx,edx
    107.       div ecx
    108.       cmp dl,10 ;если значение <10, то заменяем его соотвествующим ASCII-символом
    109.       jl @@B
    110.       add dl,55 ;то же самое, но только если значение <10
    111.       jmp @@C
    112. @@B:
    113.       add dl,48
    114. @@C:
    115.       mov byte ptr [esi-1],dl ;помещаем серийник в память на то место, где хранилось наше имя
    116.       dec ebx                 ;заканчивать цикл? закончить если = 0
    117.       je @@D
    118.       dec esi                 ;иначе продолжаем
    119.       jmp @@A           ;и переходим к следующему символу серийника
    120. @@D:  popad                   ;здесь благополучно восстанвливаем все регистры
    121. ;На этом заканчивается процедура перевода
    122.  
    123. ;теперь выводим серийник на экран, точнее в элемент управления
    124.       pop edi                 ;Для этого восстанавливаем дескриптор диалогового окна
    125.       lea eax,dword ptr [esi-8] ;в eax помещаем адресок, где находится наш серийник
    126.       push eax                  ;передаем eax в функцию
    127.       push 2                    ;передаем ID нашего элемента управления в функцию
    128.       push edi                  ;дескриптор диалога
    129. call _imp__SetDlgItemTextA@12   ;Это торжественный момент. Здесь выводится серийный номер!  
    130.       jmp a0
    131.  
    132. @@ERROR: ;сюда мы прыгаем, когда тупим
    133.       push EBX
    134.       push EBX
    135.       push offset Text
    136.       push EDI
    137. call _imp__MessageBoxA@16 ;информируем пользователя, что его действия это не то что от него ожидала программа
    138.       PUSH EBX
    139.       PUSH EDI
    140. CALL _imp__GetDlgItem@8   ;возвращает дескриптор оpгана упpавления,содеpжащегося в блоке диалога
    141.       PUSH EAX
    142. call _imp__SetFocus@4     ;устанавливает фокус на орган управления
    143.       jmp a0
    144.  
    145. @@WM_CLOSE:
    146.       push ebx            ;0
    147.     push edi            ;hWin
    148. call _imp__EndDialog@8    ;посылаем менеджеру диалоговых окон сигнал о том, что мы завершаем приложение
    149. a0:   xchg eax, ebx
    150.         ret
    151. DlgProc endp
    152.  
    153. ;*****Секция инициализированных данных*****
    154. ClassName db "DLGCLASS",0
    155. DlgName db "Dlg",0
    156. Text db "Минимальная длина имени - 6 символов",0
    157.  
    158. end start
    Кто смог меньше, не стесняйтесь, пишите. Можно в личку.
    Надеюсь на дальнешее сотрудничество))).
    Заранее Спасибо всем еще не ответившим и тем, кто направлял мои усилия в нужное русло.
    На всякий случай атачу сорцы и екзешник.
     
  2. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    нашел косяк в функции перевода числа из десятичной системы в шестнадатиричную, исправил вот аттач.
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Думаю, оптимизировать дальше не имеет смыла. Это можно сделать только:
    1) в написании вируса
    2) написании шелл-кода
    3) из спортивного интереса.

    Излишняя оптимизация приведет к усложнению кода. Вдруг найдешь когда-нить ошибку - сам же потом не разберешься :)

    P.S.: советую сделать 2 файла: exe - в котором будет храниться форма (окошка/диалог) и библиотеку - в ней будут все написанные тобой процедуры генерации кода. Это очень удобно. Я себе так же сделал.
     
  4. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    Код (Text):
    1. P.S.: советую сделать 2 файла: exe - в котором будет храниться форма (окошка/диалог) и библиотеку - в ней будут все написанные тобой процедуры генерации кода. Это очень удобно.
    в моем случае это вряд ли имеет смысл, т. к процедур только 2 и обе маленькие
    Код (Text):
    1. Думаю, оптимизировать дальше не имеет смыла.
    именно из спортивного интереса!

    Я пока не хочу лезть PE заголовок и править его, там тоже могут возникнуть свои косяки.
     
  5. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Я имел ввиду, если ты не остановишься только на винзипе. У меня, к примеру, 16 кейгенов. Все они находятся в одном окне. Ну ладно, мое дело предложить, Ваше дело отказаться :)
     
  6. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    ))) ладно, не бери в голову. у меня пока что всего три....один из них вот на ассм перелапатил, 2 так и лежит еще на WinApi)))
    В дальнейшем хочу перелапатить все на ассм. Тогда уже задуматься надо будет о 2-х exe. Спасибо.
     
  7. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    кто еще может помочь?
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Morskoivolk
    еах не обязан быть равен нулю на старте.
     
  9. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Morskoivolk
    Получить <1.5К можно с меньшими усилиями, написав этот кейген на С (без CRT, конечно).
    Компилятор сгенерит более эффективный код, чем тот, что ты привёл.
     
  10. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    esi, edi и ebx надо сохранять в DlgProc, а то на 2k не будет нормально работать
     
  11. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    yuzvir
    не обяснишь почему?
    API функции не могут же изменять значения EBP,EBX,EDX,ESI...
     
  12. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    green
    Код (Text):
    1. Компилятор сгенерит более эффективный код, чем тот, что ты привёл
    т.е. получается, что можно оптимизировать на ассме до предела, а потом сделать то же самое на С и получится еще меньше?
    Получается можно накатать прогу на С, потом под отладчиком, например в Оле, запустить ее и посмотреть на более оптимизированный код, а затем можно его скопировать и переделать на ассме и получить улучшенный результат?
    Или же здесь играет решающую роль компилятор С?
     
  13. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Morskoivolk
    И наивно расчитывают, что другие (в данном случае - callback функция DlgProc) тоже не будут портить эти регистры.

    Да, хорошая мысль.
     
  14. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Morskoivolk
    Нет, конечно. :derisive:
    Я имел в виду, что компилятор, скорее всего, сгенерирует более оптимальный код, чем ты. Чтобы переплюнуть хороший компилятор, нужно неслабо разбираться в архитектуре проца.

    ---
    Исключение - использование продвинутых инструкций типа MMX/SSE. Здесь компиляторы пока весьма слабы. Хотя в последняя версия Intel C++ вроде уже умеет оптимизировать с использованием SSE.
     
  15. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    green конечно компиляторы хороши, но они действуют по строгим правилам. Если начнешь разбираться в процце, то запросто компилятор переплюнишь, а этому можно научиться только тогда, когда стремишься к этом.

    Насчет того чтобы посмотреть в ольке: мало того что ты просто скапируешь код, ты должен еще его проанализировать, и разобраться почему он зделал так и почему зделал вот так. А иначе в будущем станешь ходячим Си компилятором :)

    Хочешь вааще маленький размер? Зделай PE заголовок вручную, и консольный тип приложения. Типа вводишь имя и получаешь кейген :)
     
  16. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Или COM (dos, не ole)
    Тогда вообще ни заголовков, ни выравнивания секций... :)
     
  17. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    Ну конечно, о бездумном копировании и речи нету. Все будет фильтроваться и анализироваться. Я к тому, проще увидеть как это делает компилятор, чтобы поянть как надо.
     
  18. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    Конечно на консоли это будет занимать намного меньше, да и быстрее будет по скорости. там API не путаются под руками и окно создавать не надо, не говоря про цикл обработки сообщений))). Да и вообще все это дело можно на Паскале нашлепать
    Но мне хочется именно в Win32 и на родном языке проца, т.е. на ассме.
     
  19. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Думаю, ты немного путаешь. Для консоли апишки тоже нужны. Вот для доса - нет.
     
  20. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    может и путаю))) тока я уже говорил мне хочется на Win32, ну вот хочется и все, что ж тут поделаешь))
    По ходу тему надо закрывать, последние сообщения уже не касаются топика))