1. Assembler / Говнокод #28852

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    format pe console
    include 'win32a.inc'
             sub esp,256
             mov edi,esp
             xor ebx,ebx
         cinvoke puts,.title
    .nxt:cinvoke gets,edi
         cinvoke strlen,eax
            test eax,eax
              jz .ext
             mov ecx,eax
             mov eax,edi
            call hash
            test ebx,ebx
              jz .add
             mov ecx,ebx
             mov edi,esp
           repne scasd
             jnz .add
         cinvoke puts,.yes
         cinvoke sleep,1000
             jmp .nxt
    .add:   push eax
             inc ebx
             mov ecx,eax
             mov eax,edi
            call get_hex
             mov eax,edi
         cinvoke puts,edi
             jmp .nxt
    .ext:cinvoke exit,0
    .title db 'get hash of string',0
    .yes db '!!!hash found!!!',0
    hash:   push ebx esi
             mov esi,eax
             mov eax,ecx
             xor edx,edx
             mov ecx,4
             div ecx
             mov ecx,eax
             xor eax,eax
             mov ebx,$03020100
    .start: test ecx,ecx
              jz .finish
             add eax,[esi]
             add esi,4
             xor eax,ebx
             add ebx,$04040404
            loop .start
    .finish:test edx,edx
              jz .exit
             cmp edx,1
              je .exit1
             add ax,[esi]
             xor ax,bx
             cmp edx,2
              je .exit
             add esi,2
             shr ebx,16
           bswap eax
             add ah,[esi]
             xor ah,bl
           bswap eax
             jmp .exit
    .exit1:  add al,[esi]
             xor al,bl
    .exit:   pop esi ebx
             ret
    get_hex:push ebx edi
             mov edi,eax
             mov ebx,.hex
             mov edx,ecx
             mov ecx,4
           bswap edx
             cld
    .next:   mov al,dl
             shr al,4
           xlatb
           stosb
             mov al,dl
             and al,$0F
           xlatb
           stosb
             shr edx,8
            loop .next
             xor al,al
           stosb
             mov eax,8
             pop edi ebx
             ret
    .hex db '0123456789ABCDEF'
    data import
      library msvcrt,'msvcrt.dll'
      import msvcrt,exit,'exit',puts,'puts',sleep,'_sleep',gets,'gets',strlen,'strlen'
    end data

    Приветствуем любителей накласть.
    Понадобился алгоритм для нахождения хэша строки, наклали.
    Пихает хэши в стэк и проверяет новые на совпадение со старыми.
    У кого есть предложения по его улучшению милости просим!

    Запостил: chiacorp, 20 Сентября 2023

    Комментарии (11) RSS

    • > format pe console
      Это в пиздец.inc
      Ответить
      • Без него не собирает!
        Ответить
      • fasm/nasm/yasm могут сразу генерировать экзешник без линкера, т. е. минуя объектный файл.
        Ответить
        • Этож не "без линкера", а "интегрированный линкер", cl или ml по-майковски.
          И выглядит как говно, директива даже не прагма.
          Что дальше? Иконки описывать?
          Ответить
          • Не совсем. cl и ml — это клей для вызова компилятора, а за ним линкера. Тут же линкер по-настоящему интегрированный, а не как у майков.

            Посмотри на 92-ю строчку. Тут даже импорт описывается.
            Ответить
            • > Тут даже импорт описывается
              Так это же просто мокросы. Выглядят вот так (INCLUDE/MACRO/IMPORT64.INC):
              ; Macroinstructions for making import section (64-bit)
              
              macro library [name,string]
               { common
                  import.data:
                 forward
                  local _label
                  if defined name#.redundant
                   if ~ name#.redundant
                    dd RVA name#.lookup,0,0,RVA _label,RVA name#.address
                   end if
                  end if
                  name#.referred = 1
                 common
                  dd 0,0,0,0,0
                 forward
                  if defined name#.redundant
                   if ~ name#.redundant
                    _label db string,0
              	     rb RVA $ and 1
                   end if
                  end if }
              
              macro import name,[label,string]
               { common
                  rb (- rva $) and 7
                  if defined name#.referred
                   name#.lookup:
                 forward
                   if used label
                    if string eqtype ''
                     local _label
                     dq RVA _label
                    else
                     dq 8000000000000000h + string
                    end if
                   end if
                 common
                   if $ > name#.lookup
                    name#.redundant = 0
                    dq 0
                   else
                    name#.redundant = 1
                   end if
                   name#.address:
                 forward
                   if used label
                    if string eqtype ''
                     label dq RVA _label
                    else
                     label dq 8000000000000000h + string
                    end if
                   end if
                 common
                   if ~ name#.redundant
                    dq 0
                   end if
                 forward
                   if used label & string eqtype ''
                   _label dw 0
              	    db string,0
              	    rb RVA $ and 1
                   end if
                 common
                  end if }
              
              macro api [name] {}
              Ответить
              • Импорт возможно полностью ручками описать, но в ограничение кода 100 строк не влезаем.
                Изначально использовался чистый WinApi не влезли, пришлось юзать сишную либу.
                Ответить
    • Если вы всё равно завязываетесь на сишный рантайм винды, о не лчше ли взять функции хеша из crypto api?

      https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-crypthashdata
      Ответить
      • Завязались из-за ограничения по количеству строк, изначально на WinApi!
        Ответить
    • что лучше WebRTC или WebDMA?
      Ответить

    Добавить комментарий