Сейчас на форуме: tyns777 (+3 невидимых)

 eXeL@B —› Программирование —› Как объявить импортируемую fastcall функцию в MASM'е
Посл.ответ Сообщение

Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 20 октября 2009 14:28
· Личное сообщение · #1

InterlockedCompareExchange proto fastcall dest : ptr, exchange : dword, comparand : dword
Так не хочет.

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 20 октября 2009 15:36
· Личное сообщение · #2

Внизу информация к размышлению. В процедуре обьявленной уже задается что режим фасткол , если же вызов будет произведен из другого места , то вроде бы неважно как обьявлена фастколом или нет. По крайней мере в кернел инк от масм InterlockedCompareExchange выделяется как

Code:
  1.  InterlockedCompareExchange PROTO :DWORD,:DWORD,:DWORD


Попробуй так сначала , и посмотри , зайди в процедуру и увидишь как там параметры разбросались

890f_20.10.2009_CRACKLAB.rU.tgz - fastcall.rar

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 20 октября 2009 15:42 · Поправил: OKOB
· Личное сообщение · #3

Four-F утверждает, что fastcall не поддерживается MASM и даже предлагает соответствующий макрос для лечения в KmdKit.

"В функциях API ядра Windows NT используется три типа соглашений о передаче параметров (calling convention): stdcall, cdecl и fastcall. Последний тип не поддерживается компилятором masm." (цитата)

hххp://www.team-x.ru/teamx/12345.htm

-----
127.0.0.1, sweet 127.0.0.1





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 20 октября 2009 15:51 · Поправил: mak
· Личное сообщение · #4

Да верно , об этом многие говорят что не поддерживается , тем не менее я видел реализацию , другую не как макрос. Можно вот так попробовать

Code:
  1. EXTERNDEF SYSCALL @InterlockedCompareExchange@12:PROC
  2. InterlockedCompareExchange EQU <@InterlockedCompareExchange@12>


макрос внизу примерный приложен. А у Four-F макрос тоже бы глянул =)

ПС. Материал с той ссылки

Соглашение о передаче параметров

В функциях API ядра Windows NT используется три типа соглашений о передаче параметров (calling convention): stdcall, cdecl и fastcall. Последний тип не поддерживается компилятором masm.

Такие функции принимают первый аргумент в регистре ecx, второй в edx, остальные, при наличии таковых, помещаются в стек в обратном порядке (справа налево). Стек очищает вызванная функция.

Декорированные имена функций fastcall начинаются с символа "@", после имени добавляется символ "@" с десятичным числом, обозначающим суммарный размер аргументов в байтах. Например, функция IofCompleteRequest декорируется следующим образом:
@IofCompleteRequest@8


Это значит, что это fastcall-функция, экспортируемое имя IofCompleteRequest, принимает два аргумента размером DWORD каждый.

В файле \include\w2k\ntoskrnl.inc она определена следующим образом (на ключевое слово SYSCALL можете не обращать внимание):
EXTERNDEF SYSCALL @IofCompleteRequest@8:PROC
IofCompleteRequest TEXTEQU <@IofCompleteRequest@8>


Для упрощения вызова таких функций я написал макрос fastcall:

Code:
  1.  fastcall MACRO api:REQ, p1, p2, px:VARARG
  2.  
  3.  local arg
  4.  
  5.      ifnb <px>
  6.          % for arg, @ArgRev( <px>)
  7.              push arg
  8.          endm
  9.      endif
  10.  
  11.      ifnb <p1>
  12.  
  13.          ifdifi <p1>, <ecx>
  14.              mov ecx, p1
  15.          endif
  16.  
  17.          ifnb <p2>
  18.              ifdifi <p2>, <edx>
  19.                  mov edx, p2
  20.              endif
  21.          endif
  22.  
  23.      endif
  24.  
  25.      call api
  26.  
  27.  ENDM



Здесь, для экономии места, я привожу упрощенную версию этого макроса. Чтобы не плодить лишние файлы с макросами, мне пришлось поместить этот макрос в \include\w2k\ntddk.inc, где и можно посмотреть полный вариант. В оригинальном ntddk.h такого макроса, естественно, нет.

0b42_20.10.2009_CRACKLAB.rU.tgz - fcinvoke.asm

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 20 октября 2009 19:22
· Личное сообщение · #5

Code:
  1. InterlockedCompareExchange PROTO :DWORD,:DWORD,:DWORD

Вот если я так делаю, то получаю в драйвере stdcall импорт в kernel32.dll, а не fastcall в ntoskrnl.exe

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 20 октября 2009 20:26
· Личное сообщение · #6

а так пробовал ?
как выше написал

Code:
  1. EXTERNDEF SYSCALL @InterlockedCompareExchange@12:PROC
  2. InterlockedCompareExchange EQU <@InterlockedCompareExchange@12>


и Four-F говорит типо определения

Code:
  1. EXTERNDEF SYSCALL @IofCompleteRequest@8:PROC
  2. IofCompleteRequest TEXTEQU <@IofCompleteRequest@8>
только на свою апи заменить ?

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 20 октября 2009 20:49
· Личное сообщение · #7

Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A, 3-148.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 20 октября 2009 22:06
· Личное сообщение · #8

Clerk пишет:
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A, 3-148.


Помоему вопрос "как на асме написать InterlockedCompareExchange" сильно отличается от "Как объявить импортируемую fastcall функцию в MASM'е"

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 20 октября 2009 22:11
· Личное сообщение · #9

mak пишет:
а так пробовал ?как выше написал

Code:

EXTERNDEF SYSCALL @InterlockedCompareExchange@12:PROC
InterlockedCompareExchange EQU <@InterlockedCompareExchange@12>

Так работает. Но хочется proto

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 21 октября 2009 09:04
· Личное сообщение · #10

Hexxx
Помоему асм использует ресурсы камня, имя функции длинее чем сама функция, которая заключается в одной инструкции
Если не подходит вручную вызывать такого типа функции, то и незачем использовать асм, си юзайте.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 21 октября 2009 10:54 · Поправил: Hexxx
· Личное сообщение · #11

Clerk пишет:
Помоему асм использует ресурсы камня, имя функции длинее чем сама функция, которая заключается в одной инструкции Если не подходит вручную вызывать такого типа функции, то и незачем использовать асм, си юзайте.

Как это отвечает на вопрос про fastcall в MASM?

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 21 октября 2009 23:24
· Личное сообщение · #12

Hexxx пишет:
mak пишет: а так пробовал ?как выше написал Code: EXTERNDEF SYSCALL @InterlockedCompareExchange@12:PROCInterlockedCompar eExchange EQU <@InterlockedCompareExchange@12> Так работает. Но хочется proto


Hexxx сделай для красоты макрос прото я так часто делаю когда ну очень что то хочется) Внизу пример извратов с ком и прото инвоке

c512_21.10.2009_CRACKLAB.rU.tgz - Macros.inc

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 22 октября 2009 12:22
· Личное сообщение · #13

у Four-F в макросе fastcall есть ограничения, которые тоже надо учитывать



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 22 октября 2009 15:42
· Личное сообщение · #14

mak пишет:
Внизу пример извратов с ком и прото инвоке

o_0
не, я наверно как-то переживу без макроса

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 22 октября 2009 17:14
· Личное сообщение · #15

Hexxx а почему бы нет , сделать макрос универсальный для разных методов кола , по идее у прото функции парметры типо таких ,

Code:
  1. ЛАбел ПРОТО Дестинейшн,Язык, Аргументы:параметры


Я пологаю параметр дестинейшн , описывает какой кол сделать , поэтому если его знать то можно накидать макрос

Вот примеры например других вызовов , но уних там параметр дэстинейшн указан как STDCALL вроде
, чему интересно равен SYSCALL в параметрах масма , я там не нашел описания внутри инков функции прото , видимо она встроена уже.

Code:
  1.       SPROTO MACRO func_addr:REQ,arglist:VARARG     ;; STDCALL version
  2.         LOCAL lp,var
  3.         .data?
  4.           func_addr dd ?
  5.         .const
  6.         var typedef PROTO STDCALL arglist
  7.         lp TYPEDEF PTR var
  8.         EXITM <equ <(TYPE lp) PTR func_addr>>
  9.       ENDM
  10.  
  11.       CPROTO MACRO func_addr:REQ,arglist:VARARG     ;; C calling version
  12.         LOCAL lp,var
  13.         .data?
  14.           func_addr dd ?
  15.         .const
  16.         var typedef PROTO C arglist
  17.         lp TYPEDEF PTR var
  18.         EXITM <equ <(TYPE lp) PTR func_addr>>
  19.       ENDM


-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube



 eXeL@B —› Программирование —› Как объявить импортируемую fastcall функцию в MASM'е
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати