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

Вызов экспорт функции из чужого процесса C++


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

Всем привет прощу сильно не пинать первый пост на этом форуме

ближе к теме,появилось желания написать бота используя чисто игровые функции (раньше писал ботов путём поиска оффсетов)(мой родной язык C# , в асме и с++ особо не силён но потихоньку осваиваю)  ,

собственно сам вопрос нашел в dll игровую функцию public: virtual struct User * __thiscall UHandler::GetNextTarget(float,int) допустим это её постоянный адрес 0x005b0be5, примерно так выглядит структура User

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

struct User
{
int id;
unsigned short name;
int race;
int hp_max
int hp;
int mp_max;
int mp;
};

 

 как правильно мне вызвать данный метод (public: virtual struct User * __thiscall UHandler::GetNextTarget(float,int)) используя C++ или CE ?

 

то что я сделал

создал dll для иньекции потом создаю поток

if (dwReason == DLL_PROCESS_ATTACH)
	{
	     CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)TestPipe, NULL, NULL, NULL);
    }

в потоке поднимаю pipe

 

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

BOOL WINAPI TestPipe()
{

	ofstream fout("D:\\LOG\\pipe.txt", ios_base::app); // создаём объект класса ofstream для записи и связываем его с файлом cppstudio.txt

	fout << "\n" << "Запуск потока TestPipe"; // запись строки в файл
	fout.close();

	HANDLE hPipe;

	char szClientUpdate[22];

	BOOL   fSuccess = FALSE;
	DWORD  cbRead, cbToWrite, cbWritten, dwMode;
	LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\drwebPipe");

	do
	{
		hPipe = CreateFile(
			lpszPipename,    
			GENERIC_READ |  
			GENERIC_WRITE,
			0,              
			NULL,           
			OPEN_EXISTING,   
			0,               
			NULL);          

		if (hPipe != INVALID_HANDLE_VALUE)
		{
			ofstream fout("D:\\LOG\\pipe.txt", ios_base::app); 

			fout << "\n" << "Соеденился с pipe"; 
			fout.close();
		}

		Sleep(1000);

	} while (hPipe == INVALID_HANDLE_VALUE);



	do
	{
		 

		fSuccess = ReadFile(
			hPipe,     
			szClientUpdate,     
			strlen(szClientUpdate),   
			&cbRead,   
			NULL);    

		if (!fSuccess && GetLastError() != ERROR_MORE_DATA)
		{
			ofstream fout("D:\\LOG\\pipe.txt", ios_base::app);

			fout << "\n" << "Ошибка в pipe"; 
			fout.close();
			break;
		}



		string hexstr;

		int i;
		for (i = 0; i<cbRead; i++) {
			if (szClientUpdate[i] == 0)
			{
				continue;
			}
			hexstr += szClientUpdate[i];
		}

		if (hexstr == "start")
		{
			// СОБСТВЕННО ТУТ МНЕ НУЖЕН ВЫЗОВ ФУНКЦИИ
            //public: virtual struct User * __thiscall UHandler::GetNextTarget(float,int)
		}


		ofstream fout("D:\\LOGAA\\pipe.txt", ios_base::app); 

		fout << "\n" << "Пришло сообщение =" << hexstr; 
		fout.close();

	

	} while (fSuccess);  // repeat loop if ERROR_MORE_DATA 

	ofstream fouts("D:\\LOG\\pipe.txt", ios_base::app); 

	fouts << "\n" << "Поток закрыт!!!"; 
	fouts.close();

	return TRUE;

 

 

вот тут

if (hexstr == "start")
		{
			// СОБСТВЕННО ТУТ МНЕ НУЖЕН ВЫЗОВ ФУНКЦИИ
            //public: virtual struct User * __thiscall UHandler::GetNextTarget(float,int)
		}

честно гуглил много, но толком не чего не понял

Изменено пользователем Xipho
Куски кода более 5 строк нужно убирать под спойлер.
Ссылка на комментарий
Поделиться на другие сайты

Достаточно создать прототип функции и вызывать его в потоке.

 

typedef void(*GetNextTarget)(float,int);
auto *AnyFunction = reinterpret_cast<GetNextTarget>(0x005b0be5);

void main()
{
  AnyFunction(1.0f, 1337);
}

после инжекта

CreateThread(nullptr, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(main), hmodule, 0, nullptr);

Функция вроде как возвращает указатель на структуру User.

 

Можешь в Reclass задампить структуру, а после вызова присваивать ей вернувшийся указатель и на прямую работать со структурой и её значениями.

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

Спасибо за ответ,pipe нужен будет для снятия внутри игровых хуков.. попробовал написать тестовую программку и сделать как вы написали,оно почти работает.. функция вызывается и на return высыпается с ошибкой мол нету прав на запись оО

 

вот тестовое приложение

https://drive.google.com/open?id=0B430T62QsrdXU25BLVNzSlM5UTA

 

скажите пожалуйста,тут каждое сообщение проходит модерацию? или как то можно без модерации писать?

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

Вроде со своим примером разобрался,буду пробовать на игре,вопросов думаю будет ещё масса.

 

 

 

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

16 часов назад, Antifreez сказал:

функция вызывается и на return высыпается с ошибкой мол нету прав на запись оО

определи какой тип возвращает функция

 

я думаю ошибка при возвращении значения из-за 

16 часов назад, partoftheworlD сказал:

typedef void(*GetNextTarget)(float,int);

Попробуй так сделать, если возвращается отличный тип от void

 

typedef Тип(*GetNextTarget)(float,int);

typedef DWORD(*GetNextTarget)(float,int);
typedef float(*GetNextTarget)(float,int);
и т.д

 

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

В 21.07.2017 в 00:44, Antifreez сказал:

скажите пожалуйста,тут каждое сообщение проходит модерацию? или как то можно без модерации писать?

После пяти одобренных модератором постов премодерация автоматически снимается.

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

Спасибо всем за ответы,с вызовами разобрался,оставляю тестовый проект вдруг кому понадобится,теперь появился вопрос как обойти GPF (general protection fault) при попытки поставить MBP сразу вылетает GPF и приложение падает... как я понял этот вопрос нужно оформить в новый пост правда не понятно в какой раздел в "OllyDbg" или "Вопросы по взлому MMO"? 

 

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

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

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

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