Как получить виртуал адресс TEB в адресном пространстве процесса,если есть только хендл потока? Пробую вот так Код (Text): typedef enum _THREAD_INFORMATION_CLASS { ThreadBasicInformation, ThreadTimes, ThreadPriority, ThreadBasePriority, ThreadAffinityMask, ThreadImpersonationToken, ThreadDescriptorTableEntry, ThreadEnableAlignmentFaultFixup, ThreadEventPair, ThreadQuerySetWin32StartAddress, ThreadZeroTlsCell, ThreadPerformanceCount, ThreadAmILastThread, ThreadIdealProcessor, ThreadPriorityBoost, ThreadSetTlsArrayAddress, ThreadIsIoPending, ThreadHideFromDebugger } THREAD_INFORMATION_CLASS, *PTHREAD_INFORMATION_CLASS; typedef struct THREAD_BASIC_INFORMATION { DWORD ExitSTatus; DWORD TebBaseAddress; CLIENT_ID ClientId; DWORD AffinityMask; DWORD Priority; DWORD BasePriority; }; DWORD WINAPI thrFunc(LPVOID lParam) { MessageBoxA(0,"thread","",MB_OK); return 0; } void DisplayError(DWORD Err) { LPVOID lpMessageBuffer; HMODULE Hand = LoadLibrary(L"ntdll.dll"); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, Hand, Err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL ); MessageBox(0,(wchar_t*)lpMessageBuffer,L"",MB_OK); LocalFree( lpMessageBuffer ); //FreeLibrary(Hand); } typedef NTSTATUS (NTAPI *_ZwQueryInformationThread)(IN HANDLE ThreadHandle,IN THREAD_INFORMATION_CLASS ThreadInformationClass,OUT PVOID ThreadInformation,IN ULONG ThreadInformationLength,OUT PULONG ReturnLength OPTIONAL); int _tmain(int argc, _TCHAR* argv[]) { HANDLE thr=CreateThread(0,0,thrFunc,0,CREATE_SUSPENDED,0); HMODULE tn=LoadLibrary(L"ntdll.dll"); _ZwQueryInformationThread dyn_ZwQueryInformationThread=(_ZwQueryInformationThread)GetProcAddress(tn,"ZwQueryInformationThread"); THREAD_INFORMATION_CLASS tic; THREAD_BASIC_INFORMATION tbi={0}; DisplayError(dyn_ZwQueryInformationThread(thr,tic,&tbi,sizeof(tbi),0)); ResumeThread(thr); printf("%X",tbi.TebBaseAddress); getch(); return 0; } Только вот видимо как то неправильно вызываю ZwQueryInformationThread.Потому что описание ошибки звучит так Как правильно эту ф-цию вызвать?
Щяс глянул адреса PEB,из TEB родительского потока и дочернего.Они разные О_о Это что получается у каждого потока свой отдельный PEB?
Таки верно, код просто непашет ( Код (Text): typedef enum _THREAD_INFORMATION_CLASS { ThreadBasicInformation, ThreadTimes, ThreadPriority, ThreadBasePriority, ThreadAffinityMask, ThreadImpersonationToken, ThreadDescriptorTableEntry, ThreadEnableAlignmentFaultFixup, ThreadEventPair, ThreadQuerySetWin32StartAddress, ThreadZeroTlsCell, ThreadPerformanceCount, ThreadAmILastThread, ThreadIdealProcessor, ThreadPriorityBoost, ThreadSetTlsArrayAddress, ThreadIsIoPending, ThreadHideFromDebugger } THREAD_INFORMATION_CLASS, *PTHREAD_INFORMATION_CLASS; typedef struct THREAD_BASIC_INFORMATION { DWORD ExitSTatus; DWORD TebBaseAddress; CLIENT_ID ClientId; DWORD AffinityMask; DWORD Priority; DWORD BasePriority; }; DWORD WINAPI thrFunc(LPVOID lParam) { MessageBoxA(0,"thread","",MB_OK); if(strcmp(tls_char,"Hello world!")!=0) { return 1; } return 0; } PPEB CurrentPeb() { DWORD PEBadr=0; __asm { mov ecx,FS:[30h] mov PEBadr,ecx } return((PEB*)PEBadr); } void DisplayError(DWORD Err) { LPVOID lpMessageBuffer; HMODULE Hand = LoadLibrary(L"ntdll.dll"); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, Hand, Err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL ); MessageBox(0,(wchar_t*)lpMessageBuffer,L"",MB_OK); LocalFree( lpMessageBuffer ); //FreeLibrary(Hand); } typedef NTSTATUS (NTAPI *_ZwQueryInformationThread)(IN HANDLE ThreadHandle,IN THREAD_INFORMATION_CLASS ThreadInformationClass,OUT PVOID ThreadInformation,IN ULONG ThreadInformationLength,OUT PULONG ReturnLength OPTIONAL); int _tmain(int argc, _TCHAR* argv[]) { HMODULE selfbase=GetModuleHandle(NULL); printf("Base: %X\n",selfbase); HANDLE thr=CreateThread(0,0,thrFunc,0,CREATE_SUSPENDED,0); HMODULE tn=LoadLibrary(L"ntdll.dll"); _ZwQueryInformationThread dyn_ZwQueryInformationThread=(_ZwQueryInformationThread)GetProcAddress(tn,"ZwQueryInformationThread"); THREAD_INFORMATION_CLASS tic; THREAD_BASIC_INFORMATION tbi={0}; DWORD stat=dyn_ZwQueryInformationThread(thr,ThreadBasicInformation,&tbi,sizeof(tbi),0); if(stat!=STATUS_SUCCESS) { DisplayError(stat); } TEB *teb=(TEB*)tbi.TebBaseAddress; PEB *thrPEB=(PEB *)teb->Peb; PEB *mPEB=CurrentPeb(); printf("PEB adr from thread: %X;Base: %X\n",thrPEB,thrPEB->ImageBaseAddress); printf("PEB from main: %X;Base %X\n",mPEB,mPEB->ImageBaseAddress); ResumeThread(thr); getch(); return 0; } Цифры разнятся( Может в 7ке есть какие то ограничения для вызова ZwQueryInformationThread ?