Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

получить значение регистра из контекста чужого процесса

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> получить значение регистра из контекста чужого процесса
Имя
Сообщение << Старые топики   Новые топики >>
получить значение регистра из контекста чужого процесса - 2011-11-12 18:28:11.843333   
yurket

Сообщений: 69
Оценки: 0
Присоединился: 2009-05-04 23:47:54.993333
есть какой-то процесс, скажем, с висящим messagebox-ом. По заданию нужно из своей программы получить адрес PEB этого процесса (ну или TEB, не суть важно) под win7. Пытался получить значение регистра fs из контекста треда так (по сути это чистый пример из msdn):
void PE :: ReadProcMem(uBshort pid) { HANDLE proc; CONTEXT ctx; HANDLE hThreadSnap = INVALID_HANDLE_VALUE; HANDLE hOpenedThread; THREADENTRY32 te32; // Take a snapshot of all running threads hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0); if( hThreadSnap == INVALID_HANDLE_VALUE ) { printf("\nThread enumeration failed!\n"); return; } // Fill in the size of the structure before using it. te32.dwSize = sizeof(THREADENTRY32 ); // Retrieve information about the first thread, // and exit if unsuccessful if( !Thread32First( hThreadSnap, &te32 ) ) { printf("\nThread32First failed!\n"); CloseHandle( hThreadSnap ); // Must clean up the snapshot object! return; } do { if( te32.th32OwnerProcessID == pid ) { _tprintf( TEXT("\n THREAD ID = 0x%08X"), te32.th32ThreadID ); _tprintf( TEXT("\n base priority = %d"), te32.tpBasePri ); _tprintf( TEXT("\n delta priority = %d"), te32.tpDeltaPri ); break; } } while( Thread32Next(hThreadSnap, &te32 ) ); [b]if ( (hOpenedThread = OpenThread(THREAD_ALL_ACCESS, TRUE, te32.th32ThreadID)) == NULL) { printf("\nCan't open thread because of %d", GetLastError()); return; } ctx.ContextFlags = CONTEXT_ALL; GetThreadContext(hOpenedThread, &ctx); printf("\nFS: %#X", ctx.SegFs);[/b] // Don't forget to clean up the snapshot object. CloseHandle( hThreadSnap ); return; } в итоге получается:
FS: 0x3B понятно, что я ожидаю адрес TEB… почему такой адрес в FS? или я что-то не так делаю? и есть ли другие способы получить указатель на TEB?
Post #: 1
RE: получить значение регистра из контекста чужого процесса - 2011-11-13 09:32:18.163333   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
Адрес TEB можно получить через NtCurrentTeb, либо асм вставкой MOV EAX,DWORD PTR FS:[18h]
Адрес PEB можно получить из структуры TEB:



MOV EAX,DWORD PTR FS:[30h]

Также адрес PEB можно получить через ZwQueryInformationProcess с ProcessInformationClass = ProcessBasicInformation (0)
структура:
typedef struct _PROCESS_BASIC_INFORMATION { NTSTATUS ExitStatus; PPEB PebBaseAddress; KAFFINITY AffinityMask; KPRIORITY BasePriority; ULONG UniqueProcessId; ULONG InheritedFromUniqueProcessId; } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;

TEB чужого потока можно получить через ZwQueryInformationThread с ThreadInformationClass = ThreadBasicInformation (0)
структура:
typedef struct _THREAD_BASIC_INFORMATION { NTSTATUS ExitStatus; PNT_TIB TebBaseAddress; CLIENT_ID ClientId; KAFFINITY AffinityMask; KPRIORITY Priority; KPRIORITY BasePriority; } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
Post #: 2
RE: получить значение регистра из контекста чужого процесса - 2011-11-13 16:38:00.976666   
yurket

Сообщений: 69
Оценки: 0
Присоединился: 2009-05-04 23:47:54.993333
спасибо. а user mode вариантов никаких нету??
Post #: 3
RE: получить значение регистра из контекста чужого процесса - 2011-11-13 16:38:41.143333   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
А это usermode и есть
Post #: 4
RE: получить значение регистра из контекста чужого процесса - 2011-11-13 16:56:46.130000   
yurket

Сообщений: 69
Оценки: 0
Присоединился: 2009-05-04 23:47:54.993333
как видно, я в этой теме слегка плаваю, хе-хе) поэтому глупый вопрос: я правильно понимаю, что нужно взять адрес ZwQueryInformationThread просто через GetProcAdress из ntdll?
Post #: 5
RE: получить значение регистра из контекста чужого процесса - 2011-11-13 17:01:24.246666   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
можно и так
Post #: 6
RE: получить значение регистра из контекста чужого процесса - 2011-11-13 17:07:43.903333   
yurket

Сообщений: 69
Оценки: 0
Присоединился: 2009-05-04 23:47:54.993333
предположу, что еще есть реализация в каком-нибудь WDK? если нет, то как еще можно вызвать такого рода функцию?
Post #: 7
RE: получить значение регистра из контекста чужого процесса - 2011-11-13 17:09:43.900000   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
библиотеку то подключите к проекту и вызывайте как все остальные апи
Post #: 8
RE: получить значение регистра из контекста чужого процесса - 2011-11-13 17:20:19.480000   
yurket

Сообщений: 69
Оценки: 0
Присоединился: 2009-05-04 23:47:54.993333
спасибо =) кстати, а почему в превом моем посте в fs такой адрес не знаете???
Post #: 9
RE: получить значение регистра из контекста чужого процесса - 2011-11-14 09:36:19.856666   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
Это не адрес, это значение сегментного регистра. подробнее про них:
http://ru.osdev.wikia.com/wiki/%D0%A1%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D1%8B

http://ru.wikipedia.org/wiki/X86

Post #: 10
RE: получить значение регистра из контекста чужого процесса - 2011-11-14 17:44:58.476666   
yurket

Сообщений: 69
Оценки: 0
Присоединился: 2009-05-04 23:47:54.993333
спасибо, со всем разобрался =) оказывается, в оле изначально не туда посморел - отсюда и проблемы…
Post #: 11
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> получить значение регистра из контекста чужого процесса







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.