Друзья! Ну то есть если я создаю поток в удалённом процессе и не выделяю память, то это не значит, что там ничего нет! Там всё есть! Вот процесс в котором я хочу создать поток (process.exe): Код (Text): #include <windows.h> #include <stdio.h> //По замыслу именно эта функция должна вызваться //из другого процесса void f (); int main () { SetConsoleCP (1251); SetConsoleOutputCP (1251); //Это вот будет функция потока printf ("Адрес функции потока f равен %x\n", f); getchar (); f(); getchar (); return 0; } void f (void* per) { printf ("сработал новый поток\n"); } То есть я запускаю этот процесс и вижу адрес функции потока. Потом запускаю другой процесс, где вызывается CreateRemoteThread, ввожу туда адрес куда надо и там вызывается УДАЧНО CreateRemoteThread (получаю корректный TID и hThread), но чё-то на этом для process.exe всё заканчивается крахом, включается отладчик и вообще. Вот я засомневался- может это из-за того, что я не выделяю память? Но с другой стороны- чё её выделять, я же не на пустое место пишу, там существует код функции f! Спасибо, кто откликнется (к слову сказать, если функция f Будет начинаться по адресу 77D7050B- а это ничто другое, как начало MessageBox, то поток всегда создаётся корректно и MessageBox ВСЕГДА ВЫЗЫВАЕТСЯ! Правда, тоже сразу всякие исключения начинаются, но это уже по той причине, что в стеке при вызове MessageBox находится всякая некорректная херь- но это уже второй вопрос. Вот я тупо предполагаю, не потому ли так происходит, что код MessageBox есть ВСЕГДА в процессе, а код f не всегда? Ну то есть потоки же меняются как-то, но тут я уже не силён, надеюсь на вашу помощь)
Так работает process.exe до краха (вывод) Код (Text): Адрес функции f равен 40141b После чего я пишу так (main.cpp) Код (Text): #include <stdio.h> #include <windows.h> #include "handle_processa.cpp" int main(int argc, char* argv[]) { SetConsoleCP (1251); SetConsoleOutputCP (1251); //Ищем хэндл процесса HANDLE hProcess= HandleProcessa ((char*)"messagebox_p.exe"); printf ("хэндл процесса есть %d\n", hProcess); int adres= 0X40141b; void* pkode= (void*)&adres; //Сюда мы запихаем TID LPDWORD lpThreadId= new DWORD; HANDLE hThread= CreateRemoteThread (hProcess, 0, 0,(LPTHREAD_START_ROUTINE)pkode, NULL, 0, lpThreadId); printf ("%x\n", *lpThreadId); printf ("%x\n", hThread); getchar (); return 0; } И компилю. Так что тяжело с адресом ошибиться.
хватит быдлокодить... ты создаешь поток с точкой входа равной адресу переменной adres в своем процессе, а не адресу функции f в другом процессе... Код (Text): HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)0x0040141B, NULL, 0, lpThreadId); почему не написать так например? пуф... что за бред? в чем разница объясни мне?
Rel, меня в заблуждение ввели корректные данные типа: Код (Text): хэндл процесса есть 28 //Это вот TID f64 //А это хэндл процесса 10 Ну так-то я облажался. Но я ума не приложу, как найти ошибку, ЕСЛИ ГЛАЗ ЗАМЫЛЕН, только спросить. Ты ведь понимаешь. Спасибо!