PDA

Просмотр полной версии : FindWindow (С++)


HuntsMan
12.05.2011, 13:16
Пытаюсь получить окно через FindWindow, использую почти как в tiawps:
char applicationName[] = "World of Warcraft";
HWND WindowsHandle = FindWindow(0, (LPCWSTR)applicationName);
Но почему-то не находит окно :( (окно точно запущено :)) Искал в инете, но ничего толкового не нашел. Посоветуйте что-нибудь пожалуйста, а то в WinAPI я не шибко силен :)

LordJZ
12.05.2011, 13:25
Объявите applicationName как wchat_t* и оберните строку в _T() (если макрос определен)

Йоха
12.05.2011, 13:35
#include <tchar.h>
TCHAR applicationName[] = _T("World of Warcraft");

или в свойствах проекта отключите юникод

LordJZ
12.05.2011, 13:43
#include <tchar.h>
TCHAR applicationName[] = _T("World of Warcraft");

или в свойствах проекта отключите юникодАга, или FindWindowA

HuntsMan
12.05.2011, 20:14
Спасибо :) Вот ещё вопрос, пытаюсь приплести туда BaseAddress. Пытаюсь использовать VirtualQueryEx. Тут (http://www.podgoretsky.com/ftp/Docs/Delphi/Memory/virtual/VirtualQueryEx.html) написано, что нужно передать в аргументе начальный базовый адрес региона, который можно получить через GetSystemInfo. Но там я ничего подобного не нашел :( Код как-то так получается:
char locale[4];

OSVERSIONINFO v_info={sizeof(OSVERSIONINFO)};
GetVersionEx(&v_info);
MEMORY_BASIC_INFORMATION mbi;
VirtualQueryEx(wow_process_handle, v_info.szCSDVersion, &mbi, sizeof(mbi));

ReadProcessMemory(wow_process_handle, (LPCVOID)((DWORD)mbi.BaseAddress + 0x008BBBC0), locale, 4, 0);
Я в правильную сторону рою, или там надо как-то по другому?)

Йоха
12.05.2011, 20:28
Спасибо :) Вот ещё вопрос, пытаюсь приплести туда BaseAddress. Пытаюсь использовать VirtualQueryEx.

Это лишнее все.

Следующий фрагмент читает из памяти процесса wow_process_handle по адресу 0x008BBBC0, 4 байта и помещает их в массив locale

char locale[4];
DWORD BaseAddress = 0x008BBBC0, BytesRead;
ReadProcessMemory(wow_process_handle, (LPCVOID)BaseAddress, &locale, 4, &BytesRead))

TOM_RUS
12.05.2011, 21:50
Это лишнее все.

Следующий фрагмент читает из памяти процесса wow_process_handle по адресу 0x008BBBC0, 4 байта и помещает их в массив locale

char locale[4];
DWORD BaseAddress = 0x008BBBC0, BytesRead;
ReadProcessMemory(wow_process_handle, (LPCVOID)BaseAddress, &locale, 4, &BytesRead))


А как же ASLR? Там рандомный базовый адрес... Или тут автоматом это учитывается?

HuntsMan
13.05.2011, 06:09
Ну вот я с учетом базового адреса и хочу попытатся прочитать :) Вот только как его узнать..(

Йоха
13.05.2011, 09:23
А как же ASLR? Там рандомный базовый адрес... Или тут автоматом это учитывается?

нет, ASLR тут не учитывается. Пока я отключил эту фигню в реестре и не парюсь.

Надо поискать как читать адрес с учетом этой ASLR.

Добавлено через 58 минут
Вот порыл в инете, пишут что BaseAddr определяется так :

#include <Windows.h>
#include <TlHelp32.h>


int _tmain(int argc, _TCHAR* argv[])
{
MODULEENTRY32 me32;
me32.dwSize = sizeof(MODULEENTRY32);

DWORD pid = GetCurrentProcessId(); // тут подставить ИД процесса вов
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
if (h != INVALID_HANDLE_VALUE)
{
if (Module32First(h, &me32))
{
// по идее нужно сделать проверку на имя модуля что бы me32.szModule было равно wow.exe
// но обычно первым идет как раз сам основной экзешник
DWORD baseaddr = (DWORD)me32.modBaseAddr;
printf("0x%08X\n", baseaddr);
}
}
return 0;
}


Проверить не могу, на работе Windows XP. Хотя на XP выдает положенные 0x00400000

TOM_RUS
13.05.2011, 09:23
http://www.mmowned.com/forums/world-of-warcraft/bots-programs/memory-editing/313322-finding-baseaddress-when-aslr-enabled.html#post2002767