Как использовать NtCurrentTeb () без заголовочных файлов Windows? - PullRequest
0 голосов
/ 02 октября 2018

Windows хранит TEB в сегментном регистре FS (32 бита) или GS (64 бита).В программе, использующей NtCurrentPeb(), инструкция x86 равна mov rax, gs:60h.Значение 0x60 равно offsetof(TEB, ProcessEnvironmentBlock).

Чтобы использовать это в программе, я должен включить заголовочный файл Windows.h и Winternl.h, в котором есть куча других #define.Как сказал вопрос, я хочу использовать функцию без этих заголовочных файлов и путем прямого доступа к сегментному регистру.Я также сделал отдельный заголовочный файл со структурой TEB и PEB.Так как я могу это сделать?Я думал с ключевым словом __asm и typedef NtCurrentTeb() или чем-то еще.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Чтобы прочитать из сегмента gs или fs, я использовал эту сборку в Visual Studio.Создайте пустой проект C / C ++ в Visual Studio с , эти параметры включены .Сегментный регистр fs или gs обеспечивает структуру NT_TIB в 32-битной и 64-битной Windows соответственно.TEB имеет смещение 0x30 в структуре NT_TIB.Таким образом, сборка в 64-битной будет: mov rax, gs:[30h].

Вот пример исходного кода для получения текущей директории исполняемого файла:

  • ProcParam.asm:
.code

ProcParam PROC

mov rax, gs:[30h]      ; TEB from gs in 64 bit only
mov rax, [rax+60h]     ; PEB
mov rax, [rax+20h]     ; RTL_USER_PROCESS_PARAMETERS
ret

ProcParam ENDP

end
  • main.c:
#include <stdio.h>

typedef struct _UNICODE_STRING {
    unsigned short Length;
    unsigned short MaximumLength;
    wchar_t* Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

typedef struct _CURDIR {
    UNICODE_STRING DosPath;
    void* Handle;
} CURDIR, *PCURDIR;

/*Extracted from ntdll.pdb file*/

typedef struct _RTL_USER_PROCESS_PARAMETERS {
    unsigned int MaximumLength;
    unsigned int Length;
    unsigned int Flags;
    unsigned int DebugFlags;
    void* ConsoleHandle;
    unsigned int ConsoleFlags;
    void* StandardInput;
    void* StandardOutput;
    void* StandardError;
    CURDIR CurrentDirectory;
    /*Many more*/
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;

PRTL_USER_PROCESS_PARAMETERS ProcParam(void);

int main(void)
{
    wprintf(L"%s\n", ProcParam()->CurrentDirectory.DosPath.Buffer);
}
0 голосов
/ 03 октября 2018

Объявить прототип функции и связать ее с ntdll.dll.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...