Trix Опубликовано 15 октября, 2016 Поделиться Опубликовано 15 октября, 2016 Всем привет, заинтересовал вопрос, как можно написать программу, которая будет другую программу заставлять что-то делать? Например есть в программе функция, как написать другую программу, которая будет вызывать эту функцию. Как управление персонажем или тд. Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 15 октября, 2016 Поделиться Опубликовано 15 октября, 2016 Хуки, можно ещё через CE вызвать функцию. Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 15 октября, 2016 Поделиться Опубликовано 15 октября, 2016 (изменено) 1 час назад, Trix сказал: Всем привет, заинтересовал вопрос, как можно написать программу, которая будет другую программу заставлять что-то делать? Например есть в программе функция, как написать другую программу, которая будет вызывать эту функцию. Как управление персонажем или тд. Через перехват или создание удаленного потока. Либо внедряешься в игру и все делаешь из ее адресного пространства Изменено 15 октября, 2016 пользователем Dino Ссылка на комментарий Поделиться на другие сайты Поделиться
Trix Опубликовано 15 октября, 2016 Автор Поделиться Опубликовано 15 октября, 2016 Окей, это понятно) Хотелось бы увидеть ЖИВОЙ пример, на сколько я понял, есть CreateRemoteThread Как мне его использовать, не получается найти в поисковике пример, а MSDN не дает мне нужную информацию. Есть примеры, кто-то пользовался? 1 час назад, Dino сказал: Через перехват или создание удаленного потока. Либо внедряешься в игру и все делаешь из ее адресного пространства 1 час назад, partoftheworlD сказал: Хуки, можно ещё через CE вызвать функцию. Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 15 октября, 2016 Поделиться Опубликовано 15 октября, 2016 (изменено) 20 минуты назад, Trix сказал: Есть примеры, кто-то пользовался? Пробовал такой вызов на Dying Light т.к. движок почти одинаковый с Dead island, но кроме вылета из игры ничего не выходило. Изменено 15 октября, 2016 пользователем partoftheworlD 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 15 октября, 2016 Поделиться Опубликовано 15 октября, 2016 (изменено) 1 час назад, Trix сказал: CreateRemoteThread Писал на коленке, вроде нигде не ошибся, а может и ошибся Скрытый текст VOID WINAPI SendPacket(LPVOID This) { PBYTE packet = (PBYTE)This; __asm { pushad pushfd push packet //адрес пакета mov edx, 0x12345678 //адрес функции, которую хочешь вызвать call edx popfd popad } } VOID RemoteSendPacket() { LPVOID MemSendPacket, MemVariables; HANDLE hProc; //тут хендл процесса жертвы BYTE Packet[9] = "\x08\x00\x3A\xCE\xA5\xC3\x98\x1F"; //пакет MemSendPacket = VirtualAllocEx(hProc, NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); //Выделяем память в процессе жертвы для функции MemVariables = VirtualAllocEx(hProc, NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);//Выделяем память в процессе жертвы для переменной(в данном случае наш пакет) WriteProcessMemory(hProc, MemSendPacket, &SendPacket, 256, 0); // пишим в выделенную память функцию WriteProcessMemory(hProc, MemVariables, Packet, sizeof(Packet), 0);// пишим в выделенную память пакет HANDLE hThread = CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)MemSendPacket, MemVariables, 0, 0); //вешаем удаленный поток на записанную нами функцию, передав ей адрес переменной WaitForSingleObject(hThread, INFINITE); VirtualFreeEx(hProc, MemVariables, 0, MEM_RELEASE); VirtualFreeEx(hProc, MemSendPacket, 0, MEM_RELEASE); } Изменено 15 октября, 2016 пользователем Dino Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 15 октября, 2016 Поделиться Опубликовано 15 октября, 2016 Более сложный способ с перехватом удаленного потока Скрытый текст typedef struct _Data { DWORD yourfunc; DWORD origEIP; DWORD origESI; PBYTE packet; }Data; __declspec(naked) void __stdcall hookEIP() { __asm { pushad pushfd push[esi + 12] //адрес пакета call[esi] //__stdcall !!!! popfd popad push[esi + 4] //восстанавливаем оригинальный EIP mov esi, [esi + 8]//восстанавливаем оригинальный ESI ret } } VOID Con() { HANDLE hThread; //тут хендл перехваченного потока жертвы HANDLE hProc; //тут хендл процесса жертвы Data data; CONTEXT con; BYTE Packet[9] = "\x08\x00\x3A\xCE\xA5\xC3\x98\x1F"; //пакет SuspendThread(hThread); con.ContextFlags = CONTEXT_FULL; GetThreadContext(hThread, &con); data.origEIP = con.Eip; data.origESI = con.Esi; data.yourfunc = 0x12345678; // адрес функции data.packet = (PBYTE)VirtualAllocEx(hProc, NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);//память для пакета con.Eip = (DWORD)VirtualAllocEx(hProc, NULL, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE); //память для функции con.Esi = (DWORD)VirtualAllocEx(hProc, NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE); //память для структуры WriteProcessMemory(hProc, (LPVOID)con.Eip, &hookEIP, 256, NULL); WriteProcessMemory(hProc, (LPVOID)con.Esi, &data, sizeof(Data), NULL); WriteProcessMemory(hProc, (LPVOID)data.packet, Packet, sizeof(Packet), NULL); SetThreadContext(hThread, &con); ResumeThread(hThread); } 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения