Как узнать адресс начала функции потока зная хэндл.

Тема в разделе "WASM.WIN32", создана пользователем Sercher, 12 июн 2011.

  1. Sercher

    Sercher New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    59
    В процессе множество потоков которые почти рандомно создаются по нескольким функциям, например:

    proc Thread1
    ...
    .finish:
    ret

    proc Thread2
    ...
    .finish:
    ret

    proc Thread3
    ...
    .finish:
    ret

    При определенных условиях необходимо уничтожить все потоки созданы например по начальному адресу Thread3, при этом потоки Thread1 и Thread2 должны работать дальше.
    Сейчас я храню указатели всех созданных потоков с индексом указывающим причастность к конкретной функции Thread. И вот меня заинтересовало есть вообще необходимость хранить указатели потоков тратя на них память, если можно выявить все потоки относящиеся к процессу и просто смотреть какой начальный адрес у потока, если адрес =Thread3 то удаляем поток если нет то ищем дальше. C задачей получения списка всех потоков я справился благодаря CreateToolhelp32Snapshot, перебираю все потоки относящиеся к моему процессу и получаю хэндл потока через OpenThread передавая threadid, как теперь имея хэндл потока получить его стартовый адрес? (Программа Process Explorer это както делает...)
     
  2. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    ::ULONG StartAddress;
    ::NTSTATUS status = ::ZwQueryInformationThread(
    ThreadHandle,
    ::ThreadQuerySetWin32StartAddress,
    &StartAddress,
    sizeof( ::ULONG),
    NULL
    );
     
  3. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    SYSTEM_EXTENDED_THREAD_INFORMATION.Win32StartAddress
     
  4. Sercher

    Sercher New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    59
    есть другие варианты? строки в мсдн смущают:Zw(Nt)QueryInformationThread may be altered or unavailable in future versions of Windows. Applications should use the alternate functions listed in this topic.....
    The NtQueryInformationThread function is internal to the operating system and subject to change from one release of Windows to another. To maintain the compatibility of your application, it is better to use the public function previously mentioned instead.
     
  5. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    MSDN:
    Само собой понятно, что обычным приложениям(это отладочный функционал) это юзать не нужно, также как и знать стартап адреса. Если вы решили использовать нэйтив, то должны смириться с его изменениями в версиях.

    Иначе регистрируйте загрузочный нотификатор(например "DllMain") и находите стартап контекст, посредством бактрейса.
     
  6. Sercher

    Sercher New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    59
    Подскажите в Vista (32/64), 7 (32/64) and server 2003-2007 прототип этой функции одинаковый ?, то есть в этих версиях ее функционал и параметры вызова одинаковы? (у меня основном на этих ОС сеть строиться)
     
  7. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    да
     
  8. Sercher

    Sercher New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    59
    Спасибо за помощь, буду NtQueryInformationThread использовать.
     
  9. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    хотел только добавить, что возвращается именно адрес пользовательской функции потока, а не BaseProcessStart или BaseThreadStart
     
  10. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    опережая вопрос. Читать, например, так
    Код (Text):
    1. typedef NTSTATUS (__stdcall * myNtQueryInformationThread) ( HANDLE,THREADINFOCLASS , PVOID, ULONG, PULONG);
    2.  
    3. myNtQueryInformationThread NtQueryInformationThread = ( FPTR_NtQueryInformationThread ) GetProcAddress ( GetModuleHandleA ( "ntdll"), "NtQueryInformationThread");
    4.  
    5. (NtQueryInformationThread)(hnd, (THREADINFOCLASS)9, &addr,sizeof(long),0);
    это если DDK нет
     
  11. Sercher

    Sercher New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    59
    invoke LoadLibrary,_nt
    invoke GetProcAddress,eax,_fn
    mov [qqq],eax
    ....
    stdcall [qqq],[ppp],9,buffer2,4,0


    _nt TCHAR 'Ntdll.dll',0
    _fn TCHAR 'NtQueryInformationThread',0
     
  12. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    Sercher
    Какой ужас.. Использовать динамический импорт из нэйтива это маразм.
    1. Бред использовать LoadLibrary() для подгрузки модуля, из которого загружается модуль, в котором находится LoadLibrary().
    2. Где проверка статуса ?
    3. GetProcAddress,eax,_fn - обычно в Eax ссылка на _fn.
    4. Что за корявые имена qqq ?
    5. Удалять говнокод весьма плохо, ясно почему было отключено редактирование.

    Учить матчасть!
     
  13. Sercher

    Sercher New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    59
    1)Че то ты меня запутал, вот строки МСДН:
    This function has no associated import library. You must use the LoadLibrary and GetProcAddress functions to dynamically link to Ntdll.dll. что я и зделал.
    2-4) Я не пишу рабочий вариант программы ( в этом варианте и будут , имена по фэншую, проверки, коментарии) а пока смотрю как что работает.
    После танцев все работает на "УРА", теперь могу не хранить все хэндлы потоков.
    5)Редактирование прекрасно работает.
     
  14. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    klzlk
    Вы чего на человека напали
    1. Вообще то говоря LoadLibrary в Kernel32.dll находится, которая в свою очередь тянет ntdll.dll) Но GetModuleHandle должно хватить)
    2. Каждый волен писать как хочет и вопрос не в корректности программы!
    3. Не понял Вашего замечания на этот пункт
    4. Как называть имена в тестовой программе это уже точно дело каждого

    Человек и учит!

    Нападать на людей которые интересуются чем либо ДУРНОЙ ТОН!
     
  15. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    h0t
    1. Маразм!
    2. Тоесть я должен гадать, какие значения будут возвращены после множества инвалидных вызовов, завершившихся с ошибкой ? Так мб это какоето левое значение на стеке. Я хз и знать не хочу, это тс проблемы.
    3. lea eax,ref/push eax/push eax - понятно ?
    4. Называть нужно так, чтоб осталось желание прочитать этот годный код, после прочтения имён. Иначе тс останется один решать свои проблемы =)

    Я не нападал, а дал совет про нормальную реализацию и что нужно поправить. Если вы это считаете нападением, тогда защищайтесь..! шучу конечно :)

    Вообще приемлемое решения заключается в получении ссылки непосредственно из слепка, что было сказано мной выше и проигнорировано, в следствии непонимания написанного.
     
  16. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Кстати забыл сказать что LoadLibrary для загруженного модуля ничего не делает, просто возвращает адрес. Так что читать документацию и Вам не вредно.
    А к Вам этот код не имел никакого отношения, вопрос человека не в этом заключался

    Повторяю вопрос человека не в этом заключался.

    а ничего что push offset string делают)
     
  17. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    h0t
    На сколько помню подгрузка модуля увеличивает счётчик загрузок, хотя тут это не существенно. Видимо проблема в отсутствии ntdll.lib :lol:

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

    Не вижу я типа переменной. Мб это локаль, смещение или константа. Так как я привык юзать масм, где подобные вызовы приводят к разрушению Eax, то так я и написал.
     
  18. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Sercher
    справедливости ради, нужно заметить что лучше все таки писать
    Код (Text):
    1. invoke  GetProcAddress,eax, addr _fn
     
  19. Sercher

    Sercher New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    59
    как из слепка получить адрес начала потока? Thread32Nex дает TID ->OpenThread дает по TID хэндл потока ->NtQueryInformationThread дает по хэндлу адресс начала функции потока? Вроде все, что и требовалось. Как напрямую без при образований получить адрес?
     
  20. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Sercher
    Присоединяюсь мне тоже)
    код, как говорится, в студию!