![]() |
Collection: Asm-Algorithms
Asm-Алгоритмы
Описание: Этот thread представляет из себя сборник интересных, полезных, а также просто часто требующихся функций, написанных на ассемблере. Условие: Сюда добавляете только те функции, которые использовались, были оптимизированы вами, или же очень вас заинтересовали. Формат: Придерживайтесь формата, каждый новый алгоритм в новом посте, название алгоритма повторяйте в заголовке: Код:
[b]Алгоритм:[/b] Название алгоритмаОтвет: В поиске по теме очень удобно отображается кажрый пост, попробуйте и сами убедитесь. |
Base64 Encode
Алгоритм: Base64 Encode
Синтаксис: fasm Описание: rfc2045.txt Коментарий: Вот решил переписать алгоритм по своему, оптимизировать и т.д. после этого у меня сложилось впечатление что автор разработавший его смутно представлял основы написания програм на ассемблере, можно было сделать его намного быстрее, кстати кто нибудь задумывался что результат кодирования участка данных длиной пропорциональной выражению x*2 имеет 3 синонима, а x*2+1 целых 15, для примера выполни эту команду perl -e "print'OK'if(decode_base64('bWU=')eq decode_base64('bWX='));" Пример вызова: Код:
format PE GUI 4.0Код: Код:
proc bin2base64, data, len, chrset, base |
try except endt
Алгоритм: try except endt
Синтаксис: fasm Описание: Обработка исключений в fasm Коментарий: При переходе с делфи на ассемблер мне очень нехватало обработки исключений, вот я её и сделал, по образу и подобию стандартного макроса if else endif. Пример вызова: Код:
format PE GUI 4.0Код:
include 'macro/proc32.inc' |
fmem (Fill memory)
Алгоритм: fmem (Fill memory)
Синтаксис: fasm Описание: Заполнение участка памяти байтом, указоным в третьем параметре Коментарий: В общем, это альтернатива функции zeromem, если в третий параметор поместить 0, работоспособность ничуть не снизится, а даже повысется из-за придельной оптимизации, а так как в этот параметор можно помещять не только 1 байт, можно немного по импровизировать с форматом заполнения. Какие только извращённые алгоритмы я не встречал, для выполнения этой элементарнейшей задачи, бывали даже в пять раз длиннее представленного мной кода, больше вам не придётся извращятся над этим алгоритмом, он оптимизирован до примела. Кстати он не затирает не один регистр, даже eax. Пример вызова: Код:
format PE GUI 4.0Код:
proc fmem, mem, len, byte |
Алгоритм: md5 hashing algo
Синтаксис: masm Описание: "экономи4еская" реализация алгоритма хэширования md5 Код: Код:
.686 |
Hash Importer
Вложений: 1
Алгоритм: Hash Importer
Синтаксис: fasm Описание: Импортирует функции из модулей по ихним хэшам или номерам, при первом варианте они хешируются без учёта регистра макроинструкцией iprc, абсолютная вероятность неповторимости хэша сохраняется, только при условии, что длина имени не превышает 6 символов, не включает цифр и не зависит от регистра, тем не менее, количество вариантов настолько велико, что вероятность того что в одном модуле будут две функции одной и той-же длины и с одной и той-же хешью стремится к 0. Во время импортирования вычисляется дельта функций относительно мест, куда они будут сохранены, и сохраняются в виде относительных переходов(инструкция E9), также сохраняются и нэнделы проанализированных модулей. Всё это сохранённое добро доступно по указанным ссылкам. Установка флага AntiDebug включает проверку, если первая инструкция в импортированной функции mov edi, edi знацит пропустить эту инструкцию, что очень запутывает отладчик. Комментарий: Макроинструкция istr содержит имена библиотек, её можно вынести в ReadOnly секцию. Да и готовые функции ProcIdByHash, ProcAddrById и BaseByAddr тоже иногда бывают полезны. Змечания: В примере используется не invoke, a stdcall, т.к. invoke proc компилируется как call dword[proc] (вызов функции, адрес которой записан в переменной proc), а stdcall как call proc (вызов инструкции, по адресу proc), что позволяет использовать этот алгоритм в базонезависимых программах, так как call proc - relative call(Относительный вызов). Если используется подгрузка дополнительных модулей, то должна присутствовать функция LoadLibraryA, она может импортироваться из первого модуля(до подгрузки остальных) или же создана статически. Также можно создать функцию ImportErrProc, программа будет попадать на неё, при вызове функции которой не нашел импортер. Результат работы: Код:
до:Код:
format PE GUI 4.0Код:
macro iprc [proc, name]Код:
myi:Updates: - Добавлена относительность имён загружаемых библиотек - возможность импорта по ордилалу - исправле недочёт(по вине этих грёбаных писателей MSDN) с возможным не совпадением количества функций с количеством их имён. |
Get Command Line Arguments
Алгоритм: Get Command Line Arguments
Синтаксис: fasm Описание: Самая частоиспользуемая функция после импортера. При написании какой нибудь маленькой консольной(и не только) утилиты, бывает очень нужно получить аргументы коммандной строки. Змечания: Данная функция защищена от переполнения, указываемая в последним аргументе длина указывается включая нулевой окончательный символ. Если длина 4, в буффер поместятся только 3 символа аргумента и 1 конца строки. В eax возвращается длина полученого аргумента, если его не нашлось, возвращасется 0, при этом в буффер ничего не записывается, так что можно предопределять аргументы. Пример вызова: Код:
format PE GUI 4.0Код:
proc GetArg, line, num, buf, len |
Алгоритм: dup export file to fasm dd table
Синтаксис: delphi -> fasm Описание: данная процедурка(delphi) генерит таблицу смещений и пат4ей по экспортируемому DUPом файлу такого вида: RAW Offset | Old Byte | New Byte -----------------+----------+---------- 00000149 20 30 000001F6 00 12 00000217 60 E0 0000023C 40 20 0000023F 40 E0 00000246 00 12 00000264 40 20 и сохраняет в удобном для использования в fasm'е Offsets dd 0x00000149, 0x000001F6, 0x00000217, 0x0000023C, 0x0000023F dd 0x00000246, 0x00000264 Patch db 0x30, 0x12, 0xE0, 0x20, 0xE0, 0x12, 0x20 Очень полезно при создании пат4ей, лоадеров с большим коли4естов байт для пат4а, которые вру4ную вводить утомительно. Пример вызова: Код:
procedure make_fasm_patch_table(dup_filename, offsets, pat4es: string); |
Алгоритм: RC4 cipher
Описание: потоковое шифрование\дешифрование Код: В Код:
INCLUDE MISC.INC |
Алгоритм: Генератор случайных чисел
Синтаксис: fasm/masm Описание: Генератор случайных чисел, достаточно быстрый основан на сдвигах. Пример вызова: Код:
srand_init proc near; инициализирует кольцевой буфер для генератора, ВХОД:EAX начальное значение например из области данных BIOS |
| Время: 13:43 |