Как получить TEB определенного потока?

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 10 сен 2011.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Как получить виртуал адресс TEB в адресном пространстве процесса,если есть только хендл потока?
    Пробую вот так
    Код (Text):
    1. typedef enum _THREAD_INFORMATION_CLASS
    2. {
    3.     ThreadBasicInformation,
    4.     ThreadTimes,
    5.     ThreadPriority,
    6.     ThreadBasePriority,
    7.     ThreadAffinityMask,
    8.     ThreadImpersonationToken,
    9.     ThreadDescriptorTableEntry,
    10.     ThreadEnableAlignmentFaultFixup,
    11.     ThreadEventPair,
    12.     ThreadQuerySetWin32StartAddress,
    13.     ThreadZeroTlsCell,
    14.     ThreadPerformanceCount,
    15.     ThreadAmILastThread,
    16.     ThreadIdealProcessor,
    17.     ThreadPriorityBoost,
    18.     ThreadSetTlsArrayAddress,
    19.     ThreadIsIoPending,
    20.     ThreadHideFromDebugger
    21. } THREAD_INFORMATION_CLASS, *PTHREAD_INFORMATION_CLASS;
    22. typedef struct THREAD_BASIC_INFORMATION
    23. {
    24.     DWORD ExitSTatus;
    25.     DWORD TebBaseAddress;
    26.     CLIENT_ID ClientId;
    27.     DWORD AffinityMask;
    28.     DWORD Priority;
    29.     DWORD BasePriority;
    30. };
    31. DWORD WINAPI thrFunc(LPVOID lParam)
    32. {
    33.     MessageBoxA(0,"thread","",MB_OK);
    34.     return 0;
    35. }
    36. void DisplayError(DWORD Err)
    37. {
    38.    LPVOID lpMessageBuffer;
    39.    HMODULE Hand = LoadLibrary(L"ntdll.dll");  
    40.    FormatMessage(
    41.        FORMAT_MESSAGE_ALLOCATE_BUFFER |
    42.        FORMAT_MESSAGE_FROM_SYSTEM |
    43.        FORMAT_MESSAGE_FROM_HMODULE,
    44.        Hand,
    45.        Err,  
    46.        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    47.        (LPTSTR) &lpMessageBuffer,  
    48.        0,  
    49.        NULL );
    50.    MessageBox(0,(wchar_t*)lpMessageBuffer,L"",MB_OK);
    51.    LocalFree( lpMessageBuffer );
    52.    //FreeLibrary(Hand);
    53. }
    54. typedef NTSTATUS (NTAPI *_ZwQueryInformationThread)(IN HANDLE ThreadHandle,IN THREAD_INFORMATION_CLASS ThreadInformationClass,OUT PVOID ThreadInformation,IN ULONG ThreadInformationLength,OUT PULONG ReturnLength OPTIONAL);
    55. int _tmain(int argc, _TCHAR* argv[])
    56. {
    57.     HANDLE thr=CreateThread(0,0,thrFunc,0,CREATE_SUSPENDED,0);
    58.     HMODULE tn=LoadLibrary(L"ntdll.dll");
    59.     _ZwQueryInformationThread dyn_ZwQueryInformationThread=(_ZwQueryInformationThread)GetProcAddress(tn,"ZwQueryInformationThread");
    60.     THREAD_INFORMATION_CLASS tic;
    61.     THREAD_BASIC_INFORMATION  tbi={0};
    62.     DisplayError(dyn_ZwQueryInformationThread(thr,tic,&tbi,sizeof(tbi),0));
    63.     ResumeThread(thr);
    64.     printf("%X",tbi.TebBaseAddress);
    65.     getch();
    66.     return 0;
    67. }
    Только вот видимо как то неправильно вызываю ZwQueryInformationThread.Потому что описание ошибки звучит так
    Как правильно эту ф-цию вызвать?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    А переменную tic кто будет инициализировать - Пушкин?
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    О точно затупил :dntknw: там же IN а не OUT
     
  4. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Щяс глянул адреса PEB,из TEB родительского потока и дочернего.Они разные О_о Это что получается у каждого потока свой отдельный PEB?
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    PEB - один на процесс. Видимо опять где-то "затупил" ;)
     
  6. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Таки верно, код просто непашет (
    Код (Text):
    1. typedef enum _THREAD_INFORMATION_CLASS
    2. {
    3.     ThreadBasicInformation,
    4.     ThreadTimes,
    5.     ThreadPriority,
    6.     ThreadBasePriority,
    7.     ThreadAffinityMask,
    8.     ThreadImpersonationToken,
    9.     ThreadDescriptorTableEntry,
    10.     ThreadEnableAlignmentFaultFixup,
    11.     ThreadEventPair,
    12.     ThreadQuerySetWin32StartAddress,
    13.     ThreadZeroTlsCell,
    14.     ThreadPerformanceCount,
    15.     ThreadAmILastThread,
    16.     ThreadIdealProcessor,
    17.     ThreadPriorityBoost,
    18.     ThreadSetTlsArrayAddress,
    19.     ThreadIsIoPending,
    20.     ThreadHideFromDebugger
    21. } THREAD_INFORMATION_CLASS, *PTHREAD_INFORMATION_CLASS;
    22. typedef struct THREAD_BASIC_INFORMATION
    23. {
    24.     DWORD ExitSTatus;
    25.     DWORD TebBaseAddress;
    26.     CLIENT_ID ClientId;
    27.     DWORD AffinityMask;
    28.     DWORD Priority;
    29.     DWORD BasePriority;
    30. };
    31. DWORD WINAPI thrFunc(LPVOID lParam)
    32. {
    33.     MessageBoxA(0,"thread","",MB_OK);
    34.     if(strcmp(tls_char,"Hello world!")!=0)
    35.     {
    36.         return 1;
    37.     }
    38.     return 0;
    39. }
    40. PPEB CurrentPeb()
    41. {
    42.     DWORD PEBadr=0;
    43.     __asm
    44.     {
    45.         mov ecx,FS:[30h]
    46.         mov PEBadr,ecx
    47.     }
    48.     return((PEB*)PEBadr);
    49. }
    50. void DisplayError(DWORD Err)
    51. {
    52.    LPVOID lpMessageBuffer;
    53.    HMODULE Hand = LoadLibrary(L"ntdll.dll");  
    54.    FormatMessage(
    55.        FORMAT_MESSAGE_ALLOCATE_BUFFER |
    56.        FORMAT_MESSAGE_FROM_SYSTEM |
    57.        FORMAT_MESSAGE_FROM_HMODULE,
    58.        Hand,
    59.        Err,  
    60.        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    61.        (LPTSTR) &lpMessageBuffer,  
    62.        0,  
    63.        NULL );
    64.    MessageBox(0,(wchar_t*)lpMessageBuffer,L"",MB_OK);
    65.    LocalFree( lpMessageBuffer );
    66.    //FreeLibrary(Hand);
    67. }
    68. typedef NTSTATUS (NTAPI *_ZwQueryInformationThread)(IN HANDLE ThreadHandle,IN THREAD_INFORMATION_CLASS ThreadInformationClass,OUT PVOID ThreadInformation,IN ULONG ThreadInformationLength,OUT PULONG ReturnLength OPTIONAL);
    69. int _tmain(int argc, _TCHAR* argv[])
    70. {
    71.     HMODULE selfbase=GetModuleHandle(NULL);
    72.     printf("Base: %X\n",selfbase);
    73.     HANDLE thr=CreateThread(0,0,thrFunc,0,CREATE_SUSPENDED,0);
    74.     HMODULE tn=LoadLibrary(L"ntdll.dll");
    75.     _ZwQueryInformationThread dyn_ZwQueryInformationThread=(_ZwQueryInformationThread)GetProcAddress(tn,"ZwQueryInformationThread");
    76.     THREAD_INFORMATION_CLASS tic;
    77.     THREAD_BASIC_INFORMATION  tbi={0};
    78.     DWORD stat=dyn_ZwQueryInformationThread(thr,ThreadBasicInformation,&tbi,sizeof(tbi),0);
    79.     if(stat!=STATUS_SUCCESS)
    80.     {
    81.         DisplayError(stat);
    82.     }
    83.     TEB *teb=(TEB*)tbi.TebBaseAddress;
    84.     PEB *thrPEB=(PEB *)teb->Peb;
    85.     PEB *mPEB=CurrentPeb();
    86.     printf("PEB adr from thread: %X;Base: %X\n",thrPEB,thrPEB->ImageBaseAddress);
    87.     printf("PEB from main: %X;Base %X\n",mPEB,mPEB->ImageBaseAddress);
    88.     ResumeThread(thr);
    89.     getch();
    90.     return 0;
    91. }
    Цифры разнятся( Может в 7ке есть какие то ограничения для вызова ZwQueryInformationThread ?
     
  7. freyr

    freyr New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2010
    Сообщения:
    95