Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2010, 16:52   #1
zotox
Форумчанин
 
Регистрация: 09.09.2008
Сообщений: 395
По умолчанию Изменение значения в памяти

Нужно изменить (на 43910011) все значения памяти где найдено к примеру: 43910045 (dword). Как это сделать?
Составлял давно такой код (подправлял готовый код точнее):
Код:
var
  ProcessID: DWord;
  ProcessHandle: THandle;
  Mbi: TMemoryBasicInformation;
  Addr: DWord;
  Value, val2, lo: DWord;
  I: Cardinal;
  Buf: PChar;
  BytesRead: DWord;
begin
  ProcessID := 8916;

  value := 43910045;
  val2 := 43910011;

  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);

  if ProcessHandle <> 0 then
    try
      Addr := 0;

      while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do
       begin

         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

                for I := 0 to BytesRead - SizeOf(Value) do
                 begin
                   if PDWord(@Buf[I])^ = Value then
                    begin
                      WriteLn('Value ' + IntToStr(Value) + ' found at ' +
                      IntToHex(Integer(Cardinal(Mbi.BaseAddress) + I), 8));

                      WriteProcessMemory(processhandle, pointer(IntToHex(Integer(Cardinal(Mbi.BaseAddress) + I), 8)), @val2, 4, lo);
                    end;
                 end;
           end
         else
           WriteLn('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');

 readln;
end.
Но он не работает, почему?
zotox вне форума Ответить с цитированием
Старый 11.10.2010, 17:07   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Так в каком месте не работает? Не открывает процесс? Возможно, следует задать права поменьше, чем PROCESS_ALL_ACCESS
Black Fregat вне форума Ответить с цитированием
Старый 11.10.2010, 17:31   #3
zotox
Форумчанин
 
Регистрация: 09.09.2008
Сообщений: 395
По умолчанию

Вопрос решил сам (не правильно оказывается передавал адрес (куда писать) функции WriteProcessMemory)
zotox вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическое изменение значения в ячейке TStalin Microsoft Office Excel 7 07.09.2010 18:19
Изменить значения в памяти? VintProg Общие вопросы Delphi 2 25.04.2010 11:19
Изменение памяти других приложений mixer94 Общие вопросы Delphi 3 30.03.2010 20:31
автоматическое изменение значения intelx1989 Microsoft Office Access 1 12.01.2010 21:19