Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не выходит считать данные из памяти, OpenProcess+ReadProcessMemory 
:(
    Опции темы
kakawkin
Дата 24.6.2013, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 23.6.2010

Репутация: нет
Всего: нет



Собственно для начала пытаюсь считать данные: ник из игры World of Warcraft. По программе Cheat Engine надо считать: WoW.exe+E3CB40

Считываю вот так:
Код

procedure TForm1.Button2Click(Sender: TObject);
var
  hProc, PID : DWORD;
  hWnd : THandle; // Хэндл окна чата
  numberRead: SIZE_T;
  IpBuf : PWideChar; // буфер куда поместиться наше значение
  len : integer;
  ipBase: ^dword; // точка входа в памяти
  Buf : PChar;
  Write:cardinal;
begin
  hWnd:=findwindow(nil,'World of Warcraft'); /// получаем хэндл окна программы
  Edit1.Text:=inttostr(hWnd); // заносим в edit Handle
  GetWindowThreadProcessId(hWnd, @PID); //получаем pid зная хэндл окошка интересующей нас программы
  Edit2.Text:=inttostr(PID); // заносим в edit ID
  hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, PID); // подключаемся к процессу зная его ID
  if hProc <> 0 then // условие проверки подключения к процессу
  try
    len   := 200;
    ipBuf := AllocMem(len);
    Edit3.Text:=inttostr(hProc); // заносим в edit Process
    //ipBase:=ptr($00E3CB40); // RVA слова в памяти
    ipBase:=ptr($00E3CB40);
    //ReadProcessMemory(hProc, ipBase, ipBuf, len, numberRead); // чтение из памяти строки
    ReadProcessMemory(hProc, ipBase, ipBuf, len, numberRead);
    Edit4.Text:=string(ipbuf); // заносим в edit Buffer
  finally
    CloseHandle(hProc); // отсоединяемся от процесса
    FreeMem(ipBuf); // освобождаем память
  end;
end;

В итоге в Edit4 выходит: 쫐�ᶪ搘䛲艹鈭ā杋콠䪙⼰㿋ꃗ蠀)

Не подскажите где ошибка данного кода

PM MAIL   Вверх
Illusion Dolphin
Дата 24.6.2013, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 5
Всего: 63



Цитата

ReadProcessMemory


Цитата

Return value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is 0 (zero). To get extended error information, call GetLastError.
The function fails if the requested read operation crosses into an area of the process that is inaccessible.


http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
bems
Дата 24.6.2013, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



$00E3CB40 это RVA, а ReadProcessMemory требует нормальный указатель, то есть VA
его можно получить как базу WoW.exe + RVA. можно искать базу в чужом процессе например функцией Module32Next, а можно расчитывать на то что база загруженного экзешника (почти) всегда совпадает с "предпочитаемой" базой экзешника на диске.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
kakawkin
Дата 24.6.2013, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 23.6.2010

Репутация: нет
Всего: нет



Цитата(bems @ 24.6.2013,  12:39)
$00E3CB40 это RVA, а ReadProcessMemory требует нормальный указатель, то есть VA
его можно получить как базу WoW.exe + RVA. можно искать базу в чужом процессе например функцией Module32Next, а можно расчитывать на то что база загруженного экзешника (почти) всегда совпадает с "предпочитаемой" базой экзешника на диске.

Т.е. мне сейчас надо узнать адрес процесса Wow.exe а делее
 ipBase:=ptr([Wow.exe]+$00E3CB40); ?
PM MAIL   Вверх
bems
Дата 24.6.2013, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



не процесса, а базовый адрес модуля wow.exe в адресном пространстве процесса hProc


--------------------
Обижено школьников: 8
PM MAIL   Вверх
kakawkin
Дата 24.6.2013, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 23.6.2010

Репутация: нет
Всего: нет



Что-то вообще не пойму. Вывел данные и вот что получилось:
Код

C:\Windows\SysWOW64\ntdll.dll | 1999765504
C:\Windows\SysWOW64\ntdll.dll | 1999765504
C:\Windows\syswow64\kernel32.dll | 1993080832
C:\Windows\syswow64\kernel32.dll | 1993080832
C:\Windows\syswow64\KERNELBASE.dll | 1965948928
C:\Windows\syswow64\KERNELBASE.dll | 1965948928
C:\Windows\syswow64\oleaut32.dll | 1960968192
C:\Windows\syswow64\oleaut32.dll | 1960968192
C:\Windows\syswow64\ole32.dll | 1975910400
C:\Windows\syswow64\ole32.dll | 1975910400
C:\Windows\syswow64\msvcrt.dll | 1964900352
C:\Windows\syswow64\msvcrt.dll | 1964900352
C:\Windows\syswow64\GDI32.dll | 1964310528
C:\Windows\syswow64\GDI32.dll | 1964310528
C:\Windows\syswow64\USER32.dll | 1992032256
C:\Windows\syswow64\USER32.dll | 1992032256
C:\Windows\syswow64\ADVAPI32.dll | 1973682176
C:\Windows\syswow64\ADVAPI32.dll | 1973682176
C:\Windows\SysWOW64\sechost.dll | 1994260480
C:\Windows\SysWOW64\sechost.dll | 1994260480
C:\Windows\syswow64\RPCRT4.dll | 1977352192
C:\Windows\syswow64\RPCRT4.dll | 1977352192
C:\Windows\syswow64\SspiCli.dll | 1960247296
C:\Windows\syswow64\SspiCli.dll | 1960247296
C:\Windows\syswow64\CRYPTBASE.dll | 1960181760
C:\Windows\syswow64\CRYPTBASE.dll | 1960181760
C:\Windows\syswow64\LPK.dll | 1964179456
C:\Windows\syswow64\LPK.dll | 1964179456
C:\Windows\syswow64\USP10.dll | 1969684480
C:\Windows\syswow64\USP10.dll | 1969684480
C:\Windows\system32\version.dll | 1918828544
C:\Windows\system32\version.dll | 1918828544
C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\comctl32.dll | 1906180096
C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\comctl32.dll | 1906180096
C:\Windows\syswow64\SHLWAPI.dll | 1970339840
C:\Windows\syswow64\SHLWAPI.dll | 1970339840
C:\Windows\syswow64\shell32.dll | 1979121664
C:\Windows\syswow64\shell32.dll | 1979121664
C:\Windows\system32\winspool.drv | 1909129216
C:\Windows\system32\winspool.drv | 1909129216
C:\Windows\system32\IMM32.DLL | 1966276608
C:\Windows\system32\IMM32.DLL | 1966276608
C:\Windows\syswow64\MSCTF.dll | 1974337536
C:\Windows\syswow64\MSCTF.dll | 1974337536
C:\Windows\system32\uxtheme.dll | 1919352832
C:\Windows\system32\uxtheme.dll | 1919352832
C:\Windows\system32\dwmapi.dll | 1918369792
C:\Windows\system32\dwmapi.dll | 1918369792
C:\Windows\system32\wtsapi32.dll | 1913323520
C:\Windows\system32\wtsapi32.dll | 1913323520
C:\Windows\system32\WINSTA.dll | 1947074560
C:\Windows\system32\WINSTA.dll | 1947074560
C:\Windows\system32\WINSTA.dll | 1947074560


Код

var
Module32 :TModuleEntry32;
SS :THandle;
Next :Bool;
begin
Module32.dwSize := SizeOf(TModuleEntry32);
SS := CreateToolHelp32Snapshot(TH32CS_SNAPMODULE, 0);
If Module32First(SS, Module32) then
begin
S.Add(Module32.szExePath);
Repeat
Next := Module32Next(SS, Module32);
form1.Memo1.Lines.Add(Module32.szExePath+' | '+inttostr(DWord(Module32.modBaseAddr)));
If Next Then
begin
S.Add(Module32.szExePath+' | '+inttostr(DWord(Module32.modBaseAddr)));
form1.Memo1.Lines.Add(Module32.szExePath+' | '+inttostr(DWord(Module32.modBaseAddr)))
end;
Until Not Next;
end;
CloseHandle(SS);

PM MAIL   Вверх
bems
Дата 24.6.2013, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



во-первых у тебя в CreateToolHelp32Snapshot(TH32CS_SNAPMODULE, 0) идет 0, а надо ид процесса в котором ищешь (то есть твоя переменная PID)
во-вторых перечисление строй как-то так
Код

    Module32.dwSize := SizeOf(TModuleEntry32);
    SS := CreateToolHelp32Snapshot(TH32CS_SNAPMODULE, PID);
    if SS = INVALID_HANDLE_VALUE
       then RaiseLastOsError
       else try
              Next := Module32First(SS, Module32);
              while Next do
                begin
                  writeln(Module32.szExePath);
                  Next :=  Module32Next(SS, Module32);
                end;
            finally
              CloseHandle(SS)
            end;



--------------------
Обижено школьников: 8
PM MAIL   Вверх
kakawkin
Дата 25.6.2013, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 23.6.2010

Репутация: нет
Всего: нет



Сделал как ты сказал.
Код

Memo1
D:\Game\WoW 4.3\Wow.exe
C:\Windows\SysWOW64\ntdll.dll
C:\Windows\syswow64\kernel32.dll
C:\Windows\syswow64\KERNELBASE.dll
C:\Windows\syswow64\USER32.dll
C:\Windows\syswow64\GDI32.dll
C:\Windows\syswow64\LPK.dll
C:\Windows\syswow64\USP10.dll
C:\Windows\syswow64\msvcrt.dll
C:\Windows\syswow64\ADVAPI32.dll
C:\Windows\SysWOW64\sechost.dll
C:\Windows\syswow64\RPCRT4.dll
C:\Windows\syswow64\SspiCli.dll
C:\Windows\syswow64\CRYPTBASE.dll
C:\Windows\system32\Secur32.dll
C:\Windows\syswow64\WININET.dll
C:\Windows\syswow64\api-ms-win-downlevel-user32-l1-1-0.dll
C:\Windows\syswow64\api-ms-win-downlevel-advapi32-l1-1-0.dll
C:\Windows\syswow64\api-ms-win-downlevel-shlwapi-l1-1-0.dll
C:\Windows\syswow64\shlwapi.DLL
C:\Windows\syswow64\api-ms-win-downlevel-version-l1-1-0.dll
C:\Windows\system32\version.DLL
C:\Windows\syswow64\api-ms-win-downlevel-normaliz-l1-1-0.dll
C:\Windows\syswow64\normaliz.DLL
C:\Windows\syswow64\iertutil.dll
C:\Windows\system32\WINMM.dll
C:\Windows\system32\d3d9.dll
C:\Windows\system32\d3d8thk.dll
C:\Windows\system32\dwmapi.dll
C:\Windows\syswow64\IMM32.dll
C:\Windows\syswow64\MSCTF.dll
C:\Windows\system32\MSACM32.dll
C:\Windows\syswow64\WS2_32.dll
C:\Windows\syswow64\NSI.dll
C:\Windows\system32\DINPUT8.dll
C:\Windows\syswow64\SHELL32.dll
C:\Windows\syswow64\ole32.dll
C:\Windows\system32\IPHLPAPI.DLL
C:\Windows\system32\WINNSI.DLL
C:\Windows\syswow64\CRYPT32.dll
C:\Windows\syswow64\MSASN1.dll
C:\Windows\system32\WINHTTP.dll
C:\Windows\system32\webio.dll
C:\Windows\syswow64\SETUPAPI.dll
C:\Windows\syswow64\CFGMGR32.dll
C:\Windows\syswow64\OLEAUT32.dll
C:\Windows\syswow64\DEVOBJ.dll
C:\Windows\system32\HID.DLL
C:\Windows\system32\apphelp.dll
C:\Windows\AppPatch\AcSpecfc.DLL
C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.17514_none_ec83dffa859149af\COMCTL32.dll
C:\Windows\system32\mscms.dll
C:\Windows\system32\USERENV.dll
C:\Windows\system32\profapi.dll
C:\Windows\system32\DDRAW.dll
C:\Windows\system32\DCIMAN32.dll
C:\Windows\system32\MPR.dll
C:\Windows\syswow64\COMDLG32.dll
C:\Windows\system32\msi.dll
C:\Windows\system32\api-ms-win-downlevel-advapi32-l2-1-0.dll
C:\Windows\syswow64\api-ms-win-downlevel-ole32-l1-1-0.dll
C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\comctl32.dll
C:\Windows\system32\ESPI11.dll
C:\Windows\system32\WINSPOOL.DRV
C:\Windows\system32\mswsock.dll
C:\Windows\System32\wshtcpip.dll
C:\Windows\System32\wship6.dll
C:\Windows\syswow64\urlmon.dll
C:\Windows\system32\api-ms-win-downlevel-shlwapi-l2-1-0.dll
C:\Windows\system32\DNSAPI.dll
C:\Windows\syswow64\CLBCatQ.DLL
C:\Windows\System32\netprofm.dll
C:\Windows\System32\nlaapi.dll
C:\Windows\system32\dhcpcsvc6.DLL
C:\Windows\system32\rasadhlp.dll
C:\Windows\system32\CRYPTSP.dll
C:\Windows\system32\dhcpcsvc.DLL
C:\Windows\system32\rsaenh.dll
C:\Windows\system32\RpcRtRemote.dll
C:\Windows\System32\npmproxy.dll
C:\Windows\System32\fwpuclnt.dll
C:\Windows\system32\uxtheme.dll
C:\Windows\syswow64\WINTRUST.dll
C:\Windows\system32\nvd3dum.dll
C:\Windows\syswow64\PSAPI.DLL
C:\Windows\system32\nvapi.dll
C:\Windows\system32\powrprof.dll
C:\Windows\system32\ntmarta.dll
C:\Windows\syswow64\WLDAP32.dll
C:\Windows\System32\MMDevApi.dll
C:\Windows\System32\PROPSYS.dll
C:\Windows\system32\AUDIOSES.DLL
C:\Windows\system32\wdmaud.drv
C:\Windows\system32\ksuser.dll
C:\Windows\system32\AVRT.dll
C:\Windows\system32\msacm32.drv
C:\Windows\system32\midimap.dll
D:\Game\WoW 4.3\dbghelp.dll
C:\Windows\system32\napinsp.dll
C:\Windows\system32\pnrpnsp.dll
C:\Windows\System32\winrnr.dll
C:\Windows\system32\dssenh.dll


Как понял нужные мне строчки это:
D:\Game\WoW 4.3\Wow.exe
D:\Game\WoW 4.3\dbghelp.dll

Вот ихние базовые адреса: 
Wow.exe - базовый адресс 2752512
dbghelp.dll - базовый адресс 1730281472

Базовые адреса модулей узнал коммандой inttostr(DWORD(Module32.modBaseAddr));

Это сообщение отредактировал(а) kakawkin - 25.6.2013, 19:48
PM MAIL   Вверх
bems
Дата 25.6.2013, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(kakawkin @  25.6.2013,  19:21 Найти цитируемый пост)
Как понял нужные мне строчки это:
D:\Game\WoW 4.3\Wow.exe
D:\Game\WoW 4.3\dbghelp.dll
а при чем тут dbghelp? только экзешник нужен



--------------------
Обижено школьников: 8
PM MAIL   Вверх
kakawkin
Дата 26.6.2013, 03:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 23.6.2010

Репутация: нет
Всего: нет



Т.е. данные теперь получаются так:
   ReadProcessMemory(hProc, Pointer($2A0000+$00E3CB40), ipBuf, len, numberRead);
или же 
ReadProcessMemory(hProc, Pointer($2A0000), @ipBuf, len, numberRead);
ReadProcessMemory(hProc, Pointer(ipBuf+$00E3CB40), ipBuf, len, numberRead);

Верно ?
PM MAIL   Вверх
bems
Дата 26.6.2013, 04:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



первый вариант
ну только я бы получал 2A0000 в рантайм, а не забивал число в код


--------------------
Обижено школьников: 8
PM MAIL   Вверх
kakawkin
Дата 26.6.2013, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 23.6.2010

Репутация: нет
Всего: нет



Цитата(bems @  26.6.2013,  04:25 Найти цитируемый пост)
первый вариант
ну только я бы получал 2A0000 в рантайм, а не забивал число в код 

Сделал пока вот так:
 ReadProcessMemory(hProc, Pointer($FD0000+$E3CB40), @ipBuf, len, numberRead);
Адрес изменился при перезапуске клиента но не беда, поулчаю в рантайме данные. Только что выкидывает теперь:
user posted image

PM MAIL   Вверх
bems
Дата 26.6.2013, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



@ipBuf это адрес указателя



--------------------
Обижено школьников: 8
PM MAIL   Вверх
kakawkin
Дата 27.6.2013, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 23.6.2010

Репутация: нет
Всего: нет



Сделал так:
Код

var   HandleWindow : cardinal;
ipBase: pointer;
hWnd : THandle;
PID, hProc, IpBuf : DWORD;
numberRead: SIZE_T;
buft:array [0..16] of WideChar;
begin
  HandleWindow:=FindWindow(nil,'World of Warcraft');
  GetWindowThreadProcessId(hWnd, @PID);
  hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
  ipBase:=ptr($00BD0000);
   ReadProcessMemory(hProc, ipBase, @ipBuf, sizeof(ipBuf), numberRead);
   ReadProcessMemory(hProc, ptr(ipBuf+$00E3CB40), @buft, 10, numberRead);
  CloseHandle(hProc);
  form1.Edit1.Text:=WideCharToString(buft);
end;


возвращает пустоту
PM MAIL   Вверх
Rrader
Дата 1.7.2013, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 18
Всего: 191



Цитата(kakawkin @  24.6.2013,  17:51 Найти цитируемый пост)
По программе Cheat Engine надо считать: WoW.exe+E3CB40

Скорее всего ник лежит по адресу, не являющимся фиксированным, и работать ничего не будет. Если это так, а проверить можно тем же Cheat Engine, запустив WoW несколько раз, создав разные условия, то правильный выход - искать адрес строки с ником через адрес объекта, в методах которого этот ник фигурирует. Как правило, во всех играх Blizzard для объектов зарезервированы ячейки в сегменте данных.


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0905 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.