Перейти к содержанию

Вызвать функцию в чужой программе


Рекомендуемые сообщения

Всем привет, заинтересовал вопрос, как можно написать программу, которая будет другую программу заставлять что-то делать?
Например есть в программе функция, как написать другую программу, которая будет вызывать эту функцию.

Как управление персонажем или тд.

 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Trix сказал:

Всем привет, заинтересовал вопрос, как можно написать программу, которая будет другую программу заставлять что-то делать?
Например есть в программе функция, как написать другую программу, которая будет вызывать эту функцию.

Как управление персонажем или тд.

 

Через перехват или создание удаленного потока. Либо внедряешься в игру и все делаешь из ее адресного пространства :-D 

Изменено пользователем Dino
Ссылка на комментарий
Поделиться на другие сайты

Окей, это понятно) Хотелось бы увидеть ЖИВОЙ пример, на сколько я понял, есть

CreateRemoteThread

Как мне его использовать, не получается найти в поисковике пример, а MSDN не дает мне нужную информацию.

Есть примеры, кто-то пользовался?

1 час назад, Dino сказал:

Через перехват или создание удаленного потока. Либо внедряешься в игру и все делаешь из ее адресного пространства :-D 

 

1 час назад, partoftheworlD сказал:

Хуки, можно ещё через CE вызвать функцию.

 

Ссылка на комментарий
Поделиться на другие сайты

20 минуты назад, Trix сказал:

Есть примеры, кто-то пользовался?

 

Пробовал такой вызов на Dying Light т.к. движок почти одинаковый с Dead island, но кроме вылета из игры ничего не выходило.

 

Изменено пользователем partoftheworlD
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

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);
}

 

 

Изменено пользователем Dino
Ссылка на комментарий
Поделиться на другие сайты

Более сложный способ с перехватом удаленного потока

 

Скрытый текст

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
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

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