Просмотр полной версии : FindWindow (С++)
HuntsMan
12.05.2011, 13:16
Пытаюсь получить окно через FindWindow, использую почти как в tiawps:
char applicationName[] = "World of Warcraft";
HWND WindowsHandle = FindWindow(0, (LPCWSTR)applicationName);
Но почему-то не находит окно :( (окно точно запущено :)) Искал в инете, но ничего толкового не нашел. Посоветуйте что-нибудь пожалуйста, а то в WinAPI я не шибко силен :)
Объявите applicationName как wchat_t* и оберните строку в _T() (если макрос определен)
#include <tchar.h>
TCHAR applicationName[] = _T("World of Warcraft");
или в свойствах проекта отключите юникод
#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);
Я в правильную сторону рою, или там надо как-то по другому?)
Спасибо :) Вот ещё вопрос, пытаюсь приплести туда BaseAddress. Пытаюсь использовать VirtualQueryEx.
Это лишнее все.
Следующий фрагмент читает из памяти процесса wow_process_handle по адресу 0x008BBBC0, 4 байта и помещает их в массив locale
char locale[4];
DWORD BaseAddress = 0x008BBBC0, BytesRead;
ReadProcessMemory(wow_process_handle, (LPCVOID)BaseAddress, &locale, 4, &BytesRead))
Это лишнее все.
Следующий фрагмент читает из памяти процесса 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
Ну вот я с учетом базового адреса и хочу попытатся прочитать :) Вот только как его узнать..(
А как же 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
http://www.mmowned.com/forums/world-of-warcraft/bots-programs/memory-editing/313322-finding-baseaddress-when-aslr-enabled.html#post2002767
vBulletin® v3.8.4, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot