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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение значения в памяти дрогого процесса 
:(
    Опции темы
chikistbuch
Дата 24.12.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Люди добрые, подскажите пожалуйста. Есть сторонее приложение и мне нужно в его памяти изменить значение переменной ('006B9710'). Этот код (взял с DRKB, статья "поиск в памяти процесса") вроде бы как находит нужное значение, но как сохранить изменённое значение в памяти процесса???

Только пожалуйста не пишите какой я лузер и что всё написано не правильно, дайте пожалуйста дельный совет. 

WriteProcessMemory(ProcessHandle, Mbi.BaseAddress, Buf, Mbi.RegionSize, BytesRead) у меня не получается

Зарание огромное спасибо!!!!

Код

procedure se;
var

ProcessHandle: THandle;
Mbi: TMemoryBasicInformation;
Addr: DWord;
Value: DWord;
val:char;
I: Cardinal;
Buf: PChar;
BytesRead: DWord;
begin

val:='8';
Value := 9;
//
// Открываем процесс
//
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or
PROCESS_VM_OPERATION, false, ProcessID);
if ProcessHandle <> 0 then
try
Addr := 0;
//
// Перечисляем все регионы виртуальной памяти процесса
//
while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do
begin

  // Uncomment чтобы увидеть список регионов, найденых в адресном пространстве
  // form1.Memo1.Lines.Add('region: ' + IntToHex(Integer(Mbi.BaseAddress), 8) +
  //   ' size: ' + IntToStr(Mbi.RegionSize));
  //
  // Если региону выделена память, и регион не является "сторожевым" (как вершина стека),
  // то читаем этот регион
  //
  if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
  begin
   //
   // Это демонстрационная программа, поэтому здесь выделяется буфер под весь регион.
   // Регион может быть достаточно большим, поэтому лучше читать его блоками для экономии
   // памяти. Но здесь для простоты алгоритма вся оптимизация похерена.
   //
   GetMem(Buf, Mbi.RegionSize);
   try
    //
    // Читаем весь регион в выделенный буфер
    //
    if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, Buf,
      Mbi.RegionSize, BytesRead) then
    begin
     //
     // Ищем значение типа DWORD в буфере
     //
     for I := 0 to BytesRead - SizeOf(Value) do
     begin
      if PDWord(@Buf[I])^ = Value then begin
       // Найдено, выводим
       form1.Memo1.Lines.Add('Value ' + IntToStr(Value) + ' found at ' +IntToHex(Integer(Cardinal(Mbi.BaseAddress) + I), 8));

       if IntToHex(Integer(Cardinal(Mbi.BaseAddress)+I),8)='006B9710' then begin
       form1.Caption:=inttostr(PDWord(@Buf[I])^);
       PDWord(@Buf[I])^:=8;
       form1.Caption:=form1.Caption+'  good  ';

       if WriteProcessMemory(ProcessHandle, Mbi.BaseAddress, Buf, Mbi.RegionSize, BytesRead) then
       form1.Caption:=form1.Caption+' OK  '
      else form1.Caption:=form1.Caption+' BAD  ';


      end;
       end;
     end;
    end
    else
     form1.Memo1.Lines.Add('Failed to read process memory ' + IntToStr(GetLastError));
   finally
    FreeMem(Buf);
   end;
  end;
  // Вычисляем адрес следуюшего региона
  Addr := Addr + Mbi.RegionSize;
end;

finally
CloseHandle(ProcessHandle);
end
else
WriteLn('Failed to open process');

end;


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


Эксперт
***


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

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



Цитата(chikistbuch @  24.12.2009,  22:57 Найти цитируемый пост)
дайте пожалуйста дельный совет. 

Пожалуйста.
В справке к WriteProcessMemory указано, что для работы этой функции должны быть указаны PROCESS_VM_WRITE and PROCESS_VM_OPERATION. При открытии процесса у Вас в коде пропущен флаг PROCESS_VM_WRITE, т.е. должно быть
Код

ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or PROCESS_VM_OPERATION or PROCESS_VM_WRITE, false, ProcessID);



Цитата(chikistbuch @  24.12.2009,  22:57 Найти цитируемый пост)
WriteProcessMemory(ProcessHandle, Mbi.BaseAddress, Buf, Mbi.RegionSize, BytesRead) у меня не получается

На будущее - не бывает просто "не получается", Windows обязательно скажет почему не получается. В данном случае - если операция не удалась, то на вопрос "почему" ответит GetLastError.

Это сообщение отредактировал(а) kami - 25.12.2009, 03:10
PM MAIL WWW   Вверх
chikistbuch
Дата 25.12.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



kami, СПАСИБО!!! Буду пробовать
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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