Size: a a a

Ассемблер

2021 May 29

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
но тогда это будет не оптимизация, а усложнение
источник

d

disba1ancer in Ассемблер
у тебя ещё и 32 бита...
источник

АШ

Алексей Шведов... in Ассемблер
То есть способом выше (однотипным кодом) будет работать быстрее, и оптимизировать не нужно?
источник

d

disba1ancer in Ассемблер
а ты эти запросы адресов функций только один раз делаешь?
источник

АШ

Алексей Шведов... in Ассемблер
Да, один раз
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
через таблицы будет логичней если у тебя овер дофига итераций
источник

d

disba1ancer in Ассемблер
ну на каждую функцию один раз и всё да?
источник

АШ

Алексей Шведов... in Ассемблер
Ну да, одна функция - один раз вызов GetProcAddress - один раз запрос на переменную, в которую нужно вернуть результат - один раз положить результат
И это всё повторяется, но уже с другими
источник

d

disba1ancer in Ассемблер
можешь попробовать организовать массив из следующих структур:
struc func_table_entry name_ptr {
funcptr dd 0
name dd name_ptr
}

; начало массива
CreateFile func_table_entry CreateFile_name
CreateWindowEx func_table_entry CreateWindowEx_name
; конец массива

CreateFile_name db "CreateFileA", 0
CreateWindowEx_name db "CreateWindowExA", 0
источник

Е

Евгений in Ассемблер
Думаю, можно сделать так
В секции данных организовать ссылки на адреса имён функций, а потом читать их в цикле
источник

d

disba1ancer in Ассемблер
можно вообще попросить ОС всё нам подключить и посчитать адреса, нужно только правильно собрать бинарник, задействуя секцию импорта
источник

АШ

Алексей Шведов... in Ассемблер
Я думал, чтобы оно выглядело как-то:

FuncNames:
db 'CreateFileA', 0
db 'CloseHandle', 0
db 'ExitProcess', 0
dd 1

Functions:
dd 0
dd 0
dd 0

Тем самым не нужно резервировать кучу переменных с именами, и мусорить в .data, а брать с оффсетами Functions+0 = CreateFileA
Functions+1 = CloseHandle

Только вот сложности с проведением инициализации. Приходится писать функцию, которая будет читать строчки до 0 в FuncNames с проверкой итерации (чтение - ноль? - вернуть адрес в стэк - чтение - ещё ноль? - это вторая строка, вернуть адрес в стэк - чтение - 1 - это конец таблицы, все адреса в таблицы в стэке)
А потом брать из стэка
push ESP+OffsetFunctionName
push edi
call [GetProcAddress]
mov [Functions+ecx], eax
(После этого очистить стэк от аргументов GetProcAddress )
источник

АШ

Алексей Шведов... in Ассемблер
Но я мешкаюсь, насколько это будет правильно
источник

d

disba1ancer in Ассемблер
у тебя не будет кучи переменных с именами, только одна на каждую функцию, имя в самой структуре это просто указатель
источник

d

disba1ancer in Ассемблер
такая организация позволить тебе упростить организацию цикла загрузки функций в итоге  ты напишешь этот код 1 раз, и только будет таблицу расширять и имена докидывать
источник

АШ

Алексей Шведов... in Ассемблер
По факту, сейчас у меня так и есть. Твой вариант даже будет длиннее кодом (со структурой, и инициализацией этой структуры)
источник

d

disba1ancer in Ассемблер
сама структура и её инициализация ничего не стоят для бинарника там просто сгенерируются данные
источник

d

disba1ancer in Ассемблер
дальше нужен только код прохода по массиву
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
я так понимаю ты хочешь пользоваться функцией не помещая ее в импорт?
источник

АШ

Алексей Шведов... in Ассемблер
Мне хочется сделать код меньше и удобнее.
источник