Опять об __asm в Visual Studio x64

Тема в разделе "WASM.BEGINNERS", создана пользователем maestroant, 15 июл 2023.

  1. maestroant

    maestroant New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2019
    Сообщения:
    14
    Всем привет.
    Вот смотрю исходники свежевыложеного буткита BlackLotus, проект x64 сделан в студии 2015, но в ф-иях присутвтуют ассемблерные вставки. Но как все знают что не поддерживаются они компилятором! Как они его собирали? Толи я чего то не понимаю)) Может есть какой то лайфхак как заставить студию их хавать?))
     
  2. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    449
    выбросить в топку

    Код (Text):
    1.     if (Is64Bit())
    2.     {
    3.         _InterlockedCompareExchange64((LONGLONG *)Destination, *(LONGLONG*)Buffer, *(LONGLONG *)Destination);
    4.         return;
    5.     }
    6.  
    7. // тут  ветка только для  32 бит кода! -> фтопку........
    8.     __asm
    9.     {
    10.         lea esi, Buffer;
    11.         mov edi, Destination;
    12.  
    13.         mov eax, [edi];
    14.         mov edx, [edi + 4];
    15.         mov ebx, [esi];
    16.         mov ecx, [esi + 4];
    17.  
    18.         lock cmpxchg8b[edi];
    19.     }
     
  3. maestroant

    maestroant New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2019
    Сообщения:
    14
    Код (Text):
    1. //implement heavens gate to handle x86<->x64 dynamic function resolving
    2. HMODULE GetModuleHandleByHash(DWORD Hash)
    3. {
    4.     LDR_MODULE* Module = NULL;
    5.     DWORD CurrentHash;
    6.     DWORD Length;
    7.  
    8.     _asm
    9.     {
    10.         MOV EAX, FS:[0x18];
    11.         MOV EAX, [EAX + 0x30];
    12.         MOV EAX, [EAX + 0x0C];
    13.         MOV EAX, [EAX + 0x0C];
    14.         MOV Module, EAX;
    15.     }
    16.  
    17.     while (Module->BaseAddress)
    18.     {
    19.         LPWSTR LowerCase = StringToLowerW(Module->BaseDllName.Buffer, Module->BaseDllName.Length);
    20.      
    21.         Length        = StringLengthW(LowerCase) * 2;
    22.         CurrentHash = Crc32Hash(LowerCase, Length);
    23.  
    24.         if (CurrentHash == Hash)
    25.         {
    26.             return (HMODULE)Module->BaseAddress;
    27.         }
    28.  
    29.         Module = (PLDR_MODULE)(struct ModuleInfoNode*)Module->InLoadOrderModuleList.Flink;
    30.     }
    31.  
    32.     return (HMODULE)NULL;
    33. }
    По твоему 64-разрядной сборки небыло?
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Это 32-битный код. И потом, и clang, и тем более mingw умеют в асм вставки, зачем cl использовать, если нужны асм вставки?
     
  5. maestroant

    maestroant New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2019
    Сообщения:
    14
    Так и я о том же! Проект на VS
     
  6. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    а что к студии нельзя нужный компиль подтянуть?
     
  7. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    449
    можно заменить ""Platform Toolset"
    на шланг например
     
    maestroant и UbIvItS нравится это.