0xDADA11C7, кажучи про "перфоменси фемен", ви мали на увазі повну безглуздість вчинку, чи сміливість/неординарність/упрямість?

Сумління то страшна річ, страшніша за лінь.

62

(198 відповідей, залишених у Системне програмування)

quez, сенс у використанні випадкового значення на стадії препроцессингу (макроси).

Так, це не погана задача для ознайомлення з нутрощами подібних проектів, спортивний інтерес, ну і для зручності - RtlGenRandom все ж таки краще, аніж я би ліпив коників із суміші декількох технологій, тим паче працює "на стороні" - краще і придумати не можна.

63

(198 відповідей, залишених у Системне програмування)

quez написав:

А чому ви не використовували попереднє значення псевдорандому для генерації наступного?

І не такі милиці було пороблено. Джерело ентропії у даному випадку і для подібної задачі - дуже невдале, а при одночасному запуску декількох процесів FASM - виникає повна або часткова колізія. Працює через раз, що є неприпустимо.

64

(198 відповідей, залишених у Системне програмування)

Є старенька стаття на ксакепі, під назвою "Морфим, не отходя от кассы: Мутация кода во время компиляции". Так ось там розписано про чудові можливості макросів FASM'у, за допомогою яких ми можемо дуже гарно обфускувати сирці.
Основою подібних речей - є генерація випадкових чисел. У тій статті використовувався лінійний конгруентний метод, початковим значенням котрого, є вбудована фішка FASM для отримання timestamp, а саме - %t. Той алгоритм - копія deprecated функції у crt - rand() (натомість, радять використовувати rand_s(), бекендом якої, у windows, є RtlGenRandom).
Значить розвивав я цю тему, пітончик мені генерував FASM'ом різні exe.. морфило доволі непогано. Але потім я запримітив наступне:

use32

min = 0xFFFF
max = 0xFFFFFFFF

rept 10 {
    mov eax, min + %t mod max
}

видає:

mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39

Фіговий seed. Через подібну лажу, виникали "пробіли" (колізії) при генерації. Вирішення? або ж треба ставити sleep() на кожній ітерації, або.. тоді я не додумав - додати функціонал до самого FASM.

Версія FASM, яку ми будемо доповнювати - 1.71.39

Відкриваємо PARSER.INC шукаємо наступне:

    cmp    al,'t'
    je    get_timestamp_id

після нього пишемо:

    cmp al, 'r'
    je get_rnd_id

шукаємо:

      get_org_origin_id:
    mov    eax,3
    ret

після пишемо:

      get_rnd_id:
    mov eax, 4
    ret

Відкриваємо EXPRCALC.INC і шукаємо:

    cmp    eax,3
    je    org_origin_label

після нього пишемо:

    cmp eax, 4
    je rnd_label

шукаємо:

      timestamp_label:
    call    make_timestamp
      make_qword_label_value:
    stos    dword [edi]
    mov    eax,edx
    stos    dword [edi]
    add    edi,0Ch
    jmp    calculation_loop

після нього пишемо

      rnd_label:
    call make_rnd
    stos    dword [edi]
    xor    eax,eax
    stos    dword [edi]
    add    edi,0Ch
    jmp    calculation_loop

У FASM.ASM додаєм нову API:

  dd 0,0,0,rva advapi_name,rva advapi_table

  advapi_table:
    RtlGenRandom dd rva _RtlGenRandom
    dd 0

  advapi_name db 'advapi32.dll', 0

  _RtlGenRandom dw 0
    db 'SystemFunction036', 0

у секції зі змінними (section '.data'), додаєм

pRandomBuffer rd 1

Відкриваємо SYSTEM.INC, та у кінці додаєм наступну процедуру:

make_rnd:
    push 4
    push pRandomBuffer
    call [RtlGenRandom]
    
    cmp eax, 0
    je .err
    
    mov eax, [pRandomBuffer]
    jmp .fin

.err:
    xor eax, eax
    dec eax
.fin:
    ret

Компілюємо. Запускаємо наступний код:

use32

min = 0xFFFF
max = 0xFFFFFFFF

rept 10 {
    mov eax, min + %r mod max
}

маємо:

mov eax, 0xAEE20D07
mov eax, 0x475732CE
mov eax, 0x91EDBD28
mov eax, 0x19F13DFD
mov eax, 0xDA4ED476
mov eax, 0xF6563F6F
mov eax, 0xE3C7984B
mov eax, 0xA6C7CB04
mov eax, 0xDCB228FA
mov eax, 0xF4FD6E45

Інша справа :)

Як ви могли помітити, задля своєї забаганки, ми забронювали %r

65

(14 535 відповідей, залишених у Інше)

VertoX, щодо ремонту, сам нещодавно листи OSB купував, то коли почав його робити (ремонт) - кризи ще не було, а поки його робиш (своїми руками, без посторонніх майстрів), плануєш - час плине, гривня падає, і що, кидати усе це? Залишити бардак? Не варіант, тому ми й бачимо попит на буд. матеріали. Тим паче бюджет заздалегідь було виділено, хоча зараз те ж OSB втридорога виходить..
Зі скигленням теж все просто - "сьогодні - не так як вчора": вчора було більше клієнтів, а сьогодні менше. Мій родич який тримає міні-отель, яскравий приклад подібного "невдоволення" (але все ж таки - клієнти є, тільки різниця в тому, що він ними не перебирає як раніше). Може тут у масштабі справа, не так швидко воно загибається, може це тільки початок краху, хз.. Он фірмові магазини рошен як на дріжжах ростуть)) значить ще не все погано))
Завжди було складно і важко. Саме зараз, важко тому, бо ми бачимо, що життя людини нічого не коштує.. ну і мислення.. все таки, на Заході іншими категоріями мислять аніж ми.
Може зараз іде чітке розподілення на бідних/багатих і ми усі бачимо розквіт теорії золотого мільярду?

66

(14 535 відповідей, залишених у Інше)

VertoX, Знайома має точку з канцелярією на ринку, жалкується, бо дуже мала виручка перед першим вересня, каже, усі пруть до Ашану і там скупляються, і взагалі, цей рік самий гірший за усі що були. Інші друзі мають свою пекарню - скоротили робітників, закрили точки, менше реалізують, замовлень не мають (але у Болгарії з бізом усе ок, через кризу в Україні ще мітять до Китаю). Інші мають багато точок з ремонту одягу - також маленька дупа (поменшало замовлень), але ще не повна.
У нас натовп з фантиками, який тут біз.. платоспроможність просіла, усі економлять.

67

(9 відповідей, залишених у Pascal/Delphi)

Колись юзав Delphi 7 + KOL. Зараз не модно і не треба.

68

(3 відповідей, залишених у Java)

Мабуть знайшов відповідь на своє запитання.

JAXP — библиотека, предоставляющая доступ ко всем методам программной обработки XML-документов. Входит в базовую поставку Java SE. Включает в себя библиотеки из Apache XML Project — Xerces и Xalan. Это стандарт, под который достаточно просто найти уже написанный парсер, распространяемый свободно.

69

(3 відповідей, залишених у Java)

smisha написав:

якщо додати відповідний jar до classpath

В тому й річ, що він уже є у складі rt.jar.

http://i66.сайт-злодій/big/2015/0823/de/5f8905d42e04fa1712541934aeab68de.png

70

(3 відповідей, залишених у Java)

Доброго вечора.

Треба було виконати перетворення byte[] => hex string. Окрім своїх велосипедів, Intellij мені запропонувала використати наступне:

import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;
HexBin.encode(new byte[]{1, 2, 3})

010203

Все ок, але мене збентежило те, що в java 8 api specification цей клас не описано. Нафіга він там є неописаний, і чи можна його використовувати?

Прихований текст

java version "1.8.0_60"

71

(10 відповідей, залишених у C++)

"123" - це вказівник, використовуйте strcpy.
new char - не вказано розмір.

72

(10 відповідей, залишених у Інше)

Оце зараз кожна жаба почне своє болото вихваляти :) 

починаю замислюватися над своїм майбутнім

Чув таку думку, що так як кількість людей/девайсів тільки зростатиме, то виникне потреба у економії/швидкості, тобто як для програмістів, то настане друге пришестя системного шаманства. Коротше кажучи, майбутнє за наукою і космосом, бо те що зараз коїться - шлях в нікуди: усе і нічого, така собі розминка та розподіл сфер.
Висновок: робіть ставку на C++.

73

(16 відповідей, залишених у Інше)

quez написав:
Kane написав:

Стою на ринку - чутно мат, захожу в супермаркет - мат, на трамвайній зупинці - мат (як у "файна юкрайна" в армії, де прапор оре на солдата).

Заходжу на форум програмістів, читаю, що пишуть адміни - мат.

Інет то взагалі смітник. Та я сам не проти кріпкого слівця у реченні, але ж не замість слів, і не з "распальцовкой" перед усіма у людному місці горлопанити..

reverse2500 написав:

Що потрібно зробити, аби змінити світогляд цих людей?

як казав наш прапорщик "Бытье определяет сознание", тут по доброму не вийде

Поліцаїв на усіх не вистачить, тим паче таке діло пахне бунтом, ну і взагалі, багатих тілом і розумом ніхто у владі не любить, ними не проманіпулюєш.

74

(16 відповідей, залишених у Інше)

Накипіло.
Значить хожу пішки у будинку, поверхами нижче/вище - купи попелу з бичками, бруд із ротової порожнини бидла, сміття (при цьому, усі жаліються на двірника). Іду по дорозі, переді мною бидло - плюнуло на тротуар. Стою на ринку - чутно мат, захожу в супермаркет - мат, на трамвайній зупинці - мат (як у "файна юкрайна" в армії, де прапор оре на солдата). Усюди хамовита зарозумілість.. Таких свиней - 40% жителів Києва: що дівчата, що хлопці - однаково, плюс понаїхавших навалом. Ще й на малявок нефігово усі ці звички передаються.

Як би ви поліпшили культуру цього бидланароду? Що потрібно зробити, аби змінити світогляд цих людей??

75

(4 відповідей, залишених у Розваги та гумор)

"Інтерстеллар".

І ще роздуми по темі vm. Бавився я тут із lua/luac, за приклад робив так: вирізав зайве, додав пару своїх функцій, описав роботу скриптом, перетворив у байт-код зашифрувавши його.. Гра здалася цікавою, але знову таки, сенс))

77

(0 відповідей, залишених у Системне програмування)

Ріп https://code.google.com/p/curve25519-donna/

Генеруємо приватний ключ (256 біт) і робимо так:

    (private_key[0] &= 248;
     private_key[31] &= 127;
     private_key[31] |= 64;)

    mov esi, private_key
    and byte[esi], 248
    mov dl, byte[esi + 31]
    and dl, 127
    or dl, 64
    mov byte[esi + 31], dl

Потім:

    stdcall curve25519, public_key_1, private_key_1, basepoint
    stdcall curve25519, public_key_2, private_key_2, basepoint

    stdcall curve25519, shared_key_1, private_key_1, public_key_2
    stdcall curve25519, shared_key_2, private_key_2, public_key_1

    basepoint db 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
              db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

В підсумку: shared_key_1 == shared_key_2
Розмір шеллкоду 6809 байт.


curve25519.asm

    use32

curve25519:
    push ebp
    mov ebp, esp
    and esp, 0FFFFFFF8h
    sub esp, 118h
    push 20h
    push dword[ebp + 0Ch]
    lea eax, [esp + 8h]
    push eax
    mov edi, dword[esp]
    mov esi, dword[esp + 4]
    mov ecx, dword[esp + 8]
    rep movsb
    mov al, byte[esp + 2Bh]
    lea ecx, [esp + 2Ch]
    mov edx, dword[ebp + 10h]
    and al, 3Fh
    and byte[esp + 0Ch], 0F8h
    add esp, 0Ch
    or al, 40h
    mov byte[esp + 1Fh], al
    call @13
    lea eax, [esp + 20h]
    push eax
    lea eax, [esp + 4h]
    push eax
    lea edx, [esp + 78h]
    lea ecx, [esp + 0D0h]
    call @34
    lea edx, [esp + 70h]
    lea ecx, [esp + 20h]
    call @37
    lea eax, [esp + 20h]
    push eax
    lea edx, [esp + 0CCh]
    lea ecx, [esp + 74h]
    call @10
    mov ecx, dword[ebp + 8h]
    lea edx, [esp + 70h]
    call @15
    xor eax, eax
    leave
    ret 0Ch

@02:
    push ebx
    push esi
    push edi
    mov ebx, edx
    lea esi, [ecx + 8h]
    xor edi, edi
    sub edx, ecx

@03:
    mov eax, dword[edi * 8h + ebx]
    add dword[esi - 8h], eax
    mov eax, dword[edi * 8h + ebx + 4h]
    adc dword[esi - 4h], eax
    mov eax, dword[esi + edx]
    add dword[esi], eax
    mov eax, dword[esi + edx + 4h]
    adc dword[esi + 4h], eax
    add edi, 2h
    lea esi, [esi + 10h]
    cmp edi, 0Ah
    jb @03
    pop edi
    pop esi
    pop ebx
    ret

@04:
    push esi
    push edi
    mov esi, edx
    push 0Ah
    sub esi, ecx
    pop edi

@05:
    mov edx, dword[ecx + esi]
    sub edx, dword[ecx]
    mov eax, dword[ecx + esi + 4h]
    sbb eax, dword[ecx + 4h]
    mov dword[ecx], edx
    lea ecx, [ecx + 8h]
    mov dword[ecx - 4h], eax
    sub edi, 1h
    jne @05
    pop edi
    pop esi
    ret

@06:
    push ebp
    mov ebp, esp
    push ecx
    push ebx
    mov ebx, edx
    mov dword[ebp - 4h], ecx
    push esi
    push edi
    mov edi, dword[ebp + 8h]
    mov eax, dword[ebx]
    imul dword[edi]
    mov dword[ecx], eax
    mov dword[ecx + 4h], edx
    mov eax, dword[ebx + 8h]
    imul dword[edi]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx]
    imul dword[edi + 8h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 8h], ecx
    mov dword[eax + 0Ch], esi
    mov eax, dword[ebx + 8h]
    imul dword[edi + 8h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx]
    imul dword[edi + 10h]
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebx + 10h]
    adc esi, edx
    imul dword[edi]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 10h], ecx
    mov dword[eax + 14h], esi
    mov eax, dword[ebx]
    imul dword[edi + 18h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 8h]
    imul dword[edi + 10h]
    add ecx, eax
    mov eax, dword[ebx + 10h]
    adc esi, edx
    imul dword[edi + 8h]
    add ecx, eax
    mov eax, dword[ebx + 18h]
    adc esi, edx
    imul dword[edi]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 18h], ecx
    mov dword[eax + 1Ch], esi
    mov eax, dword[ebx + 18h]
    imul dword[edi + 8h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 8h]
    imul dword[edi + 18h]
    add ecx, eax
    mov eax, dword[ebx + 10h]
    adc esi, edx
    imul dword[edi + 10h]
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebx + 20h]
    adc esi, edx
    imul dword[edi]
    add ecx, eax
    mov eax, dword[ebx]
    adc esi, edx
    imul dword[edi + 20h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 20h], ecx
    mov dword[eax + 24h], esi
    mov eax, dword[ebx]
    imul dword[edi + 28h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 8h]
    imul dword[edi + 20h]
    add ecx, eax
    mov eax, dword[ebx + 18h]
    adc esi, edx
    imul dword[edi + 10h]
    add ecx, eax
    mov eax, dword[ebx + 20h]
    adc esi, edx
    imul dword[edi + 8h]
    add ecx, eax
    mov eax, dword[ebx + 28h]
    adc esi, edx
    imul dword[edi]
    add ecx, eax
    mov eax, dword[ebx + 10h]
    adc esi, edx
    imul dword[edi + 18h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 28h], ecx
    mov dword[eax + 2Ch], esi
    mov eax, dword[ebx + 18h]
    imul dword[edi + 18h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 28h]
    imul dword[edi + 8h]
    add ecx, eax
    mov eax, dword[ebx + 8h]
    adc esi, edx
    imul dword[edi + 28h]
    add ecx, eax
    mov eax, dword[ebx + 20h]
    adc esi, edx
    imul dword[edi + 10h]
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebx]
    adc esi, edx
    imul dword[edi + 30h]
    add ecx, eax
    mov eax, dword[ebx + 30h]
    adc esi, edx
    imul dword[edi]
    add ecx, eax
    mov eax, dword[ebx + 10h]
    adc esi, edx
    imul dword[edi + 20h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 30h], ecx
    mov dword[eax + 34h], esi
    mov eax, dword[ebx + 18h]
    imul dword[edi + 20h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 10h]
    imul dword[edi + 28h]
    add ecx, eax
    mov eax, dword[ebx + 28h]
    adc esi, edx
    imul dword[edi + 10h]
    add ecx, eax
    mov eax, dword[ebx + 30h]
    adc esi, edx
    imul dword[edi + 8h]
    add ecx, eax
    mov eax, dword[ebx + 20h]
    adc esi, edx
    imul dword[edi + 18h]
    add ecx, eax
    adc esi, edx
    mov eax, dword[ebx]
    imul dword[edi + 38h]
    add ecx, eax
    mov eax, dword[ebx + 8h]
    adc esi, edx
    imul dword[edi + 30h]
    add ecx, eax
    mov eax, dword[ebx + 38h]
    adc esi, edx
    imul dword[edi]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 38h], ecx
    mov dword[eax + 3Ch], esi
    mov eax, dword[ebx + 38h]
    imul dword[edi + 8h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 8h]
    imul dword[edi + 38h]
    add ecx, eax
    mov eax, dword[ebx + 18h]
    adc esi, edx
    imul dword[edi + 28h]
    add ecx, eax
    mov eax, dword[ebx + 28h]
    adc esi, edx
    imul dword[edi + 18h]
    add ecx, eax
    mov eax, dword[ebx + 10h]
    adc esi, edx
    imul dword[edi + 30h]
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebx + 20h]
    adc esi, edx
    imul dword[edi + 20h]
    add ecx, eax
    mov eax, dword[ebx]
    adc esi, edx
    imul dword[edi + 40h]
    add ecx, eax
    mov eax, dword[ebx + 30h]
    adc esi, edx
    imul dword[edi + 10h]
    add ecx, eax
    mov eax, dword[ebx + 40h]
    adc esi, edx
    imul dword[edi]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 40h], ecx
    mov dword[eax + 44h], esi
    mov eax, dword[ebx + 20h]
    imul dword[edi + 28h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 40h]
    imul dword[edi + 8h]
    add ecx, eax
    mov eax, dword[ebx]
    adc esi, edx
    imul dword[edi + 48h]
    add ecx, eax
    mov eax, dword[ebx + 48h]
    adc esi, edx
    imul dword[edi]
    add ecx, eax
    mov eax, dword[ebx + 8h]
    adc esi, edx
    imul dword[edi + 40h]
    add ecx, eax
    mov eax, dword[ebx + 30h]
    adc esi, edx
    imul dword[edi + 18h]
    add ecx, eax
    mov eax, dword[ebx + 18h]
    adc esi, edx
    imul dword[edi + 30h]
    add ecx, eax
    mov eax, dword[ebx + 38h]
    adc esi, edx
    imul dword[edi + 10h]
    add ecx, eax
    mov eax, dword[ebx + 10h]
    adc esi, edx
    imul dword[edi + 38h]
    add ecx, eax
    mov eax, dword[ebx + 28h]
    adc esi, edx
    imul dword[edi + 20h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 48h], ecx
    mov dword[eax + 4Ch], esi
    mov eax, dword[ebx + 18h]
    imul dword[edi + 38h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 38h]
    imul dword[edi + 18h]
    add ecx, eax
    mov eax, dword[ebx + 48h]
    adc esi, edx
    imul dword[edi + 8h]
    add ecx, eax
    mov eax, dword[ebx + 28h]
    adc esi, edx
    imul dword[edi + 28h]
    add ecx, eax
    mov eax, dword[ebx + 8h]
    adc esi, edx
    imul dword[edi + 48h]
    add ecx, eax
    mov eax, dword[ebx + 20h]
    adc esi, edx
    imul dword[edi + 30h]
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebx + 30h]
    adc esi, edx
    imul dword[edi + 20h]
    add ecx, eax
    mov eax, dword[ebx + 40h]
    adc esi, edx
    imul dword[edi + 10h]
    add ecx, eax
    mov eax, dword[ebx + 10h]
    adc esi, edx
    imul dword[edi + 40h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 50h], ecx
    mov dword[eax + 54h], esi
    mov eax, dword[ebx + 18h]
    imul dword[edi + 40h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 38h]
    imul dword[edi + 20h]
    add ecx, eax
    mov eax, dword[ebx + 40h]
    adc esi, edx
    imul dword[edi + 18h]
    add ecx, eax
    mov eax, dword[ebx + 10h]
    adc esi, edx
    imul dword[edi + 48h]
    add ecx, eax
    mov eax, dword[ebx + 28h]
    adc esi, edx
    imul dword[edi + 30h]
    add ecx, eax
    mov eax, dword[ebx + 20h]
    adc esi, edx
    imul dword[edi + 38h]
    add ecx, eax
    mov eax, dword[ebx + 30h]
    adc esi, edx
    imul dword[edi + 28h]
    add ecx, eax
    mov eax, dword[ebx + 48h]
    adc esi, edx
    imul dword[edi + 10h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 58h], ecx
    mov dword[eax + 5Ch], esi
    mov eax, dword[ebx + 48h]
    imul dword[edi + 18h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 38h]
    imul dword[edi + 28h]
    add ecx, eax
    mov eax, dword[ebx + 18h]
    adc esi, edx
    imul dword[edi + 48h]
    add ecx, eax
    mov eax, dword[ebx + 28h]
    adc esi, edx
    imul dword[edi + 38h]
    add ecx, eax
    mov eax, dword[ebx + 40h]
    adc esi, edx
    imul dword[edi + 20h]
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebx + 20h]
    adc esi, edx
    imul dword[edi + 40h]
    add ecx, eax
    mov eax, dword[ebx + 30h]
    adc esi, edx
    imul dword[edi + 30h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 60h], ecx
    mov dword[eax + 64h], esi
    mov eax, dword[ebx + 20h]
    imul dword[edi + 48h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 30h]
    imul dword[edi + 38h]
    add ecx, eax
    mov eax, dword[ebx + 48h]
    adc esi, edx
    imul dword[edi + 20h]
    add ecx, eax
    mov eax, dword[ebx + 38h]
    adc esi, edx
    imul dword[edi + 30h]
    add ecx, eax
    mov eax, dword[ebx + 40h]
    adc esi, edx
    imul dword[edi + 28h]
    add ecx, eax
    mov eax, dword[ebx + 28h]
    adc esi, edx
    imul dword[edi + 40h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 68h], ecx
    mov dword[eax + 6Ch], esi
    mov eax, dword[ebx + 38h]
    imul dword[edi + 38h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 28h]
    imul dword[edi + 48h]
    add ecx, eax
    adc esi, edx
    mov eax, dword[ebx + 48h]
    imul dword[edi + 28h]
    add ecx, eax
    mov eax, dword[ebx + 30h]
    adc esi, edx
    imul dword[edi + 40h]
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebx + 40h]
    adc esi, edx
    imul dword[edi + 30h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 70h], ecx
    mov dword[eax + 74h], esi
    mov eax, dword[ebx + 38h]
    imul dword[edi + 40h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 40h]
    imul dword[edi + 38h]
    add ecx, eax
    mov eax, dword[ebx + 30h]
    adc esi, edx
    imul dword[edi + 48h]
    add ecx, eax
    mov eax, dword[ebx + 48h]
    adc esi, edx
    imul dword[edi + 30h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 78h], ecx
    mov dword[eax + 7Ch], esi
    mov eax, dword[ebx + 48h]
    imul dword[edi + 38h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 38h]
    imul dword[edi + 48h]
    add ecx, eax
    mov eax, dword[ebx + 40h]
    adc esi, edx
    imul dword[edi + 40h]
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 80h], ecx
    mov dword[eax + 84h], esi
    mov eax, dword[ebx + 48h]
    imul dword[edi + 40h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebx + 40h]
    imul dword[edi + 48h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 88h], ecx
    mov ecx, eax
    mov dword[ecx + 8Ch], esi
    mov eax, dword[ebx + 48h]
    imul dword[edi + 48h]
    pop edi
    shld edx, eax, 1h
    pop esi
    add eax, eax
    mov dword[ecx + 94h], edx
    mov dword[ecx + 90h], eax
    pop ebx
    leave
    ret 4h

@07:
    push ebx
    mov ebx, ecx
    push esi
    push edi
    mov esi, dword[ebx + 90h]
    mov eax, esi
    mov edi, dword[ebx + 94h]
    mov edx, edi
    shld edx, eax, 4h
    mov ecx, edi
    shl eax, 4h
    add dword[ebx + 40h], eax
    mov eax, esi
    adc dword[ebx + 44h], edx
    shld ecx, eax, 1h
    mov edx, dword[ebx + 88h]
    add eax, eax
    add dword[ebx + 40h], eax
    mov eax, edx
    adc dword[ebx + 44h], ecx
    add dword[ebx + 40h], esi
    mov esi, dword[ebx + 8Ch]
    mov ecx, esi
    adc dword[ebx + 44h], edi
    shld ecx, eax, 4h
    shl eax, 4h
    add dword[ebx + 38h], eax
    mov eax, edx
    adc dword[ebx + 3Ch], ecx
    mov ecx, esi
    shld ecx, eax, 1h
    add eax, eax
    add dword[ebx + 38h], eax
    adc dword[ebx + 3Ch], ecx
    add dword[ebx + 38h], edx
    mov edx, dword[ebx + 80h]
    mov eax, edx
    adc dword[ebx + 3Ch], esi
    mov esi, dword[ebx + 84h]
    mov ecx, esi
    shld ecx, eax, 4h
    shl eax, 4h
    add dword[ebx + 30h], eax
    mov eax, edx
    adc dword[ebx + 34h], ecx
    mov ecx, esi
    shld ecx, eax, 1h
    add eax, eax
    add dword[ebx + 30h], eax
    adc dword[ebx + 34h], ecx
    add dword[ebx + 30h], edx
    mov edx, dword[ebx + 78h]
    mov eax, edx
    adc dword[ebx + 34h], esi
    mov esi, dword[ebx + 7Ch]
    mov ecx, esi
    shld ecx, eax, 4h
    shl eax, 4h
    add dword[ebx + 28h], eax
    mov eax, edx
    adc dword[ebx + 2Ch], ecx
    mov ecx, esi
    shld ecx, eax, 1h
    add eax, eax
    add dword[ebx + 28h], eax
    adc dword[ebx + 2Ch], ecx
    add dword[ebx + 28h], edx
    mov edx, dword[ebx + 70h]
    mov eax, edx
    adc dword[ebx + 2Ch], esi
    mov esi, dword[ebx + 74h]
    mov ecx, esi
    shld ecx, eax, 4h
    shl eax, 4h
    add dword[ebx + 20h], eax
    mov eax, edx
    adc dword[ebx + 24h], ecx
    mov ecx, esi
    shld ecx, eax, 1h
    add eax, eax
    add dword[ebx + 20h], eax
    adc dword[ebx + 24h], ecx
    add dword[ebx + 20h], edx
    mov edx, dword[ebx + 68h]
    mov eax, edx
    adc dword[ebx + 24h], esi
    mov esi, dword[ebx + 6Ch]
    mov ecx, esi
    shld ecx, eax, 4h
    pop edi
    shl eax, 4h
    add dword[ebx + 18h], eax
    mov eax, edx
    adc dword[ebx + 1Ch], ecx
    mov ecx, esi
    shld ecx, eax, 1h
    add eax, eax
    add dword[ebx + 18h], eax
    adc dword[ebx + 1Ch], ecx
    add dword[ebx + 18h], edx
    mov edx, dword[ebx + 60h]
    mov eax, edx
    adc dword[ebx + 1Ch], esi
    mov esi, dword[ebx + 64h]
    mov ecx, esi
    shld ecx, eax, 4h
    shl eax, 4h
    add dword[ebx + 10h], eax
    mov eax, edx
    adc dword[ebx + 14h], ecx
    mov ecx, esi
    shld ecx, eax, 1h
    add eax, eax
    add dword[ebx + 10h], eax
    adc dword[ebx + 14h], ecx
    add dword[ebx + 10h], edx
    mov edx, dword[ebx + 58h]
    mov eax, edx
    adc dword[ebx + 14h], esi
    mov esi, dword[ebx + 5Ch]
    mov ecx, esi
    shld ecx, eax, 4h
    shl eax, 4h
    add dword[ebx + 8h], eax
    mov eax, edx
    adc dword[ebx + 0Ch], ecx
    mov ecx, esi
    shld ecx, eax, 1h
    add eax, eax
    add dword[ebx + 8h], eax
    adc dword[ebx + 0Ch], ecx
    add dword[ebx + 8h], edx
    mov edx, dword[ebx + 50h]
    mov eax, edx
    adc dword[ebx + 0Ch], esi
    mov esi, dword[ebx + 54h]
    mov ecx, esi
    shld ecx, eax, 4h
    shl eax, 4h
    add dword[ebx], eax
    mov eax, edx
    adc dword[ebx + 4h], ecx
    mov ecx, esi
    shld ecx, eax, 1h
    add eax, eax
    add dword[ebx], eax
    adc dword[ebx + 4h], ecx
    add dword[ebx], edx
    adc dword[ebx + 4h], esi
    pop esi
    pop ebx
    ret

@08:
    push ebp
    mov ebp, esp
    sub esp, 0Ch
    and dword[ecx + 50h], 00000000h
    lea eax, [ecx + 8h]
    and dword[ecx + 54h], 00000000h
    push ebx
    push esi
    push edi
    mov dword[ebp - 0Ch], ecx
    mov dword[ebp - 4h], eax
    mov dword[ebp - 8h], 5h

@09:
    mov ebx, dword[eax - 8h]
    mov edi, dword[eax - 4h]
    mov eax, edi
    sar eax, 1Fh
    shr eax, 6h
    cdq
    mov esi, eax
    add esi, ebx
    adc edx, edi
    shrd esi, edx, 1Ah
    sar edx, 1Ah
    mov eax, esi
    mov ecx, edx
    shld ecx, eax, 1Ah
    shl eax, 1Ah
    sub ebx, eax
    mov eax, dword[ebp - 4h]
    sbb edi, ecx
    add dword[eax], esi
    mov dword[eax - 8h], ebx
    adc dword[eax + 4h], edx
    mov ebx, dword[eax]
    mov dword[eax - 4h], edi
    mov edi, dword[eax + 4h]
    mov eax, edi
    sar eax, 1Fh
    shr eax, 7h
    cdq
    mov esi, eax
    add esi, ebx
    adc edx, edi
    shrd esi, edx, 19h
    sar edx, 19h
    mov eax, esi
    mov ecx, edx
    shld ecx, eax, 19h
    shl eax, 19h
    sub ebx, eax
    mov eax, dword[ebp - 4h]
    sbb edi, ecx
    add dword[eax + 8h], esi
    mov dword[eax], ebx
    adc dword[eax + 0Ch], edx
    mov dword[eax + 4h], edi
    add eax, 10h
    sub dword[ebp - 8h], 1h
    mov dword[ebp - 4h], eax
    jne @09
    mov edi, dword[ebp - 0Ch]
    mov edx, dword[edi + 50h]
    mov eax, edx
    mov esi, dword[edi + 54h]
    mov ecx, esi
    shld ecx, eax, 4h
    shl eax, 4h
    add dword[edi], eax
    mov eax, edx
    adc dword[edi + 4h], ecx
    mov ecx, esi
    shld ecx, eax, 1h
    add eax, eax
    add dword[edi], eax
    adc dword[edi + 4h], ecx
    add dword[edi], edx
    mov ebx, dword[edi]
    adc dword[edi + 4h], esi
    and dword[edi + 50h], 00000000h
    and dword[edi + 54h], 00000000h
    mov edi, dword[edi + 4h]
    mov eax, edi
    sar eax, 1Fh
    shr eax, 6h
    cdq
    mov esi, eax
    add esi, ebx
    adc edx, edi
    shrd esi, edx, 1Ah
    sar edx, 1Ah
    mov eax, esi
    mov ecx, edx
    shld ecx, eax, 1Ah
    shl eax, 1Ah
    sub ebx, eax
    sbb edi, ecx
    mov ecx, dword[ebp - 0Ch]
    add dword[ecx + 8h], esi
    mov dword[ecx + 4h], edi
    adc dword[ecx + 0Ch], edx
    pop edi
    pop esi
    mov dword[ecx], ebx
    pop ebx
    leave
    ret

@10:
    push ebp
    mov ebp, esp
    sub esp, 9Ch
    push esi
    push edi
    push dword[ebp + 8h]
    mov edi, ecx
    lea ecx, [ebp - 9Ch]
    call @06
    lea ecx, [ebp - 9Ch]
    call @07
    lea ecx, [ebp - 9Ch]
    call @08
    push 14h
    pop ecx
    lea esi, [ebp - 9Ch]
    rep movsd
    pop edi
    pop esi
    leave
    ret 4h

@11:
    push ebp
    mov ebp, esp
    sub esp, 20h
    push ebx
    push esi
    push edi
    mov edi, edx
    mov dword[ebp - 4h], ecx
    mov eax, dword[edi]
    imul eax
    mov ebx, dword[edi + 8h]
    mov dword[ecx], eax
    mov eax, dword[edi]
    mov dword[ecx + 4h], edx
    imul ebx
    shld edx, eax, 1h
    add eax, eax
    mov dword[ecx + 0Ch], edx
    mov dword[ecx + 8h], eax
    mov ecx, dword[edi + 10h]
    mov eax, dword[edi]
    imul ecx
    mov dword[ebp - 20h], ecx
    mov ecx, eax
    mov esi, edx
    mov eax, ebx
    imul ebx
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    shld esi, ecx, 1h
    mov dword[eax + 14h], esi
    add ecx, ecx
    mov dword[eax + 10h], ecx
    mov ecx, dword[edi + 18h]
    mov eax, dword[edi]
    imul ecx
    mov dword[ebp - 18h], ecx
    mov ecx, eax
    mov esi, edx
    mov eax, ebx
    imul dword[edi + 10h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    shld esi, ecx, 1h
    mov dword[eax + 1Ch], esi
    add ecx, ecx
    mov dword[eax + 18h], ecx
    mov eax, dword[edi + 20h]
    mov dword[ebp - 14h], eax
    mov eax, ebx
    imul dword[edi + 18h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[edi]
    imul dword[edi + 20h]
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[edi + 10h]
    adc esi, edx
    imul eax
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 20h], ecx
    mov ecx, dword[edi + 28h]
    mov dword[eax + 24h], esi
    mov eax, dword[edi]
    imul ecx
    mov dword[ebp - 10h], ecx
    mov ecx, eax
    mov esi, edx
    mov eax, ebx
    imul dword[edi + 20h]
    add ecx, eax
    mov eax, dword[edi + 10h]
    adc esi, edx
    imul dword[edi + 18h]
    add ecx, eax
    adc esi, edx
    shld esi, ecx, 1h
    mov eax, dword[ebp - 4h]
    add ecx, ecx
    mov dword[eax + 28h], ecx
    mov dword[eax + 2Ch], esi
    mov eax, dword[edi + 30h]
    mov dword[ebp - 8h], eax
    mov eax, ebx
    imul dword[edi + 28h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[edi]
    imul dword[edi + 30h]
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[edi + 10h]
    adc esi, edx
    imul dword[edi + 20h]
    add ecx, eax
    mov eax, dword[edi + 18h]
    adc esi, edx
    imul eax
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    shld esi, ecx, 1h
    mov dword[eax + 34h], esi
    add ecx, ecx
    mov dword[eax + 30h], ecx
    mov ecx, dword[edi + 38h]
    mov eax, dword[edi]
    imul ecx
    mov dword[ebp - 0Ch], ecx
    mov ecx, eax
    mov esi, edx
    mov eax, ebx
    imul dword[edi + 30h]
    add ecx, eax
    mov eax, dword[edi + 10h]
    adc esi, edx
    imul dword[edi + 28h]
    add ecx, eax
    mov eax, dword[edi + 18h]
    adc esi, edx
    imul dword[edi + 20h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    shld esi, ecx, 1h
    mov dword[eax + 3Ch], esi
    add ecx, ecx
    mov dword[eax + 38h], ecx
    mov eax, ebx
    imul dword[edi + 38h]
    mov ebx, dword[edi + 48h]
    mov ecx, eax
    mov esi, edx
    mov eax, dword[edi + 18h]
    imul dword[edi + 28h]
    add ecx, eax
    mov eax, dword[edi]
    adc esi, edx
    imul dword[edi + 40h]
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[edi + 10h]
    adc esi, edx
    imul dword[edi + 30h]
    add ecx, eax
    mov eax, dword[edi + 20h]
    adc esi, edx
    imul eax
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 40h], ecx
    mov dword[eax + 44h], esi
    mov eax, dword[edi]
    imul ebx
    mov ecx, eax
    mov esi, edx
    mov eax, dword[edi + 8h]
    imul dword[edi + 40h]
    add ecx, eax
    mov eax, dword[edi + 10h]
    adc esi, edx
    imul dword[edi + 38h]
    add ecx, eax
    mov eax, dword[edi + 18h]
    adc esi, edx
    imul dword[edi + 30h]
    add ecx, eax
    mov eax, dword[edi + 20h]
    adc esi, edx
    imul dword[edi + 28h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    shld esi, ecx, 1h
    mov dword[eax + 4Ch], esi
    add ecx, ecx
    mov dword[eax + 48h], ecx
    mov eax, dword[edi + 8h]
    imul ebx
    mov ecx, eax
    mov esi, edx
    mov eax, dword[edi + 18h]
    imul dword[edi + 38h]
    add ecx, eax
    mov eax, dword[edi + 10h]
    mov edi, dword[edi + 40h]
    adc esi, edx
    imul edi
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebp - 14h]
    adc esi, edx
    imul dword[ebp - 8h]
    add ecx, eax
    mov eax, dword[ebp - 10h]
    adc esi, edx
    imul eax
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    shld esi, ecx, 1h
    mov dword[eax + 54h], esi
    add ecx, ecx
    mov dword[eax + 50h], ecx
    mov eax, dword[ebp - 20h]
    imul ebx
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebp - 18h]
    imul edi
    add ecx, eax
    mov eax, dword[ebp - 14h]
    adc esi, edx
    imul dword[ebp - 0Ch]
    add ecx, eax
    mov eax, dword[ebp - 10h]
    adc esi, edx
    imul dword[ebp - 8h]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    shld esi, ecx, 1h
    add ecx, ecx
    mov dword[eax + 5Ch], esi
    mov dword[eax + 58h], ecx
    mov eax, dword[ebp - 18h]
    imul ebx
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebp - 10h]
    imul dword[ebp - 0Ch]
    add ecx, eax
    adc esi, edx
    mov eax, dword[ebp - 14h]
    imul edi
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebp - 8h]
    adc esi, edx
    imul eax
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 60h], ecx
    mov dword[eax + 64h], esi
    mov eax, dword[ebp - 14h]
    imul ebx
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebp - 10h]
    imul edi
    add ecx, eax
    mov eax, dword[ebp - 8h]
    adc esi, edx
    imul dword[ebp - 0Ch]
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    shld esi, ecx, 1h
    mov dword[eax + 6Ch], esi
    add ecx, ecx
    mov dword[eax + 68h], ecx
    mov eax, dword[ebp - 10h]
    imul ebx
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebp - 8h]
    imul edi
    shld esi, ecx, 1h
    add ecx, ecx
    add ecx, eax
    mov eax, dword[ebp - 0Ch]
    adc esi, edx
    imul eax
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    shld esi, ecx, 1h
    mov dword[eax + 74h], esi
    add ecx, ecx
    mov dword[eax + 70h], ecx
    mov eax, dword[ebp - 8h]
    imul ebx
    mov ecx, eax
    mov esi, edx
    mov eax, dword[ebp - 0Ch]
    imul edi
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    shld esi, ecx, 1h
    mov dword[eax + 7Ch], esi
    add ecx, ecx
    mov dword[eax + 78h], ecx
    mov eax, dword[ebp - 0Ch]
    imul ebx
    mov ecx, eax
    mov esi, edx
    shld esi, ecx, 2h
    mov eax, edi
    imul edi
    shl ecx, 2h
    add ecx, eax
    mov eax, dword[ebp - 4h]
    adc esi, edx
    mov dword[eax + 80h], ecx
    mov ecx, eax
    mov eax, edi
    imul ebx
    mov dword[ecx + 84h], esi
    shld edx, eax, 1h
    pop edi
    add eax, eax
    mov dword[ecx + 8Ch], edx
    mov dword[ecx + 88h], eax
    mov eax, ebx
    imul ebx
    pop esi
    shld edx, eax, 1h
    pop ebx
    add eax, eax
    mov dword[ecx + 94h], edx
    mov dword[ecx + 90h], eax
    leave
    ret

@12:
    push ebp
    mov ebp, esp
    sub esp, 98h
    push esi
    push edi
    mov edi, ecx
    lea ecx, [ebp - 98h]
    call @11
    lea ecx, [ebp - 98h]
    call @07
    lea ecx, [ebp - 98h]
    call @08
    push 14h
    pop ecx
    lea esi, [ebp - 98h]
    rep movsd
    pop edi
    pop esi
    leave
    ret

@13:
    push ebp
    mov ebp, esp
    sub esp, 0Ch
    mov dword[ebp - 0Ch], ecx
    mov ecx, edx
    mov dword[ebp - 8h], edx
    push ebx
    push esi
    mov bl, byte[ecx + 3h]
    push edi
    movzx eax, bl
    cdq
    mov edi, eax
    shr bl, 2h
    movzx eax, byte[ecx + 2h]
    mov esi, edx
    cdq
    shld esi, edi, 8h
    or esi, edx
    shl edi, 8h
    or edi, eax
    movzx eax, byte[ecx]
    cdq
    shld esi, edi, 10h
    xor esi, esi
    shl edi, 10h
    or edi, eax
    movzx eax, byte[ecx + 1h]
    cdq
    xor ecx, ecx
    and eax, 0003FFFFh
    and edi, 03FFFFFFh
    shld ecx, eax, 8h
    shl eax, 8h
    or esi, ecx
    mov ecx, dword[ebp - 8h]
    or edi, eax
    mov eax, dword[ebp - 0Ch]
    mov dword[eax + 4h], esi
    mov dword[eax], edi
    mov al, byte[ecx + 6h]
    mov byte[ebp - 1h], al
    and al, 07h
    movzx eax, al
    cdq
    mov esi, eax
    mov edi, edx
    movzx eax, byte[ecx + 5h]
    shld edi, esi, 8h
    cdq
    and eax, 000007FFh
    shl esi, 8h
    or esi, eax
    movzx eax, byte[ecx + 4h]
    cdq
    mov ecx, eax
    movzx eax, bl
    shld edx, ecx, 6h
    shld edi, esi, 0Eh
    cdq
    shl ecx, 6h
    or ecx, eax
    shl esi, 0Eh
    mov eax, dword[ebp - 0Ch]
    and ecx, 01FFFFFFh
    or esi, ecx
    mov ecx, dword[ebp - 8h]
    mov dword[eax + 8h], esi
    mov bh, byte[ecx + 9h]
    mov dword[eax + 0Ch], edi
    mov al, bh
    and al, 1Fh
    movzx eax, al
    cdq
    mov esi, eax
    mov edi, edx
    movzx eax, byte[ecx + 8h]
    shld edi, esi, 8h
    cdq
    shl esi, 8h
    and eax, 00001FFFh
    or esi, eax
    shld edi, esi, 0Dh
    shl esi, 0Dh
    movzx eax, byte[ecx + 7h]
    cdq
    mov ecx, eax
    shr bh, 5h
    mov al, byte[ebp - 1h]
    shld edx, ecx, 5h
    shr al, 3h
    movzx eax, al
    cdq
    shl ecx, 5h
    or ecx, eax
    mov eax, dword[ebp - 0Ch]
    and ecx, 03FFFFFFh
    or esi, ecx
    mov ecx, dword[ebp - 8h]
    mov dword[eax + 10h], esi
    mov dword[eax + 14h], edi
    mov bl, byte[ecx + 0Ch]
    mov al, bl
    shr bl, 6h
    and al, 3Fh
    movzx eax, al
    cdq
    mov esi, eax
    mov edi, edx
    movzx eax, byte[ecx + 0Bh]
    shld edi, esi, 8h
    cdq
    and eax, 00003FFFh
    shl esi, 8h
    or esi, eax
    movzx eax, byte[ecx + 0Ah]
    cdq
    mov ecx, eax
    movzx eax, bh
    shld edx, ecx, 3h
    shld edi, esi, 0Bh
    cdq
    shl ecx, 3h
    or ecx, eax
    shl esi, 0Bh
    mov eax, dword[ebp - 0Ch]
    and ecx, 01FFFFFFh
    or esi, ecx
    mov ecx, dword[ebp - 8h]
    mov dword[eax + 18h], esi
    mov dword[eax + 1Ch], edi
    movzx eax, byte[ecx + 0Fh]
    cdq
    mov esi, eax
    mov edi, edx
    movzx eax, byte[ecx + 0Eh]
    cdq
    movzx ecx, ax
    mov eax, dword[ebp - 8h]
    shld edi, esi, 8h
    shl esi, 8h
    movzx eax, byte[eax + 0Dh]
    or esi, ecx
    cdq
    mov ecx, eax
    movzx eax, bl
    shld edx, ecx, 2h
    shld edi, esi, 0Ah
    shl ecx, 2h
    cdq
    or ecx, eax
    shl esi, 0Ah
    mov eax, dword[ebp - 0Ch]
    and ecx, 03FFFFFFh
    or esi, ecx
    mov dword[eax + 20h], esi
    mov esi, dword[ebp - 8h]
    mov dword[eax + 24h], edi
    mov bl, byte[esi + 13h]
    movzx eax, bl
    cdq
    mov edi, eax
    mov ecx, edx
    shld ecx, edi, 8h
    shl edi, 8h
    movzx eax, byte[esi + 12h]
    cdq
    or edi, eax
    shr bl, 1h
    movzx eax, byte[esi + 10h]
    or ecx, edx
    cdq
    xor esi, esi
    shld ecx, edi, 10h
    xor ecx, ecx
    shl edi, 10h
    or edi, eax
    mov eax, dword[ebp - 8h]
    and edi, 01FFFFFFh
    movzx eax, byte[eax + 11h]
    cdq
    and eax, 0001FFFFh
    shld ecx, eax, 8h
    shl eax, 8h
    or esi, ecx
    mov ecx, dword[ebp - 8h]
    or edi, eax
    mov eax, dword[ebp - 0Ch]
    mov bh, byte[ecx + 16h]
    mov dword[eax + 2Ch], esi
    mov dword[eax + 28h], edi
    mov al, bh
    and al, 07h
    shr bh, 3h
    movzx eax, al
    cdq
    mov esi, eax
    mov edi, edx
    movzx eax, byte[ecx + 15h]
    cdq
    and eax, 000007FFh
    shld edi, esi, 8h
    shl esi, 8h
    or esi, eax
    movzx eax, byte[ecx + 14h]
    cdq
    mov ecx, eax
    movzx eax, bl
    shld edx, ecx, 7h
    cdq
    shld edi, esi, 0Fh
    shl ecx, 7h
    or ecx, eax
    shl esi, 0Fh
    mov eax, dword[ebp - 0Ch]
    and ecx, 03FFFFFFh
    or esi, ecx
    mov ecx, dword[ebp - 8h]
    mov dword[eax + 30h], esi
    mov dword[eax + 34h], edi
    mov al, byte[ecx + 19h]
    mov byte[ebp - 1h], al
    and al, 0Fh
    movzx eax, al
    cdq
    mov esi, eax
    mov edi, edx
    movzx eax, byte[ecx + 18h]
    shld edi, esi, 8h
    cdq
    and eax, 00000FFFh
    shl esi, 8h
    or esi, eax
    movzx eax, byte[ecx + 17h]
    cdq
    mov ecx, eax
    movzx eax, bh
    shld edx, ecx, 5h
    cdq
    shl ecx, 5h
    shld edi, esi, 0Dh
    or ecx, eax
    mov eax, dword[ebp - 0Ch]
    shl esi, 0Dh
    and ecx, 01FFFFFFh
    or esi, ecx
    mov ecx, dword[ebp - 8h]
    mov dword[eax + 38h], esi
    mov dword[eax + 3Ch], edi
    mov bl, byte[ecx + 1Ch]
    mov al, bl
    shr bl, 6h
    and al, 3Fh
    movzx eax, al
    cdq
    mov esi, eax
    mov edi, edx
    movzx eax, byte[ecx + 1Bh]
    cdq
    and eax, 00003FFFh
    shld edi, esi, 8h
    shl esi, 8h
    or esi, eax
    movzx eax, byte[ecx + 1Ah]
    cdq
    mov ecx, eax
    mov al, byte[ebp - 1h]
    shr al, 4h
    shld edx, ecx, 4h
    movzx eax, al
    cdq
    shld edi, esi, 0Ch
    shl ecx, 4h
    or ecx, eax
    shl esi, 0Ch
    mov eax, dword[ebp - 0Ch]
    and ecx, 03FFFFFFh
    or esi, ecx
    mov ecx, dword[ebp - 8h]
    mov dword[eax + 40h], esi
    mov dword[eax + 44h], edi
    mov al, byte[ecx + 1Fh]
    and al, 7Fh
    movzx eax, al
    cdq
    mov esi, eax
    mov edi, edx
    movzx eax, byte[ecx + 1Eh]
    shld edi, esi, 8h
    cdq
    and eax, 00007FFFh
    shl esi, 8h
    or esi, eax
    movzx eax, byte[ecx + 1Dh]
    cdq
    mov ecx, eax
    movzx eax, bl
    shld edx, ecx, 2h
    shld edi, esi, 0Ah
    shl ecx, 2h
    cdq
    or ecx, eax
    shl esi, 0Ah
    mov eax, dword[ebp - 0Ch]
    and ecx, 01FFFFFFh
    or esi, ecx
    mov dword[eax + 4Ch], edi
    pop edi
    mov dword[eax + 48h], esi
    pop esi
    pop ebx
    leave
    ret

@14:
    xor ecx, edx
    not ecx
    mov eax, ecx
    shl eax, 10h
    and ecx, eax
    mov eax, ecx
    shl eax, 8h
    and ecx, eax
    mov eax, ecx
    shl eax, 4h
    and ecx, eax
    mov eax, ecx
    shl eax, 2h
    and ecx, eax
    lea eax, [ecx + ecx]
    sar ecx, 1Fh
    sar eax, 1Fh
    and eax, ecx
    ret

@15:
    push ebp
    mov ebp, esp
    sub esp, 44h
    push ebx
    push esi
    push edi
    mov dword[ebp - 0Ch], ecx
    xor esi, esi

@16:
    mov eax, dword[esi * 8h + edx]
    mov dword[esi * 4h + ebp - 44h], eax
    inc esi
    cmp esi, 0Ah
    jl @16
    push 2h
    pop esi
    mov edi, esi

@17:
    xor ebx, ebx

@18:
    mov ecx, dword[ebx * 4h + ebp - 44h]
    mov edx, ecx
    sar edx, 1Fh
    mov eax, ecx
    test bl, 01h
    je @19
    sar eax, 19h
    and edx, eax
    neg edx
    mov eax, edx
    shl eax, 19h
    jmp @20

@19:
    sar eax, 1Ah
    and edx, eax
    neg edx
    mov eax, edx
    shl eax, 1Ah

@20:
    sub dword[ebx * 4h + ebp - 40h], edx
    add eax, ecx
    mov dword[ebx * 4h + ebp - 44h], eax
    inc ebx
    cmp ebx, 9h
    jl @18
    mov ecx, dword[ebp - 20h]
    mov edx, ecx
    sar edx, 1Fh
    mov eax, ecx
    sar eax, 19h
    and edx, eax
    neg edx
    mov eax, edx
    shl eax, 19h
    add ecx, eax
    imul eax, edx,  - 13h
    mov edx, dword[ebp - 44h]
    mov dword[ebp - 20h], ecx
    add edx, eax
    mov dword[ebp - 44h], edx
    sub edi, 1h
    jne @17
    mov ecx, edx
    mov eax, edx
    sar eax, 1Ah
    mov ebx, 1FFFFFFh
    sar ecx, 1Fh
    and ecx, eax
    neg ecx
    mov eax, ecx
    shl eax, 1Ah
    add edx, eax
    sub dword[ebp - 40h], ecx
    mov dword[ebp - 44h], edx

@21:
    xor edx, edx

@22:
    mov eax, dword[edx * 4h + ebp - 44h]
    mov ecx, eax
    test dl, 01h
    je @23
    sar ecx, 19h
    and eax, ebx
    jmp @24

@23:
    sar ecx, 1Ah
    and eax, 03FFFFFFh

@24:
    add dword[edx * 4h + ebp - 40h], ecx
    mov dword[edx * 4h + ebp - 44h], eax
    inc edx
    cmp edx, 9h
    jl @22
    mov eax, dword[ebp - 20h]
    mov ecx, eax
    mov edi, dword[ebp - 44h]
    and eax, ebx
    sar ecx, 19h
    mov dword[ebp - 20h], eax
    imul eax, ecx, 13h
    add edi, eax
    mov dword[ebp - 44h], edi
    sub esi, 1h
    jne @21
    lea esi, [edi + 0FC000013h]
    xor ebx, ebx
    sar esi, 1Fh
    inc ebx
    not esi
    mov dword[ebp - 8h], ebx
    mov dword[ebp - 4h], ebx

@25:
    mov ecx, dword[ebx * 4h + ebp - 44h]
    mov edx, 1FFFFFFh
    test bl, 01h
    jne @26
    mov edx, 3FFFFFFh

@26:
    call @14
    and esi, eax
    inc ebx
    cmp ebx, 0Ah
    jl @25
    mov ebx, dword[ebp - 8h]
    mov eax, esi
    and eax, 03FFFFEDh
    sub edi, eax
    mov dword[ebp - 44h], edi

@27:
    mov eax, esi
    test bl, 01h
    je @28
    and eax, 01FFFFFFh
    jmp @29

@28:
    and eax, 03FFFFFFh

@29:
    sub dword[ebx * 4h + ebp - 44h], eax
    inc ebx
    cmp ebx, 0Ah
    jl @27
    mov eax, dword[ebp - 38h]
    shl eax, 5h
    mov dword[ebp - 8h], eax
    mov eax, dword[ebp - 34h]
    shl eax, 6h
    mov dword[ebp - 4h], eax
    mov eax, dword[ebp - 2Ch]
    mov esi, dword[ebp - 0Ch]
    add eax, eax
    mov dword[ebp - 10h], eax
    mov eax, dword[ebp - 28h]
    shl eax, 3h
    mov dword[ebp - 14h], eax
    mov eax, dword[ebp - 24h]
    mov ecx, dword[ebp - 44h]
    shl eax, 4h
    mov dword[ebp - 18h], eax
    mov eax, dword[ebp - 20h]
    shl eax, 6h
    mov edx, dword[ebp - 40h]
    mov dword[ebp - 1Ch], eax
    mov eax, ecx
    sar eax, 8h
    mov byte[esi + 1h], al
    mov eax, ecx
    mov ebx, dword[ebp - 3Ch]
    sar eax, 10h
    mov byte[esi + 2h], al
    shl edx, 2h
    mov eax, edx
    shl ebx, 3h
    sar eax, 8h
    mov byte[esi + 4h], al
    mov eax, edx
    sar eax, 10h
    mov byte[esi + 5h], al
    mov eax, ebx
    sar eax, 8h
    mov byte[esi + 7h], al
    mov eax, ebx
    sar eax, 10h
    mov byte[esi], cl
    mov byte[esi + 8h], al
    sar ecx, 18h
    or cl, dl
    sar edx, 18h
    mov byte[esi + 3h], cl
    or dl, bl
    mov ecx, dword[ebp - 8h]
    mov eax, ecx
    sar eax, 8h
    mov byte[esi + 0Ah], al
    mov eax, ecx
    sar eax, 10h
    mov byte[esi + 0Bh], al
    mov byte[esi + 6h], dl
    mov edx, dword[ebp - 4h]
    mov eax, edx
    sar eax, 8h
    mov byte[esi + 0Dh], al
    mov eax, edx
    sar ebx, 18h
    or bl, cl
    sar eax, 10h
    sar ecx, 18h
    or cl, dl
    mov byte[esi + 0Eh], al
    mov byte[esi + 0Ch], cl
    mov ecx, dword[ebp - 30h]
    mov eax, ecx
    sar eax, 8h
    mov byte[esi + 11h], al
    mov eax, ecx
    sar edx, 18h
    sar eax, 10h
    mov byte[esi + 0Fh], dl
    mov edx, dword[ebp - 10h]
    mov byte[esi + 10h], cl
    mov byte[esi + 9h], bl
    mov byte[esi + 12h], al
    sar ecx, 18h
    mov eax, edx
    or cl, dl
    sar eax, 8h
    mov byte[esi + 14h], al
    mov eax, edx
    sar eax, 10h
    mov byte[esi + 15h], al
    mov byte[esi + 13h], cl
    mov ecx, dword[ebp - 14h]
    mov eax, ecx
    sar eax, 8h
    mov byte[esi + 17h], al
    mov eax, ecx
    sar eax, 10h
    sar edx, 18h
    or dl, cl
    mov byte[esi + 18h], al
    mov byte[esi + 16h], dl
    mov edx, dword[ebp - 18h]
    mov eax, edx
    sar eax, 8h
    mov byte[esi + 1Ah], al
    mov eax, edx
    sar ecx, 18h
    or cl, dl
    sar eax, 10h
    mov byte[esi + 1Bh], al
    mov byte[esi + 19h], cl
    mov ecx, dword[ebp - 1Ch]
    mov eax, ecx
    sar eax, 8h
    mov byte[esi + 1Dh], al
    mov eax, ecx
    sar edx, 18h
    or dl, cl
    sar eax, 10h
    sar ecx, 18h
    pop edi
    mov byte[esi + 1Ch], dl
    mov byte[esi + 1Eh], al
    mov byte[esi + 1Fh], cl
    pop esi
    pop ebx
    leave
    ret

@30:
    push ebp
    mov ebp, esp
    sub esp, 1D8h
    push ebx
    mov ebx, dword[ebp + 14h]
    push esi
    mov esi, dword[ebp + 10h]
    push edi
    mov dword[ebp - 8h], ecx
    lea edi, [ebp - 18Ch]
    push 14h
    pop ecx
    mov dword[ebp - 0Ch], edx
    mov edx, ebx
    rep movsd
    mov ecx, dword[ebp + 10h]
    call @02
    lea edx, [ebp - 18Ch]
    mov ecx, ebx
    call @04
    mov esi, dword[ebp + 18h]
    lea edi, [ebp - 18Ch]
    mov edx, dword[ebp + 1Ch]
    push 14h
    pop ecx
    rep movsd
    mov ecx, dword[ebp + 18h]
    call @02
    mov ecx, dword[ebp + 1Ch]
    lea edx, [ebp - 18Ch]
    call @04
    mov edx, dword[ebp + 18h]
    lea ecx, [ebp - 13Ch]
    push ebx
    call @06
    push dword[ebp + 1Ch]
    mov edx, dword[ebp + 10h]
    lea ecx, [ebp - 0A4h]
    call @06
    lea ecx, [ebp - 13Ch]
    call @07
    lea ecx, [ebp - 13Ch]
    call @08
    lea ecx, [ebp - 0A4h]
    call @07
    lea ecx, [ebp - 0A4h]
    call @08
    push 14h
    pop ecx
    lea esi, [ebp - 13Ch]
    lea edi, [ebp - 18Ch]
    rep movsd
    lea edx, [ebp - 0A4h]
    lea ecx, [ebp - 13Ch]
    call @02
    lea edx, [ebp - 18Ch]
    lea ecx, [ebp - 0A4h]
    call @04
    lea edx, [ebp - 13Ch]
    lea ecx, [ebp - 1D4h]
    call @12
    lea edx, [ebp - 0A4h]
    lea ecx, [ebp - 13Ch]
    call @12
    push dword[ebp + 20h]
    lea edx, [ebp - 13Ch]
    lea ecx, [ebp - 0A4h]
    call @06
    lea ecx, [ebp - 0A4h]
    call @07
    lea ecx, [ebp - 0A4h]
    call @08
    mov edi, dword[ebp + 8h]
    lea esi, [ebp - 1D4h]
    mov edx, dword[ebp + 10h]
    push 14h
    pop ecx
    rep movsd
    mov edi, dword[ebp + 0Ch]
    lea esi, [ebp - 0A4h]
    push 14h
    pop ecx
    rep movsd
    lea ecx, [ebp - 1D4h]
    call @12
    mov edx, ebx
    lea ecx, [ebp - 0A4h]
    call @12
    mov ebx, dword[ebp - 8h]
    lea eax, [ebp - 0A4h]
    push eax
    lea edx, [ebp - 1D4h]
    mov ecx, ebx
    call @06
    mov ecx, ebx
    call @07
    mov ecx, ebx
    call @08
    lea edx, [ebp - 1D4h]
    lea ecx, [ebp - 0A4h]
    call @04
    push 48h
    lea eax, [ebp - 0ECh]
    push 0h
    push eax
    call @45
    add esp, 0Ch
    xor esi, esi

@31:
    push 0h
    push 1DB41h
    push dword[esi + ebp - 0A0h]
    push dword[esi + ebp - 0A4h]
    call @46
    mov dword[esi + ebp - 13Ch], eax
    mov dword[esi + ebp - 138h], edx
    add esi, 8h
    cmp esi, 50h
    jb @31
    lea ecx, [ebp - 13Ch]
    call @08
    lea edx, [ebp - 1D4h]
    lea ecx, [ebp - 13Ch]
    call @02
    mov ebx, dword[ebp - 0Ch]
    lea edx, [ebp - 0A4h]
    mov eax, ecx
    mov ecx, ebx
    push eax
    call @06
    mov ecx, ebx
    call @07
    mov ecx, ebx
    call @08
    pop edi
    pop esi
    pop ebx
    leave
    ret 1Ch

@32:
    push ebp
    mov ebp, esp
    push ebx
    mov ebx, dword[ebp + 8h]
    push esi
    push edi
    mov esi, edx
    mov dword[ebp + 0Ch], 0Ah
    mov edi, ecx
    neg ebx
    sub edi, esi

@33:
    mov eax, dword[esi + edi]
    mov ecx, dword[esi]
    xor ecx, eax
    and ecx, ebx
    xor eax, ecx
    cdq
    mov dword[esi + edi], eax
    mov dword[esi + edi + 4h], edx
    mov eax, dword[esi]
    xor eax, ecx
    sub dword[ebp + 0Ch], 1h
    cdq
    mov dword[esi], eax
    lea esi, [esi + 8h]
    mov dword[esi - 4h], edx
    jne @33
    pop edi
    pop esi
    pop ebx
    pop ebp
    ret 8h

@34:
    push ebp
    mov ebp, esp
    sub esp, 4FCh
    push ebx
    push esi
    push edi
    mov edi, 90h
    mov dword[ebp - 34h], edx
    push edi
    xor esi, esi
    mov dword[ebp - 30h], ecx
    lea eax, [ebp - 328h]
    push esi
    push eax
    call @45
    add esp, 0Ch
    mov dword[ebp - 0CCh], esi
    xor ebx, ebx
    lea eax, [ebp - 0C8h]
    inc ebx
    mov dword[ebp - 0D0h], ebx
    push edi
    push esi
    push eax
    call @45
    add esp, 0Ch
    mov dword[ebp - 168h], ebx
    lea eax, [ebp - 160h]
    mov dword[ebp - 164h], esi
    push edi
    push esi
    push eax
    call @45
    add esp, 0Ch
    lea eax, [ebp - 3C8h]
    add edi, 8h
    push edi
    push esi
    push eax
    call @45
    lea eax, [ebp - 330h]
    add esp, 0Ch
    mov dword[ebp - 18h], eax
    lea esi, [ebp - 168h]
    lea eax, [ebp - 0D0h]
    mov dword[ebp - 20h], esi
    mov dword[ebp - 10h], eax
    xor esi, esi
    lea eax, [ebp - 3C8h]
    push edi
    mov dword[ebp - 8h], eax
    lea eax, [ebp - 460h]
    push esi
    push eax
    call @45
    add esp, 0Ch
    mov dword[ebp - 200h], ebx
    lea eax, [ebp - 1F8h]
    mov dword[ebp - 1FCh], esi
    push 90h
    push esi
    push eax
    call @45
    add esp, 0Ch
    lea eax, [ebp - 4F8h]
    push edi
    push esi
    push eax
    call @45
    add esp, 0Ch
    mov dword[ebp - 298h], ebx
    lea eax, [ebp - 290h]
    mov dword[ebp - 294h], esi
    push 90h
    push esi
    push eax
    call @45
    lea eax, [ebp - 460h]
    add esp, 0Ch
    mov dword[ebp - 0Ch], eax
    lea eax, [ebp - 200h]
    mov dword[ebp - 1Ch], eax
    lea eax, [ebp - 4F8h]
    mov dword[ebp - 4h], eax
    mov esi, dword[ebp + 0Ch]
    lea eax, [ebp - 298h]
    mov dword[ebp - 14h], eax
    lea edi, [ebp - 330h]
    mov eax, dword[ebp + 8h]
    push 14h
    pop ecx
    rep movsd
    lea ebx, [eax + 1Fh]
    mov dword[ebp - 2Ch], 20h
    mov dword[ebp - 28h], ebx
    lea ecx, [ebp - 330h]

@35:
    mov al, byte[ebx]
    mov ebx, dword[ebp - 20h]
    mov byte[ebp + 0Bh], al
    mov dword[ebp - 24h], 8h

@36:
    shr al, 7h
    movzx eax, al
    cdq
    mov esi, edx
    mov edi, eax
    push esi
    mov edx, ecx
    mov ecx, ebx
    push edi
    call @32
    mov edx, dword[ebp - 10h]
    mov ecx, dword[ebp - 8h]
    push esi
    push edi
    call @32
    push dword[ebp + 0Ch]
    mov edx, dword[ebp - 14h]
    push dword[ebp - 10h]
    mov ecx, dword[ebp - 4h]
    push dword[ebp - 18h]
    push dword[ebp - 8h]
    push ebx
    push dword[ebp - 1Ch]
    push dword[ebp - 0Ch]
    call @30
    mov edx, dword[ebp - 0Ch]
    mov ecx, dword[ebp - 4h]
    push esi
    push edi
    call @32
    mov ecx, dword[ebp - 14h]
    push esi
    mov esi, dword[ebp - 1Ch]
    mov edx, esi
    push edi
    call @32
    mov edx, dword[ebp - 14h]
    mov eax, ebx
    mov ebx, dword[ebp - 4h]
    mov ecx, dword[ebp - 0Ch]
    mov dword[ebp - 4h], eax
    mov eax, dword[ebp - 8h]
    mov dword[ebp - 14h], eax
    mov eax, dword[ebp - 18h]
    mov dword[ebp - 0Ch], eax
    mov eax, dword[ebp - 10h]
    mov dword[ebp - 1Ch], eax
    mov al, byte[ebp + 0Bh]
    add al, al
    mov dword[ebp - 8h], edx
    sub dword[ebp - 24h], 1h
    mov dword[ebp - 18h], ecx
    mov dword[ebp - 10h], esi
    mov byte[ebp + 0Bh], al
    jne @36
    mov dword[ebp - 20h], ebx
    mov ebx, dword[ebp - 28h]
    dec ebx
    sub dword[ebp - 2Ch], 1h
    mov dword[ebp - 28h], ebx
    jne @35
    mov esi, dword[ebp - 20h]
    mov edi, dword[ebp - 30h]
    push 14h
    pop ecx
    rep movsd
    mov edi, dword[ebp - 34h]
    mov esi, edx
    push 14h
    pop ecx
    rep movsd
    pop edi
    pop esi
    pop ebx
    leave
    ret 8h

@37:
    push ebp
    mov ebp, esp
    sub esp, 194h
    push ebx
    push esi
    mov ebx, ecx
    mov esi, edx
    push edi
    lea ecx, [ebp - 0F0h]
    call @12
    lea edx, [ebp - 0F0h]
    lea ecx, [ebp - 0A0h]
    call @12
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    push esi
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 140h]
    call @10
    lea eax, [ebp - 0F0h]
    push eax
    lea edx, [ebp - 140h]
    lea ecx, [ebp - 190h]
    call @10
    lea edx, [ebp - 190h]
    lea ecx, [ebp - 50h]
    call @12
    lea eax, [ebp - 140h]
    push eax
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0F0h]
    call @10
    lea edx, [ebp - 0F0h]
    lea ecx, [ebp - 50h]
    call @12
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    lea eax, [ebp - 0F0h]
    push eax
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 140h]
    call @10
    lea edx, [ebp - 140h]
    lea ecx, [ebp - 50h]
    call @12
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    push 4h
    pop edi
    mov esi, edi

@38:
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    sub esi, 1h
    jne @38
    lea eax, [ebp - 140h]
    push eax
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 0F0h]
    call @10
    lea edx, [ebp - 0F0h]
    lea ecx, [ebp - 50h]
    call @12
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    push 9h
    pop esi

@39:
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    sub esi, 1h
    jne @39
    lea eax, [ebp - 0F0h]
    push eax
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @10
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12

@40:
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    sub edi, 1h
    jne @40
    lea eax, [ebp - 140h]
    push eax
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0F0h]
    call @10
    lea edx, [ebp - 0F0h]
    lea ecx, [ebp - 50h]
    call @12
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    push 18h
    pop esi
    mov edi, esi

@41:
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    sub edi, 1h
    jne @41
    lea eax, [ebp - 0F0h]
    push eax
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 140h]
    call @10
    lea edx, [ebp - 140h]
    lea ecx, [ebp - 0A0h]
    call @12
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    push 31h
    pop edi

@42:
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    sub edi, 1h
    jne @42
    lea eax, [ebp - 140h]
    push eax
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @10
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12

@43:
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    sub esi, 1h
    jne @43
    lea eax, [ebp - 0F0h]
    push eax
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @10
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    lea edx, [ebp - 0A0h]
    lea ecx, [ebp - 50h]
    call @12
    lea edx, [ebp - 50h]
    lea ecx, [ebp - 0A0h]
    call @12
    lea eax, [ebp - 190h]
    mov ecx, ebx
    push eax
    lea edx, [ebp - 0A0h]
    call @10
    pop edi
    pop esi
    pop ebx
    leave
    ret

@45:
    push ebp
    mov ebp, esp
    push edi
    mov ecx, dword[ebp + 0x10]
    mov edi, dword[ebp + 0x08]
    mov al, byte[ebp + 0x0C]
    rep stosb
    pop edi
    leave
    retn

@46:
    mov eax, dword[esp + 8h]
    mov ecx, dword[esp + 10h]
    or ecx, eax
    mov ecx, dword[esp + 0Ch]
    jne @47
    mov eax, dword[esp + 4h]
    mul ecx
    ret 10h

@47:
    push ebx
    mul ecx
    mov ebx, eax
    mov eax, dword[esp + 8h]
    mul dword[esp + 14h]
    add ebx, eax
    mov eax, dword[esp + 8h]
    mul ecx
    add edx, ebx
    pop ebx
    ret 10h

main.asm

format pe console

section '.code' import readable writeable executable

include 'win32ax.inc'

library     msvcrt, 'msvcrt.dll',\
            advapi32, 'advapi32.dll'

import      msvcrt,\
            printf, 'printf',\
            getchar, 'getchar',\
            memcmp, 'memcmp'

import      advapi32,\
            RtlGenRandom, 'SystemFunction036'

include 'curve25519.asm'

proc print, lab, buf
    locals
        frmt db '%02X', 0
    endl

    cinvoke printf, [lab]
    mov esi, [buf]
    xor ecx, ecx

@@: movzx eax, byte[esi]

    push ecx
    cinvoke printf, addr frmt, eax
    pop ecx

    inc ecx
    inc esi

    cmp ecx, 32
    jne @b

    cinvoke printf, next_line

    ret
endp

proc rand_private, buf
    locals
        pRandomBuffer rd 1
    endl

    mov edi, [buf]
    xor ecx, ecx
@@: push ecx

    invoke RtlGenRandom, addr pRandomBuffer, 4
    cmp eax, 0
    je .err

    mov eax, [pRandomBuffer]
    xor edx, edx
    mov ecx, 255
    div ecx
    mov eax, edx
    jmp .fin

.err:
    xor eax, eax
    dec eax
.fin:

    mov byte[edi], al

    pop ecx

    inc edi
    inc ecx
    cmp ecx, 32
    jl @b

    mov esi, [buf]
    and byte[esi], 248
    mov dl, byte[esi + 31]
    and dl, 127
    or dl, 64
    mov byte[esi + 31], dl

    ret
endp


entry $
    xor ecx, ecx
@@: push ecx

    stdcall rand_private, private_key_1
    stdcall rand_private, private_key_2

    stdcall curve25519, public_key_1, private_key_1, basepoint
    stdcall curve25519, public_key_2, private_key_2, basepoint

    stdcall curve25519, shared_key_1, private_key_1, public_key_2
    stdcall curve25519, shared_key_2, private_key_2, public_key_1

;    stdcall print, priv, private_key_1
;    stdcall print, priv, private_key_2
;    cinvoke printf, next_line

;    stdcall print, publ, public_key_1
;    stdcall print, publ, public_key_2
;    cinvoke printf, next_line

    cinvoke memcmp, shared_key_1, shared_key_2, 32
    cmp eax, 0
    jne not_eq
;    stdcall print, shar, shared_key_1
;    stdcall print, shar, shared_key_2
;    cinvoke printf, next_line

    cinvoke printf, equally
    jmp fin

not_eq:
    cinvoke printf, not_equal
    cinvoke getchar
fin:
    pop ecx
    inc ecx
    cmp ecx, 1000
    jl @b

    cinvoke printf, finish
    cinvoke getchar
    xor eax, eax
    ret


    equally                 db 'memcmp: equally', 13, 10,           0
    not_equal               db 'memcmp: not equal', 13, 10,         0
    priv                    db 'private: ',                         0
    publ                    db ' public: ',                         0
    shar                    db ' shared: ',                         0
    finish                  db 13, 10, 'finish ok!', 13, 10,        0

    next_line               db 13, 10,                              0

    basepoint               db 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

    private_key_1           rb 32
    private_key_2           rb 32

    public_key_1            rb 32
    public_key_2            rb 32

    shared_key_1            rb 32
    shared_key_2            rb 32

Результат:

private: 886F833AA015C3956F01B69AC6FCAF08C65A1D956C7B0431681A5AAA149BE25C
private: 48FC11C04E64CC3D35BA7B71440F2C27D61100E74AB1382BB32F4D949D860574

public: 720885C1CB636BE169C30DD5C4D58306AC1E1F49BB36AEBC8912511A467BAC3E
public: F9D27D035BAD8F14D91C88C94311F3C3C273A6260A9919E9B832A1DD25E8D808

shared: 8F8900C304DD9CFB14CAC630B6424AEE5505DBDD3EFD8476F08106FB40EE7C37
shared: 8F8900C304DD9CFB14CAC630B6424AEE5505DBDD3EFD8476F08106FB40EE7C37

78

(10 відповідей, залишених у Системне програмування)

0xDADA11C7 написав:

Сенс, окрім статистики для аверів?

Вас весь час турбує сенс, то може ви його втратили і шукаєте?

В IT так.

79

(10 відповідей, залишених у Системне програмування)

0xDADA11C7 написав:

Ріп це вже цікаво, хтось по ньому може навіть компілер визначити

Сенс, окрім статистики для аверів?

80

(10 відповідей, залишених у Системне програмування)

Та всім пофіг) Практичної необхідності у цьому коді немає. Практичніше юзати оригінал (http://www.gladman.me.uk/), а не подібні милиці. Шкода, що я це тільки зараз зрозумів. Крутизни це не додає..