Wywołanie funkcji z innej aplikacji

0

Nawiązując do tematu//4programmers.net/Forum/viewtopic.php?id=149429

Chciałbym wywołać funkcje odpowiadająca za wysłanie loginu i hasła do serwera po kliknięciu klawisza "ok"
Znalazłem ją za pomocą OLLYDBG

call 00481FA0

chciałbym wiedzieć jak wywołać ten fragment kodu za pomocą c++, oczywiście wcześniej ustawiam w pamięci login i hasło za pomocą WriteProcessMemory.

0

CreateRemoteThread + własna dll-ka/kod?

0

Ok, a mogę prosić o jakiś przykład wywołania?

Adres0049B5E7  call 00481FA0
0

widziałem już to... ja nie mam zamiaru wysyłac żadnych pakietów skoro klient gry może to zrobić za mnie. Chce tylko zmusić go do wykonania instrukcji którą posiada w swoim kodzie... mam jej adres i nie wiem mam użyć wstawki asemblerowej?

0

Jest pewien problem... logiczny. Jak klient ma się za Ciebie logować, skoro to tylko jedna funkcja, co z potencjalnymi efektami ubocznymi?

0

jak na razie mój program podpina się pod pamięć gry tak, że w tym momencie nie muszę się logować za pomocą hasła i loginu jedyne co muszę to klikać button "ok" żeby klient wywołał funkcje logowania. Wykryłem, więc że gdy klikam ten button "ok" to klient jedyne co robi podczas kliknięcia, to ten kod call 00481FA0 co odwołuje się do dalszego adresu, który pewnie odpowiada za wysłanie loginu i hasła, ale to mnie już raczej nie obchodzi bo zmodyfikowałem pamięć gry i login i hasło są zawsze ustawione.
Moim celem jest wywołanie funkcji z pod buttona "ok" po to by w niego nie klikać, zamiast tego chce żeby funkcja ta była wywołana po naciśnięciu kombinacji klawiszy alt+1:) efektów ubocznych raczej nie będzie...

bawiłem się też w podmienianie adresów funkcji i wywoływałem za pomocą buttona "ok" zamknięcie programu itp, ale to tylko w Ollydbg...

PS. przypominam, że gra ma własne API i nie da rady symulować kliknięcia buttona.

0
Red21a napisał(a)

jWykryłem, więc że gdy klikam ten button "ok" to klient jedyne co robi podczas kliknięcia, to ten kod call 00481FA0 co odwołuje się do dalszego adresu, który pewnie odpowiada za wysłanie loginu i hasła, ale to mnie już raczej nie obchodzi bo zmodyfikowałem pamięć gry i login i hasło są zawsze ustawione.

Prawie na pewno jest to metoda jakiejś klasy, bez obiektu tej klasy to i tak się wysypie. Druga sprawa - ta funkcja może być zależna od składowych statycznych, zmiennych globalnych itd. - bez prawidłowej współpracy z resztą kodu to też się posypie.

Red21a napisał(a)

Moim celem jest wywołanie funkcji z pod buttona "ok" po to by w niego nie klikać, zamiast tego chce żeby funkcja ta była wywołana po naciśnięciu kombinacji klawiszy alt+1:) efektów ubocznych raczej nie będzie...

Efekty uboczne to interakcja z resztą programu.

Red21a napisał(a)

PS. przypominam, że gra ma własne API i nie da rady symulować kliknięcia buttona.

SendInput?

Nie powiedziałeś, że funkcja ma jakieś argumenty więc przyjąłem, że ich nie przyjmuje. Masz tu prosty kod, który odpala takową funkcję w innym procesie. W przykładzie traktuje swój jako zdalny, wywołuje zdalnie funkcję i zwraca jej wynik (nie musi być sensowny, tutaj jest łatwy do przewidzenia).

#include <iostream>
#include <cassert>
#include <windows.h>
using namespace std;

DWORD callExternal(HANDLE process, DWORD address)
{
	/* 
		call	[esp+4] ; adres funkcji przekazany jako adres watku
		retn	4       ; powrot z korekcja dla jednego argumenty przy stdcall 
	*/
	unsigned char code[] = "\xFF\x54\x24\x04\xC2\x04";
	size_t codeSize = sizeof(code) & -2;

	LPVOID remoteCode = VirtualAllocEx(process, NULL, codeSize, 
		MEM_COMMIT, PAGE_EXECUTE_READWRITE);

	WriteProcessMemory(process, remoteCode, &code, codeSize, NULL);

	HANDLE thread = CreateRemoteThread(process, NULL, 0, 
		(LPTHREAD_START_ROUTINE)remoteCode, (LPVOID)address, 0, NULL);
	
	WaitForSingleObject(thread, INFINITE);
	VirtualFreeEx(process, remoteCode, codeSize, MEM_DECOMMIT);

	DWORD exitCode;
	GetExitCodeThread(thread, &exitCode);

	CloseHandle(thread);
	return exitCode;	
}

int zuo()
{
	cout << "testowana funkcja" << endl;
	return 666;
}

int main()
{
	assert(callExternal(GetCurrentProcess(), (DWORD)&zuo) == 666);
}

Jak gra się po wywołaniu wysypie to nie miej pretensji do mnie...

0

Działa:D wielkie THX:D

1 użytkowników online, w tym zalogowanych: 0, gości: 1