Re[7]: Примеры ассемблера ARM64 на MASM
От: CreatorCray  
Дата: 16.02.22 07:40
Оценка:
Здравствуйте, nodir.temir, Вы писали:

NT>Но я хочу сделать гарантированно рабочий код для любого кол-ва аргументов.

NT>После истечения EV сертификата, не смогу менять загрузчик драйвера.

Насколько я понимаю ты их используешь в качестве callbacks, получается что макс число аргументов ограничено тем, что эти функции в свои callbacks возвращают, а для каждого конкретного случая — ещё и собственно что вызываемая функция в callback передаёт.
Т.е. всё должно быть известно на этапе компиляции, не?
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[8]: Примеры ассемблера ARM64 на MASM
От: nodir.temir https://github.com/tnodir
Дата: 16.02.22 07:46
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, nodir.temir, Вы писали:


NT>>Но я хочу сделать гарантированно рабочий код для любого кол-ва аргументов.

NT>>После истечения EV сертификата, не смогу менять загрузчик драйвера.

CC>Насколько я понимаю ты их используешь в качестве callbacks, получается что макс число аргументов ограничено тем, что эти функции в свои callbacks возвращают, а для каждого конкретного случая — ещё и собственно что вызываемая функция в callback передаёт.

CC>Т.е. всё должно быть известно на этапе компиляции, не?

У меня есть загрузчик драйвера, подписанный EV сертификатом.
Он грузит основной дравер, который может зарегистрировать у загрузчика любые функции как коллбеки.
Re[5]: Примеры ассемблера ARM64 на MASM
От: nodir.temir https://github.com/tnodir
Дата: 16.02.22 07:50
Оценка:
Здравствуйте, reversecode, Вы писали:

CC>>Этож банальный массив function pointers


R>у него в одном и том же поинтере может лежать функции с разным количеством аргументов

R>соответственно можно сделать на него только jmp
R>и нельзя call
R>в С с ходу не придумалось как это можно обойти
R>кроме как заюзать __assume(0) что бы компиллер емитил jmp вместо call

MSVC всё равно CALL ставит: https://godbolt.org/z/EvWKqaeMj
Re[6]: Примеры ассемблера ARM64 на MASM
От: nodir.temir https://github.com/tnodir
Дата: 16.02.22 07:56
Оценка:
NT>MSVC всё равно CALL ставит: https://godbolt.org/z/EvWKqaeMj

CLANG портит RAX: https://godbolt.org/z/9feTq4M4a
Re[2]: Примеры ассемблера ARM64 на MASM
От: nodir.temir https://github.com/tnodir
Дата: 16.02.22 09:24
Оценка:
Здравствуйте, reversecode, Вы писали:

R>вообще хорошо подумав

R>в asm можно загнать только jmp
R>а таблицу и вызовы из таблицы итд в С держать
R>ну и вызывать каким нибудь jump_from(&g_table[0]);

Спасибо, таблицу перенёс в C.
А как вызывать через "jump_from(&g_table[0]);" я не понял.
Re[3]: Примеры ассемблера ARM64 на MASM
От: reversecode google
Дата: 16.02.22 09:44
Оценка:
это я так назвал функцию
вы можете объявить только одну в асм файле
из ваших
proxyCallback0 PROC
ProxyCallbackProc(0)
proxyCallback0 ENDP
а остальные перетянуть в си и само смещение по индексу тоже в си уйдет

а потом если подумать
то можно и сам jmp попробовать перетянут в си
директивы msvc __emit по моему поддерживаются на всех ее платформах?
значит можно код закинуть в си
и тогда от асма отказаться
Re[5]: Примеры ассемблера ARM64 на MASM
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.02.22 09:46
Оценка:
Здравствуйте, nodir.temir, Вы писали:

NT>Поэтому написаны они на ассемблере, т.е. просто делают JMP по таблице на нужную функцию.


Да, но если описать на Си массив указателей на функцию, и вызывать по указателю по индексу, то получится буквально то же самое...
Re[9]: Примеры ассемблера ARM64 на MASM
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.02.22 09:50
Оценка:
Здравствуйте, nodir.temir, Вы писали:

NT>У меня есть загрузчик драйвера, подписанный EV сертификатом.

NT>Он грузит основной дравер, который может зарегистрировать у загрузчика любые функции как коллбеки.

Ну т.е., ты делаешь ровно то, что Микрософт хочет, чтобы ты не делал, и рассчитываешь, что ты такой умный, что тебе всегда будет удаваться их перехитрить...
Re[5]: Примеры ассемблера ARM64 на MASM
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.02.22 09:58
Оценка:
Здравствуйте, reversecode, Вы писали:

R>у него в одном и том же поинтере может лежать функции с разным количеством аргументов

R>соответственно можно сделать на него только jmp

GetProcAddress() возвращает указатель на функцию из DLL, который работает независимо от того, какие у этой функции аргументы (после соответствующего преобразования типа, разумеется).

Точно то же можно сделать и здесь, и в рамках микрософтовских компиляторов это будет работать всегда, потому, что они не смогут сломать одно, не сломав другое.

В плане типа-безопасности это ничем не хуже, чем спрятать преобразование типов указателей на функции, стыдливо засунув их в .asm, где компилятор C их не видит.
Re[6]: Примеры ассемблера ARM64 на MASM
От: reversecode google
Дата: 16.02.22 10:07
Оценка:
на практике двойной call call который по итоге получится
может сломать какие то регистры
вон выше он писал что вроде eax ломается
Re[7]: Примеры ассемблера ARM64 на MASM
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.02.22 10:20
Оценка:
Здравствуйте, reversecode, Вы писали:

R>на практике двойной call call который по итоге получится

R>может сломать какие то регистры
R>вон выше он писал что вроде eax ломается

Не должон, однако.

В принципе, в Си (не C++) можно описать функцию, вообще ничего не сказав о типе ее аргументов:

int foo ();


Это, вроде как, отменили в новых версиях стандарта, за которыми я не столь уж и пристально слежу, но тем не менее, совместимость придется оставить на достаточно долгое время.

А значит, calling convention должен позволять сконструировать корректный вызов функции, зная, какие аргументы ей передаются, но не зная, какие аргументы она ожидает. И вот именно этим механизмом я предлагаю воспользоваться.

Синтаксически это — typecast указателя в указатель на функцию с нужным списком аргументов.
Re[10]: Примеры ассемблера ARM64 на MASM
От: nodir.temir https://github.com/tnodir
Дата: 16.02.22 11:02
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Ну т.е., ты делаешь ровно то, что Микрософт хочет, чтобы ты не делал, и рассчитываешь, что ты такой умный, что тебе всегда будет удаваться их перехитрить...


Ахаха, что-н. придумаем))
Re[4]: Примеры ассемблера ARM64 на MASM
От: nodir.temir https://github.com/tnodir
Дата: 16.02.22 11:09
Оценка:
Здравствуйте, reversecode, Вы писали:

R>это я так назвал функцию

R>вы можете объявить только одну в асм файле
R>из ваших
R>proxyCallback0 PROC
R>ProxyCallbackProc(0)
R>proxyCallback0 ENDP
R>а остальные перетянуть в си и само смещение по индексу тоже в си уйдет

R>а потом если подумать

R>то можно и сам jmp попробовать перетянут в си
R>директивы msvc __emit по моему поддерживаются на всех ее платформах?
R>значит можно код закинуть в си
R>и тогда от асма отказаться

В асм-е много proxyCallback* функций именно для регистрации коллбеков на каждого из них.
Они же вызываются извне и должны перенаправить вызов на другую реальную функцию.
Re[10]: Примеры ассемблера ARM64 на MASM
От: nodir.temir https://github.com/tnodir
Дата: 16.02.22 11:32
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, nodir.temir, Вы писали:


NT>>У меня есть загрузчик драйвера, подписанный EV сертификатом.

NT>>Он грузит основной дравер, который может зарегистрировать у загрузчика любые функции как коллбеки.

Pzz>Ну т.е., ты делаешь ровно то, что Микрософт хочет, чтобы ты не делал, и рассчитываешь, что ты такой умный, что тебе всегда будет удаваться их перехитрить...


А с другой стороны, чем это отличается от JIT?
Re: Примеры ассемблера ARM64 на MASM
От: nodir.temir https://github.com/tnodir
Дата: 16.02.22 17:26
Оценка: 13 (2)
NT>Хочу драйвер перенести на Windows 11 ARM, но примеров найти не могу.

Ура, сделал.

Использованные материалы:
— ARMCT_armasm_reference_guide_v6_01_DUI0802B_en.pdf
https://cit.dixie.edu/cs/2810/arm64-assembly.html
https://stackoverflow.com/questions/45279810/arm64-assembly-branch-to-function-address
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.