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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск Unicode значения в процессе. Только чтениe 
:(
    Опции темы
Alkash
Дата 14.1.2012, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


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

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



Доброго времени суток господа, возникла небольшая проблемка. Есть некое приложение, допустим игра. В ней имеется строковое значение, которое необходимо считать. Известно, что оно является UNICODE строкой. Статический адрес, от которого можно добраться до строки выяснен - $00A786A0. Там лежит указатель на адрес со строкой - 10F907E0(динамический). При исследовании - было выяснено, что для того чтобы добраться до строки - необходимо повторить:
Код

724650EC - 89 44 8F EC  - mov [edi+ecx*4-14],eax
724650F0 - 8B 44 8E F0  - mov eax,[esi+ecx*4-10]
724650F4 - 89 44 8F F0  - mov [edi+ecx*4-10],eax <<
724650F8 - 8B 44 8E F4  - mov eax,[esi+ecx*4-0C]
724650FC - 89 44 8F F4  - mov [edi+ecx*4-0C],eax

EAX=006F0076
EBX=00000000
ECX=00000004
EDX=00000000
ESI=0ABD4454
EDI=10F907E0
ESP=0018FCEC
EBP=0018FCF4
EIP=724650F8

724650F4 - 89 44 8F F0  - mov [edi+ecx*4-10],eax
724650F8 - 8B 44 8E F4  - mov eax,[esi+ecx*4-0C]
724650FC - 89 44 8F F4  - mov [edi+ecx*4-0C],eax <<
72465100 - 8B 44 8E F8  - mov eax,[esi+ecx*4-08]
72465104 - 89 44 8F F8  - mov [edi+ecx*4-08],eax

EAX=0043006E
EBX=00000000
ECX=00000004
EDX=00000000
ESI=0ABD4454
EDI=10F907E0
ESP=0018FCEC
EBP=0018FCF4
EIP=72465100

724650FC - 89 44 8F F4  - mov [edi+ecx*4-0C],eax
72465100 - 8B 44 8E F8  - mov eax,[esi+ecx*4-08]
72465104 - 89 44 8F F8  - mov [edi+ecx*4-08],eax <<
72465108 - 8B 44 8E FC  - mov eax,[esi+ecx*4-04]
7246510C - 89 44 8F FC  - mov [edi+ecx*4-04],eax

EAX=006E0079
EBX=00000000
ECX=00000004
EDX=00000000
ESI=0ABD4454
EDI=10F907E0
ESP=0018FCEC
EBP=0018FCF4
EIP=72465108

72465104 - 89 44 8F F8  - mov [edi+ecx*4-08],eax
72465108 - 8B 44 8E FC  - mov eax,[esi+ecx*4-04]
7246510C - 89 44 8F FC  - mov [edi+ecx*4-04],eax <<
72465110 - 8D 04 8D 00000000  - lea eax,[ecx*4+00000000]
72465117 - 03 F0  - add esi,eax

EAX=0069006E
EBX=00000000
ECX=00000002
EDX=00000002
ESI=0ABD43A0
EDI=10F907E0
ESP=0018FCEC
EBP=0018FCF4
EIP=72465110


При попытке - получить значение этой строки - я получаю либо несколько букв, либо безумный набор цифр. Вопрос: как из памяти считать юникод-строку, при том что длинна её заранее неизвестна, но изестно что она не может быть более 16 символов?

PS:
Динамический адресс нахожу следующим способом:
Код

var
WindowName : integer; 
 ProcessId : integer; 
 ThreadId : integer; 
 HandleWindow : Integer; 
 b:dword; 
 readwrite:cardinal;

 Const WindowTitle = 'Game'; // Заголовок окна с игрой
....
Function GetNameDynamicAdress(): integer;
begin
     WindowName := FindWindow(nil,WindowTitle);
 If WindowName = 0 then 
 begin
 MessageDlg('Игра должна быть запущена до ассистента. Запустите ее, потом ассистент', mtwarning,[mbOK],0);

 end;
 ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId); 
 HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); 

 ReadProcessMemory(HandleWindow,ptr($00A786A0),@b,4,readwrite); // Прочитали в b значение из адреса поинтера.
 Result:= b;
end;


Затем пробовал прочитать по значениям согласно иccледования при помощи:
Код

Function ReadMemoryToHex(address: integer): string;
var
name: PWideChar;
numberRead : DWORD;
begin
 ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId); 
 HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); 

 ReadProcessMemory(HandleWindow,ptr(address),name,4,numberRead); 
 //result:= inttostr(b);
 //name:= IntToHex(b,8);
 result:= WideCharToString(name);
end;

*****
ReadMemoryToHex(GetNameDynamicAdress + ($4*4)-$10);
ReadMemoryToHex(GetNameDynamicAdress + ($4*4)-$0c);
ReadMemoryToHex(GetNameDynamicAdress + ($4*4)-$8);
ReadMemoryToHex(GetNameDynamicAdress + ($2*4)-$4);

В результате - а ничего хорошего в результате. Если читать как Pwidechar - вываливается с ошибкой, если как integer - то в результате - либо 3 символа, либо какая-то ерунда. Если как hex - то он не соответствует искомой строке. 

Заранее благодарен за помощь.

Это сообщение отредактировал(а) Alkash - 14.1.2012, 15:40


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
kami
Дата 14.1.2012, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Пока могу сказать только 2 вещи:
Цитата(Alkash @  14.1.2012,  13:47 Найти цитируемый пост)
Если читать как Pwidechar - вываливается с ошибкой

Конечно вываливается - кто-то ж должен память под PWideChar выделить smile

ReadProcessMemory желательно проверять, а отработала ли она. Для этого - анализировать результат и lpNumberOfBytesRead. Может, она просто ничего не читает, отсюда и мусор на выходе. Ну и до кучи тогда проверять уже и GetWindowThreadProcessId и OpenProcess. На кой в последнем PROCESS_ALL_ACCESS - непонятно, но вроде пойдет.
PM MAIL WWW   Вверх
Alkash
Дата 14.1.2012, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


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

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



Код

var
i,rw:DWord;
ch:WideChar;
wch:array[0..255] of WideChar;
str:string;
begin
i:=0;
 repeat
 ReadProcessMemory(hProcess,ptr(data),@ch,2,rw);
 data:=data+2;
 wch[i]:=ch;
 inc(i);
 until
 (ord(ch)=0) or (i>=255);
i:=0;
str:='';
 repeat
 str:=str+wch[i];
 inc(i);
 until
 wch[i]='';
result:=str;
end;

Попробовал и вот такой способ. И тоже печально - получаю кучу $$$-) Может я смещение неправильно высчитываю? Весь мозг уже сломал.


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
Dik0n
Дата 14.1.2012, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ничего не понял, но вот так превосходно читается:
Код

  wch: array[0..255] of WideChar;
begin
  ReadProcessMemory(hProcess, ptr($00410000), @wch[0], SizeOf(wch), rw);
end;

--------------------
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ◄◄◄ Сотри монеткой защитный слой
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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