Как создать поток в удалённом процессе БЕЗ выделения там памяти?

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

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья! Ну то есть если я создаю поток в удалённом процессе и не выделяю память, то это не значит, что там ничего нет! Там всё есть!

    Вот процесс в котором я хочу создать поток (process.exe):
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. //По замыслу именно эта функция должна вызваться
    5. //из другого процесса
    6. void f ();
    7.  
    8.  
    9. int main () {
    10.  SetConsoleCP (1251);
    11.  SetConsoleOutputCP (1251);
    12.  
    13.  //Это вот будет функция потока
    14.  printf ("Адрес функции потока f равен %x\n", f);
    15.  getchar ();
    16.  
    17.  f();
    18.  getchar ();
    19.  return 0;
    20. }
    21.  
    22. void f (void* per) {
    23.  printf ("сработал новый поток\n");
    24. }
    То есть я запускаю этот процесс и вижу адрес функции потока. Потом запускаю другой процесс, где вызывается CreateRemoteThread, ввожу туда адрес куда надо и там вызывается УДАЧНО CreateRemoteThread (получаю корректный TID и hThread), но чё-то на этом для process.exe всё заканчивается крахом, включается отладчик и вообще. Вот я засомневался- может это из-за того, что я не выделяю память? Но с другой стороны- чё её выделять, я же не на пустое место пишу, там существует код функции f! Спасибо, кто откликнется

    (к слову сказать, если функция f Будет начинаться по адресу 77D7050B- а это ничто другое, как начало MessageBox, то поток всегда создаётся корректно и MessageBox ВСЕГДА ВЫЗЫВАЕТСЯ! Правда, тоже сразу всякие исключения начинаются, но это уже по той причине, что в стеке при вызове MessageBox находится всякая некорректная херь- но это уже второй вопрос. Вот я тупо предполагаю, не потому ли так происходит, что код MessageBox есть ВСЕГДА в процессе, а код f не всегда? Ну то есть потоки же меняются как-то, но тут я уже не силён, надеюсь на вашу помощь)
     
  2. Kaimi

    Kaimi Андрей

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    120
    Наверное адрес функции в процессе неправильно определяете...
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Так работает process.exe до краха (вывод)
    Код (Text):
    1. Адрес функции f равен 40141b
    После чего я пишу так (main.cpp)
    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3. #include "handle_processa.cpp"
    4.  
    5. int main(int argc, char* argv[]) {
    6.  SetConsoleCP (1251);
    7.  SetConsoleOutputCP (1251);
    8.  
    9.  //Ищем хэндл процесса
    10.  HANDLE hProcess= HandleProcessa ((char*)"messagebox_p.exe");
    11.  printf ("хэндл процесса есть %d\n", hProcess);
    12.  
    13.  int adres= 0X40141b;
    14.  void* pkode= (void*)&adres;
    15.  
    16.  
    17.  //Сюда мы запихаем TID
    18.  LPDWORD lpThreadId= new DWORD;
    19.  
    20.  HANDLE hThread= CreateRemoteThread (hProcess, 0, 0,(LPTHREAD_START_ROUTINE)pkode, NULL, 0, lpThreadId);
    21.  
    22.  printf ("%x\n", *lpThreadId);
    23.  printf ("%x\n", hThread);
    24.  getchar ();
    25.  return 0;
    26. }
    И компилю.
    Так что тяжело с адресом ошибиться.
     
  4. Clickgg

    Clickgg New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2011
    Сообщения:
    32
    void* pkode= (void*)&adres;
    заменить на
    unsigned long *ptr=(unsigned long*)&adres;
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    хватит быдлокодить... ты создаешь поток с точкой входа равной адресу переменной adres в своем процессе, а не адресу функции f в другом процессе...
    Код (Text):
    1. HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)0x0040141B, NULL, 0, lpThreadId);
    почему не написать так например?

    пуф... что за бред? в чем разница объясни мне?
     
  6. Clickgg

    Clickgg New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2011
    Сообщения:
    32
    разницы не какой, вы правы бред...
    просто значение из *void проверить не удасться
     
  7. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Rel, меня в заблуждение ввели корректные данные типа:
    Код (Text):
    1. хэндл процесса есть 28
    2.  
    3. //Это вот TID
    4. f64
    5.  
    6. //А это хэндл процесса
    7. 10
    Ну так-то я облажался. Но я ума не приложу, как найти ошибку, ЕСЛИ ГЛАЗ ЗАМЫЛЕН, только спросить. Ты ведь понимаешь.
    Спасибо!