Какая функция просто убивает поток, но не процесс?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 11 апр 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Я заметил.
    Я про другое совсем говорю.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    amvoz
    Что возвращает NtCreateThread ?
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Хэндл потока. который создаёт.
    Создаёт в процессе, которому принадлежит, если можно так выразиться
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    В регистре Eax какое значение возвращает ?
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Я её не использую, откуда же мне знать?
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Я сейчас остановидся на этом.

    CreateRemoteThread (hProcess, 0, 0, GetProcAddress(hmodul,"ResumeThread"), hThread, 0, 0);

    Хоть SPA много чего напутал и послал меня куда подальше, но всё равно спасибо ему.
    Буду это пробивать.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Используешь. Кстати можно прототип в мсдн посмотреть для CreateRemoteThread(), както криво у тебя написано.
     
  8. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Ничего не выходит у меня.
    Отправка в msnd это удар ниже пояса. Мне английский учить?
    Вот, чем не прототип?
    http://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_createremotethread.htm
    Там мне непонятно на счёт четвёртого и пятого параметра. Непонятно, да. Могу я чего-нибудь не понимать? Из-за них и криво написано.
    Четвёртый параметр это функция потока. Так? Так. И тут же написано, что она "обозначает начальный адрес потока в удаленном процессе."

    Почему не написать что это просто адрес потока в удалённом процессе, если это действительно адрес? (Мне на английском понятнее разве будет?)

    Ну, а так-то вроде всё правильно делаю. Ладно, у меня CreateRemoteThread() и у неё семь параметров. Какой неверен? Как отследить в отладчике? Ума не приложу.
    Просьба поэтому такая будет. Если есть у кого рабочий пример CreateRemoteThread() дайте, пожалуйста, буду с ним ковыряться.
    В Google есть, но!
    Там не то. Там везде такая триада

    Virtual(забыл_как_дальше, функция память выделяет) ();
    WriteProcessMemory ();
    CreateRemoteThread()

    И почему-то маленьких примеров-исходников нет, а есть большие по перехвату api-функций. И среди прочего кода такая вот связка.

    И поэтому там везде Четвёртый параметр это адрес потока, а пятый ноль. А мне не надо внедрять код в чужой процесс и память там выделять не надо, там уже код есть. Просто исполнить его и всё тут.
     
  9. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Как-то криво не аргумент
    SPA, например, не считает, что криво.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Выложи модуль скомпиленый потестить.
     
  11. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Ну, потестить- не потестить, но взгляните, он минимальный у меня.
    Код номер один (process1.exe)


    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3. #include <Winnt.h>
    4. int main () {
    5.  HANDLE handle_potoka;
    6.  MessageBoxA (0, "1111111\n", "111111\n", 0);
    7.  printf ("%x",handle_potoka= GetCurrentThread());
    8.  SuspendThread (handle_potoka);
    9.  MessageBoxA (0, "22222222\n", "2222222\n", 0);
    10.  return 0;
    11. };
    Понятно, да? Вот посмотрели на хэндл потока (0Xfffffffe) и поток застопорился на функции SuspendThread (handle_potoka)

    А вот второй код, файл process2.exe запускается вслед за первым. Во втором используется CreateRemoteThread и она должна создать поток в process1.exe

    Код (Text):
    1. #include <windows.h>
    2. #include "..\Nahozhdenie_hendla_processa\handle_processa.cpp"
    3. int main () {
    4.  
    5.  CreateRemoteThread (handle_processa ("process1.exe"), 0, 0,
    6.  
    7.   (unsigned long (__stdcall *)(void *))0X7c81e92a,
    8.  
    9.   (void*)0Xffffffe, 0, 0);
    10. }
    ...0X7c81e92a это адрес функции ResumeThread, она принимает один параметр- хэндл потока. Это пятый параметр, он равен, как мы помним 0Xfffffffe

    Хэндл процесса возвращает моя функция handle_processa, она в заголовочном файле
    "..\Nahozhdenie_hendla_processa\handle_processa.cpp"
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. handle_potoka= GetCurrentThread());
    2.  SuspendThread (handle_potoka);
    Это привидёт к остановке текущего потока, более он не получит управления, пока другой поток не сделает ресум.
    2.exe - зачем создавать поток с той функции, ведь после того, как вновь созданный поток начнёт своё исполнение уменьшить счётчик остановок потока не получится, ибо он равен нулю и сервис просто игнорируется.
    Опиши нормально задачу(цель, ваше собственное решение не важно), я не вижу смысла во всех этих действиях.
     
  13. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Я не понял.
    Какой ресум2.exe?
    Какую функцию Вы имеете ввиду, называя её той?
    Мы просто время зря тратим на переспрашивание.

    Я третий разу уже пишу.
    Выполняется поток. Его надо остановить.
    А через некоторое время запустить из другого приложения. Всё!
     
  14. _int2e_

    _int2e_ New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2009
    Сообщения:
    124
    Ребят.
    А что он вообще делает нафиг??

    Где OpenProcess??
    Где поиск нужного потока по ид?
    Где открытие потока?

    Ведь он ИЗ ДРУГОГО ПРОЦЕССА (!!!) хочет разморозить поток
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Есть сервис NtSuspendThread и NtResumeThread. Первый увеличивает счётчик остановок потока, если он отличен от нуля, то поток не исполняется. Второй сервис уменьшает число остановок потока, если оно равно нулю, то поток начинает исполняться(разумеется если он не в состоянии ожидания). Для апи это SuspendThread()/ResumeThread().
    Значит текущий поток юзает NtSuspendThread, он останавливается. Второе приложение юзает NtResumeThread и поток продолжит исполняться. Обычно синхронизацию по эвентам делают..
    Кстати в сервисах требующих хэндл потока для текущего допускается использование константы NtCurrentThread = -2. Для процесса также NtCurrentProcess = -1.
    Что не понятно ?
     
  16. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Хочу, и что?
    Функция CreateRemoteThread не для этого предназначена разве?
    Вот здесь написано
    Функция CreateRemoteThread создает поток, который запускается в виртуальном адресном пространстве другого процесса.
    Другого процесса.
    Дальше будем кричать?
    По поводу OpenProcess. Когда я нахожу хэндл процесса, я именно использую OpenProcess. Я просто тот код приводить не стал (я написал выше, что я его опустил).
     
  17. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Всё понятно, за исключением деталей. Например про эвенты. Основное я и так знал.
    И это. Я не увидел у Вас упоминания CreateRemoteThread
    То есть я правильно понял, что её больше использовать не надо?

    А так-то я всего лишь пример просил привести. Рабочий.
    Между прочим.
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    amvoz
    Во первых поток исполняется в контексте процесса, используя его адресное пространство, которое регисром Cr3 определяется, загрузи в него другой адрес каталога страниц и будешь юзоть память из чужёго процесса. Но суть не в том.
    Я не увидел у вас в описании задачи зачем нужно использовать удалённые потоки.
    Какбэ это корректно выразится.. вам над стилем своим общения нужно немного поработать.)
     
  19. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    А зачем Вам? Или баш на баш?

    А вообще мне нужно перехватить api-функцию. Схематично если, приложение 1 используя WriteProcessMemory прописывает в начало api-функции прыжок на некоторый адрес, находящийся в этой же dll, где и перехватываемая функция.

    (Предварительно по этому адресу прписывается код создания процесса GreatProcess. Тоже сторонниим приложением и тоже с помощью WriteProcessMemory. Только не нужно думать, что если я не упомянул про параметры этой функции, то я не положил их в стек! Это я схематично всё обрисовываю.)

    Итак, при следующем вызове перехватываемой функции осуществится прыжок на вызов GreatProcess, создастся нужный процесс, выпоняемый вместо перехваченной функции.
    А поток вернётся на адрес, следующий за адресом вызова CreateProcess
    Но теперь, кольскоро вместо перехваченнй функции выполняется созданно еприложение, этот поток нужно сейчас остановить. (Задача номер один). То есть прописать в этом месте вызов хитрой функции. Какой- я не знаю, у меня три на выбор, я их все упомянул в первом посте.
    Всё, вновь созданное приложение отработает вместо перехваченной api-функции, теперь нужно на неё управление передать.
    И вот тут самое время этот поток восстановить. (Задача номер два) Тем самым сторонним процессом, который выполняется вместо перехваченной api-функции
    А если ещё в точке его воссттановления (которая должна быть сразу за вызовом той самой хитрой функции) предварительно прописать первые пять байт перехваченной функции, а потом прыжок на (неё+ 5), товообще будет чудесно.
    Восстановленный поток выполнит эти 5 байт, прыгнет на (начало функции+5 байт) и она будет выполняться, как будто её и не перехватывали
     
  20. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Да, суть не в этом.
    В общем, Вы упорно не хотите говорить мне за функцию CreateRemoteThread
    Мне остаётся только поблагодаить Вас за то, что Вы знаете больше моего.