| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Не выходит считать данные из памяти |
| Автор: kakawkin 24.6.2013, 11:51 | ||
| Собственно для начала пытаюсь считать данные: ник из игры World of Warcraft. По программе Cheat Engine надо считать: WoW.exe+E3CB40 Считываю вот так:
В итоге в Edit4 выходит: 쫐�ᶪ搘䛲艹鈭ā杋콠䪙⼰㿋ꃗ蠀) Не подскажите где ошибка данного кода |
| Автор: Illusion Dolphin 24.6.2013, 12:07 | ||||
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680553%28v=vs.85%29.aspx |
| Автор: bems 24.6.2013, 12:39 |
| $00E3CB40 это RVA, а ReadProcessMemory требует нормальный указатель, то есть VA его можно получить как базу WoW.exe + RVA. можно искать базу в чужом процессе например функцией Module32Next, а можно расчитывать на то что база загруженного экзешника (почти) всегда совпадает с "предпочитаемой" базой экзешника на диске. |
| Автор: kakawkin 24.6.2013, 13:02 | ||
Т.е. мне сейчас надо узнать адрес процесса Wow.exe а делее ipBase:=ptr([Wow.exe]+$00E3CB40); ? |
| Автор: bems 24.6.2013, 13:04 |
| не процесса, а базовый адрес модуля wow.exe в адресном пространстве процесса hProc |
| Автор: kakawkin 24.6.2013, 15:59 | ||||
Что-то вообще не пойму. Вывел данные и вот что получилось:
|
| Автор: bems 24.6.2013, 23:24 | ||
| во-первых у тебя в CreateToolHelp32Snapshot(TH32CS_SNAPMODULE, 0) идет 0, а надо ид процесса в котором ищешь (то есть твоя переменная PID) во-вторых перечисление строй как-то так
|
| Автор: kakawkin 25.6.2013, 19:21 | ||
Сделал как ты сказал.
Как понял нужные мне строчки это: D:\Game\WoW 4.3\Wow.exe D:\Game\WoW 4.3\dbghelp.dll Вот ихние базовые адреса: Wow.exe - базовый адресс 2752512 dbghelp.dll - базовый адресс 1730281472 Базовые адреса модулей узнал коммандой inttostr(DWORD(Module32.modBaseAddr)); |
| Автор: bems 25.6.2013, 21:47 | ||
|
| Автор: kakawkin 26.6.2013, 03:51 |
| Т.е. данные теперь получаются так: ReadProcessMemory(hProc, Pointer($2A0000+$00E3CB40), ipBuf, len, numberRead); или же ReadProcessMemory(hProc, Pointer($2A0000), @ipBuf, len, numberRead); ReadProcessMemory(hProc, Pointer(ipBuf+$00E3CB40), ipBuf, len, numberRead); Верно ? |
| Автор: bems 26.6.2013, 04:25 |
| первый вариант ну только я бы получал 2A0000 в рантайм, а не забивал число в код |
| Автор: bems 26.6.2013, 23:37 |
| @ipBuf это адрес указателя |
| Автор: kakawkin 27.6.2013, 15:13 | ||
Сделал так:
возвращает пустоту |
| Автор: Rrader 1.7.2013, 13:37 |
Скорее всего ник лежит по адресу, не являющимся фиксированным, и работать ничего не будет. Если это так, а проверить можно тем же Cheat Engine, запустив WoW несколько раз, создав разные условия, то правильный выход - искать адрес строки с ником через адрес объекта, в методах которого этот ник фигурирует. Как правило, во всех играх Blizzard для объектов зарезервированы ячейки в сегменте данных. |
| Автор: kakawkin 7.7.2013, 09:46 | ||
В каком смысле создав разные условия. Я запускал напрямую, запускал через лаунчер - всегда работает |