• XSS.stack #1 – первый литературный журнал от юзеров форума

MinGW32 __readfsdword

Пожалуйста, обратите внимание, что пользователь заблокирован
Я помню конкретно, но по-моему там так же интринсики звучат, как и в студии. Intrin.h подключил? Если не так, то попробуй __builtin_readfsdword.
 
Я помню конкретно, но по-моему там так же интринсики звучат, как и в студии. Intrin.h подключил? Если не так, то попробуй __builtin_readfsdword.
use of undeclared identifier
 
Пожалуйста, обратите внимание, что пользователь заблокирован
use of undeclared identifier
Компилируется без каких-то проблем:
C:
// main.c
#include <intrin.h>

int main(int argc, char** argv) {
    unsigned long res = __readfsdword(0);
    return 0;
}
Код:
[CTest]$ i686-w64-mingw32-gcc -o main.exe main.c
[CTest]$
 
Компилируется без каких-то проблем:
C:
// main.c
#include <intrin.h>

int main(int argc, char** argv) {
    unsigned long res = __readfsdword(0);
    return 0;
}
Код:
[CTest]$ i686-w64-mingw32-gcc -o main.exe main.c
[CTest]$
Это же под x86, верно?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Под х64 __readfsdword не доступен. Я так понимаю, ты хочешь работать с какой-то структурой, пользуйся __readgsqword.
Мне как раз таки под x86 и надо, асм вставки не могу из-за OLLVM
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Мне как раз таки под x86 и надо, асм вставки не могу из-за OLLVM
Я почти уверен, что интринсика у тебя в ассемблерную вставку скомпилируется в LLVM IR. По-моему в LLVM IR не было опкодов для доступа к FS/GS, хотя может и будет какой-то вызов builtin функции вставлен, надо тестить.
 
Я почти уверен, что интринсика у тебя в ассемблерную вставку скомпилируется в LLVM IR. По-моему в LLVM IR не было опкодов для доступа к FS/GS, хотя может и путаю.
Как тогда по другому PEB получить?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
можешь расписать сниппет получения пеба? буду весьма благодарен
C:
#include <Windows.h>
#include <winternl.h>

#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)

void Main()
{
    PROCESS_BASIC_INFORMATION PBI = { 0 };
    ULONG uSize = sizeof(PROCESS_BASIC_INFORMATION);

    if (NT_SUCCESS(NtQueryInformationProcess(GetCurrentProcess(), ProcessBasicInformation, &PBI, uSize, &uSize)))
    {
        wchar_t wszPEBInfo[MAX_PATH] = { 0 };
        wsprintfW(wszPEBInfo, L"PEB Address: 0x%x", PBI.PebBaseAddress);
        MessageBoxW(0, wszPEBInfo, 0, 0);
    }
}
 
C:
#include <Windows.h>
#include <winternl.h>

#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)

void Main()
{
    PROCESS_BASIC_INFORMATION PBI = { 0 };
    ULONG uSize = sizeof(PROCESS_BASIC_INFORMATION);

    if (NT_SUCCESS(NtQueryInformationProcess(GetCurrentProcess(), ProcessBasicInformation, &PBI, uSize, &uSize)))
    {
        wchar_t wszPEBInfo[MAX_PATH] = { 0 };
        wsprintfW(wszPEBInfo, L"PEB Address: 0x%x", PBI.PebBaseAddress);
        MessageBoxW(0, wszPEBInfo, 0, 0);
    }
}
Огромное спасибо!
 
У меня нет венды под рукой, но тут написано, что она экспортируется из ntdll.dll: https://www.geoffchappell.com/studies/windows/win32/ntdll/api/index.htm
Там кстати есть и RtlGetCurrentPeb()

Wine экспортирует:
$ grep Current.eb wine/dlls/ntdll/ntdll.spec
@ stdcall -arch=i386,arm64 NtCurrentTeb()
@ stdcall RtlGetCurrentPeb()

В Wine есть и ассемблерные варианты для GCC
C:
#if defined(__i386__) && defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 2)))
static FORCEINLINE struct _TEB * WINAPI NtCurrentTeb(void)
{
    struct _TEB *teb;
    __asm__(".byte 0x64\n\tmovl (0x18),%0" : "=r" (teb));
    return teb;
}
#elif defined(__x86_64__) && defined(__GNUC__)
static FORCEINLINE struct _TEB * WINAPI NtCurrentTeb(void)
{
    struct _TEB *teb;
    __asm__(".byte 0x65\n\tmovq (0x30),%0" : "=r" (teb));
    return teb;
}
#elif

Примерно так же реализованы интринсики для mingw-w64 https://github.com/Alexpux/mingw-w64/blob/master/mingw-w64-headers/include/psdk_inc/intrin-impl.h

Но это всё про GCC, а LLVM IR это вроде в Clang? Там есть такой интересный нюанс

lib/clang/13.0.0/include/intrin.h is missing __readfsdword​

https://github.com/llvm/llvm-project/issues/50532

Мне как раз таки под x86 и надо, асм вставки не могу из-за OLLVM
Что показывает компилятор, если запустить его с ключём --vers?
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх