Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2011, 14:37   #1
frantic150
Пользователь
 
Аватар для frantic150
 
Регистрация: 25.05.2009
Сообщений: 31
Радость получить данные из Warcraft 3

народ, подскажите, как получить имена всех игроков, присоединившихся в созданную игру в warcraft 3. нужно "вытащить" просто имена

пока что научился только узнавать ID процесса

Код:
include <iostream>
#include <windows.h>
using namespace std;
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
	 HWND hWarcraft         = NULL;
	 DWORD dwProcess         = NULL;
	 HANDLE hWarcraftWrite   = NULL;
	 hWarcraft = FindWindow( NULL, "Warcraft III" );
	 GetWindowThreadProcessId(hWarcraft, &dwProcess );
	 if( dwProcess )
	 {
			cout << "Warcraft III process id=" << dwProcess << endl;
	 }
	 else
	 {
			cout << "Failed to get the process id" << endl;
		 // exit(0);
	 }
	 hWarcraftWrite = OpenProcess( PROCESS_ALL_ACCESS, false, dwProcess );
	 if( hWarcraftWrite )
	 {
			cout << "Warcraft III write handle=" << hWarcraftWrite << endl;
	 }
	 else
	 {
			cout << "Failed to get the write handle" << endl;
			//exit(0);
	 }
	cin.get();
	return 0;
frantic150 вне форума Ответить с цитированием
Старый 08.06.2011, 15:36   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Возможно я не прав, но тут нужно либо спросить у разработчиков, по каким адресам хранятся имена, либо дизассемблировать и посмотреть самому (что, наверное, почти невозможно), либо как-то получить доступ к данным, которые получает игра по сети.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 08.06.2011, 15:42   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ArtMoney+Disasm(причем лучше отладчик)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.06.2011, 16:37   #4
frantic150
Пользователь
 
Аватар для frantic150
 
Регистрация: 25.05.2009
Сообщений: 31
По умолчанию

покопался в исходниках ghost++
http://code.google.com/p/ghostplusplus/

там есть кусок кода в gameprotocol.cpp
но как его отдельно использовать, непонятно
Код:
BYTEARRAY CGameProtocol :: SEND_W3GS_SLOTINFOJOIN( unsigned char PID, BYTEARRAY port, BYTEARRAY externalIP, vector<CGameSlot> &slots, uint32_t randomSeed, unsigned char gameType, unsigned char playerSlots )
{
	unsigned char Zeros[] = { 0, 0, 0, 0 };

	BYTEARRAY SlotInfo = EncodeSlotInfo( slots, randomSeed, gameType, playerSlots );
	BYTEARRAY packet;

	if( port.size( ) == 2 && externalIP.size( ) == 4 )
	{
		packet.push_back( W3GS_HEADER_CONSTANT );									// W3GS header constant
		packet.push_back( W3GS_SLOTINFOJOIN );										// W3GS_SLOTINFOJOIN
		packet.push_back( 0 );														// packet length will be assigned later
		packet.push_back( 0 );														// packet length will be assigned later
		UTIL_AppendByteArray( packet, (uint16_t)SlotInfo.size( ), false );			// SlotInfo length
		UTIL_AppendByteArrayFast( packet, SlotInfo );								// SlotInfo
		packet.push_back( PID );													// PID
		packet.push_back( 2 );														// AF_INET
		packet.push_back( 0 );														// AF_INET continued...
		UTIL_AppendByteArray( packet, port );										// port
		UTIL_AppendByteArrayFast( packet, externalIP );								// external IP
		UTIL_AppendByteArray( packet, Zeros, 4 );									// ???
		UTIL_AppendByteArray( packet, Zeros, 4 );									// ???
		AssignLength( packet );
	}
	else
		CONSOLE_Print( "[GAMEPROTO] invalid parameters passed to SEND_W3GS_SLOTINFOJOIN" );

	// DEBUG_Print( "SENT W3GS_SLOTINFOJOIN" );
	// DEBUG_Print( packet );
	return packet;
}
frantic150 вне форума Ответить с цитированием
Старый 08.06.2011, 19:46   #5
frantic150
Пользователь
 
Аватар для frantic150
 
Регистрация: 25.05.2009
Сообщений: 31
По умолчанию

помогите, пожалуйста
frantic150 вне форума Ответить с цитированием
Старый 08.06.2011, 20:38   #6
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Ну как помочь? Тут разве только самому копаться, не думаю что за тебя тут кто-то будет открывать Ольку. Я не знаю как устроен Warcraft engine, но если это приложение клиент/сервер тогда я думаю протокол сервера должен отсылать информацию о состояние персонажа, его характеристик, имя и не только (Вообщем много чего он должен обрабатывать). Ну и соответственно со стороны клиента перехватывать нужную тебе информацию. WpePro, OllyDbg, Ida Pro и вперед. Конечно все усложняется если присутствует шифрование пакетов. И прежде чем перехватить пакет его нужно расшифровать и только потом обработать, поэтому для начала нужно очень хорошо все проанализировать и изучить.
Я например имею дело с похожей игрой, MuOnline. В коде присутствует одна боооольшая структура с данными о персонаже и не только. Ну вот, как выше было сказано, нужно найти адрес где хранятся имена персонажей, здесь я думаю схема такая же, можно найти адрес структуры и проинициализировать объект и по объекту иметь доступ к данным. Поэтому запасайся терпением, потому что работать с Олькой это утомительно
И еще, без знаний assembler'а можешь даже и не пукать. (За исключением если код открыт для общего доступа, тогда задача упрощается).

Последний раз редактировалось coNsept; 08.06.2011 в 20:58.
coNsept вне форума Ответить с цитированием
Старый 08.06.2011, 21:03   #7
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Оффтоп: frantic150, а за чем вам это надо если не секрет? Чит пытаетесь написать? Или античит?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 08.06.2011, 21:19   #8
frantic150
Пользователь
 
Аватар для frantic150
 
Регистрация: 25.05.2009
Сообщений: 31
По умолчанию

щас я пока что могу только прочитать что находится в указанном адресе (ReadProcessMemory),
с помощью CheatEngine я уже нашел данные/адреса, которые мне нужны (список игроков)
но адреса то конечно же меняются.
мне нужно найти address table?


теперь надо смотреть деассемблировать?
плз, помоги, очень прошу
frantic150 вне форума Ответить с цитированием
Старый 09.06.2011, 18:53   #9
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Skype: Mr.Kernighan
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить данные из WMF AnTe Мультимедиа в Delphi 0 18.01.2011 08:14
Получить данные с сайта Andrey85 Работа с сетью в Delphi 2 10.11.2010 21:37
Получить данные с сервера LT. Общие вопросы .NET 2 15.06.2010 19:38
Получить неупакованные данные Voody Работа с сетью в Delphi 4 08.09.2009 20:33
TDataSetField - получить данные un-soul БД в Delphi 2 21.04.2007 22:48