Есть ли какое-то кастомное решение функции __readfsdword в MinGW32 ?
void* pPEB = NULL;
__asm
{
mov pPEB, fs:[30h]
}
Без асм вставок, не могу их использоватьC:void* pPEB = NULL; __asm { mov pPEB, fs:[30h] }
use of undeclared identifierЯ помню конкретно, но по-моему там так же интринсики звучат, как и в студии. Intrin.h подключил? Если не так, то попробуй __builtin_readfsdword.
Компилируется без каких-то проблем:use of undeclared identifier
// 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, верно?Компилируется без каких-то проблем:
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, верно?
Мне как раз таки под x86 и надо, асм вставки не могу из-за OLLVMПод х64 __readfsdword не доступен. Я так понимаю, ты хочешь работать с какой-то структурой, пользуйся __readgsqword.
Я почти уверен, что интринсика у тебя в ассемблерную вставку скомпилируется в LLVM IR. По-моему в LLVM IR не было опкодов для доступа к FS/GS, хотя может и будет какой-то вызов builtin функции вставлен, надо тестить.Мне как раз таки под x86 и надо, асм вставки не могу из-за OLLVM
Как тогда по другому PEB получить?Я почти уверен, что интринсика у тебя в ассемблерную вставку скомпилируется в LLVM IR. По-моему в LLVM IR не было опкодов для доступа к FS/GS, хотя может и путаю.
NtQueryInformationProcess() -> ProcessBasicInformation.Как тогда по другому PEB получить?
Через TEB, я только не помню экспортируемая ли это функция или макрос (если макрос, то не получишь так): https://docs.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-ntcurrenttebКак тогда по другому PEB получить?
fs:[0x18]Через TEB, я только не помню экспортируемая ли это функция или макрос (если макрос, то не получишь так): https://docs.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-ntcurrentteb
можешь расписать сниппет получения пеба? буду весьма благодаренNtQueryInformationProcess() -> ProcessBasicInformation.
![]()
ФÑнкÑÐ¸Ñ NtQueryInformationProcess (winternl.h) - Win32 apps
ÐÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± Ñказанном пÑоÑеÑÑе. (NtQueryInformationProcess)docs.microsoft.com
У меня нет венды под рукой, но тут написано, что она экспортируется из ntdll.dll: https://www.geoffchappell.com/studies/windows/win32/ntdll/api/index.htmfs:[0x18]
не то
можешь расписать сниппет получения пеба? буду весьма благодарен
#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); } }
Там кстати есть и RtlGetCurrentPeb()У меня нет венды под рукой, но тут написано, что она экспортируется из ntdll.dll: https://www.geoffchappell.com/studies/windows/win32/ntdll/api/index.htm
#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
Что показывает компилятор, если запустить его с ключёмМне как раз таки под x86 и надо, асм вставки не могу из-за OLLVM
--vers?