Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Получить start address потока на windows 7
Посл.ответ Сообщение

Ранг: 7.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 ноября 2011 01:38
· Личное сообщение · #1

В ранних версиях можно было получить при помощи
Code:
  1. NTSTATUS WINAPI NtQueryInformationThread(
  2.   __in       HANDLE ThreadHandle,
  3.   __in       THREADINFOCLASS ThreadInformationClass, // ThreadQuerySetWin32StartAddress
  4.   __inout    PVOID ThreadInformation, // указатель на буффер
  5.   __in       ULONG ThreadInformationLength,
  6.   __out_opt  PULONG ReturnLength
  7. );

В семерке же перечисление THREADINFOCLASS не содержит ThreadQuerySetWin32StartAddress.
Есть еще
Code:
  1. NTSTATUS WINAPI NtQuerySystemInformation(
  2.   __in       SYSTEM_INFORMATION_CLASS SystemInformationClass, // SystemProcessInformation
  3.   __inout    PVOID SystemInformation, // указатель на массив SYSTEM_PROCESS_INFORMATION
  4.   __in       ULONG SystemInformationLength,
  5.   __out_opt  PULONG ReturnLength
  6. );

Раньше SYSTEM_PROCESS_INFORMATION содержала массив SYSTEM_THREAD_INFORMATION, из которого как раз можно было достать start address каждого потока. SYSTEM_PROCESS_INFORMATION в семерке уже не тот, SYSTEM_THREAD_INFORMATION вообще убрали.
И как теперь start address добыть?



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 12 ноября 2011 12:54 · Поправил: bowrouco
· Личное сообщение · #2

Правильно что этот инфокласс убрали, бессмысленно его использовать. Можно поток создать из системных модулей(подобно SHCreateThread()), либо использовать системные потоки.



Ранг: 7.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 ноября 2011 13:54
· Личное сообщение · #3

bowrouco, нужно получить start address потока чужого процесса, который может быть создан как угодно, это не важно.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 12 ноября 2011 13:58 · Поправил: Alchemistry
· Личное сообщение · #4

GoldenJoe

И куда же этот инфо класс делся? Совершенно спокойно получил StartAddress только что для текущего потока. Win7, SP1, x86.

Более того MSDN тоже не в курсе ваших изысканий.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684283(v=vs.85).aspx

If ThreadQuerySetWin32StartAddress is specified for the ThreadInformationClass parameter, this buffer must be large enough to hold a PVOID value, which is the start address of the thread.

bowrouco

Твой бессмысленный поток сознания уже приелся.



Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 12 ноября 2011 14:11
· Личное сообщение · #5

Бугага, bowrouco жжет как всегда.

Не забывайте также, что StartAddress и Win32StartAddress это не одно и тоже, и про то, что большинство потоков инициализирует специальная рутина - kernel32!BaseThreadStartThunk (kernel32!BaseProcessStartThunk для первого потока процесса), ntdll!RtlUserThreadStart. И про то, что поле Win32StartAddress может содержать значение LpcReceivedMessageId (до Висты) вместо стартового адреса. И про то, что малвара эти значения может менять. На семерке как раз все более-менее стабильно, в плане получения значения Win32StartAddress, и инфокласс этот работает.

-----
Research is my purpose




Ранг: 7.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 ноября 2011 14:11 · Поправил: GoldenJoe
· Личное сообщение · #6

Alchemistry

Никаких ThreadQuerySetWin32StartAddress.



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 12 ноября 2011 14:25 · Поправил: bowrouco
· Личное сообщение · #7

Alchemistry
Закрыли его, там заглушка возвращающая STATUS_UNSUCCESSFUL. В W7 и 8 одинаково, я смотрел ядро. Сейчас некогда, позже точно посмотрю.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 12 ноября 2011 14:43 · Поправил: Alchemistry
· Личное сообщение · #8

bowrouco пишет:
Закрыли его, там заглушка возвращающая STATUS_UNSUCCESSFUL. В W7 и 8 одинаково, я смотрел ядро. Сейчас некогда, позже точно посмотрю.


Видимо влом признать что ты неправ, ага? Закрыли так, что возвращает корректное значение, пишет правильное количество returned bytes и выдает STATUS_SUCCESS. Неплохо так закрыли - табличка сарказм.

И да, W8 да, это конечно мега показатель. Оно даже не бета, а DevPreview, а ты уже решил, что все так и будет в релизе. Ну-ну, повеселил.

GoldenJoe

Выкиньте это описание из документации и используйте старые из символов, например. Все новые значения практически всегда добавляются в конец перечислений. Никто ломать старое не будет никогда, пока жива сама архитектура.



Ранг: 65.4 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 12 ноября 2011 15:57
· Личное сообщение · #9

Ничего там не закрыли все работает как надо. Все как Error_Log написал.



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 12 ноября 2011 16:13
· Личное сообщение · #10

GoldenJoe
Наместе поля,да и куда они денутся.
Не в одной софтверной компание некогда не будут кординально менять код на который уже затратились,максимум рефакторинг.



Ранг: 7.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 ноября 2011 18:50
· Личное сообщение · #11

Описание не из документации, а из winternl.h. Как это выкинуть? Свою SYSTEM_THREAD_INFORMATION объявить чтоли?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 12 ноября 2011 19:01
· Личное сообщение · #12

GoldenJoe пишет:
Свою SYSTEM_THREAD_INFORMATION объявить чтоли?

Ну объяви, в чем проблема то? Наверное и студийный файл пофиксить можно.

-----
Yann Tiersen best and do not fuck




Ранг: 7.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 ноября 2011 20:50
· Личное сообщение · #13

Объявил, вроде работает, и правда не убрали. Всем спасибо, тема закрыта.


 eXeL@B —› Программирование —› Получить start address потока на windows 7
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати