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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2012, 19:07   #1
alumium
Пользователь
 
Регистрация: 17.08.2012
Сообщений: 17
Злость VirtualProtect не работает при вызове из DLL чужого процесса

В общем, мне поступил заказ сделать авто-чит (плагин DLL) для игры World of Warcraft.
Появилась проблема с функцией изменения доступа к диапазону(карте) памяти VirtualProtect.
Она просто не срабатывает в DLL (VirtualProtect), но через EXE (VirtualProtectEx) работает. Были попытки через DLL вызвать VirtualProtectEx, эффекта не дало.

Эта DLL функция должна изменять массив байт в памяти процесса, куда была внедрена библиотека.
Код:
procedure WriteBytes(Addr:Cardinal; const Bytes:Array of Byte);
var i,OldPageProtection:cardinal;
begin
   VirtualProtect(@Addr,Length(Bytes),PAGE_EXECUTE_READWRITE,OldPageProtection); // не работает
   for i:= 0 to Length(Bytes)-1 do PByte(Addr+i)^:=Bytes[i]; // Работает если разблокировать карту памяти вручную через Cheat Engine
   VirtualProtect(@Addr,Length(Bytes),OldPageProtection,OldPageProtection); // тоже не работает
end;
Такая же функция для EXE (в DLL библиотеке разблокировка не работает, пробовал получать Handle через GetCurrentProcess).
Код:
procedure memWriteHex(Addr: cardinal; const Bytes: Array of Byte);
var
  BytesWritten: Dword;
  ProcessId,AppHandle,OldPageProtection: Cardinal;
begin
  ProcessId := GetPidExe('Wow.exe');
  AppHandle := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
  VirtualProtectEx(AppHandle, @Addr, Length(Bytes), PAGE_EXECUTE_READWRITE, OldPageProtection);
  WriteProcessMemory(AppHandle, @Addr, @Bytes[0], Length(Bytes), BytesWritten);
  VirtualProtectEx(AppHandle, @Addr, Length(Bytes), OldPageProtection, OldPageProtection);
end;
Полный исходный код библиотеки, запись не происходит из-за доступа:
Код:
library DllThief2;

uses
  windows, shellapi, sysutils, ShareMem;

const ExeName:String='Wow.exe';

procedure WriteBytes(Addr:Cardinal; Bytes:Array of Byte);
var i,OldPageProtection:cardinal;
    error:bool;
begin
  error:=VirtualProtect(@Addr,Length(Bytes),PAGE_EXECUTE_READWRITE,OldPageProtection);
  for i:= 0 to Length(Bytes)-1 do PByte(Addr+i)^:=Bytes[i];
  error:=VirtualProtect(@Addr,Length(Bytes),OldPageProtection,OldPageProtection);
end;

procedure TestWrite;
begin
  WriteBytes($004D95FF,[$01,$02,$03,$04,$05,$06,$07,$08,$09,$10]);
end;

exports
  TestWrite;

begin
end.
Ход работы после внедрение DLL в процесс и запуска нужной функции:

Последний раз редактировалось alumium; 18.08.2012 в 00:37.
alumium вне форума Ответить с цитированием
Старый 17.08.2012, 19:51   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

логируйте результаты функций в файл.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.08.2012, 20:06   #3
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Попробуй дебагером пройтись или выложи код.
Kix.IV вне форума Ответить с цитированием
Старый 18.08.2012, 00:30   #4
alumium
Пользователь
 
Регистрация: 17.08.2012
Сообщений: 17
По умолчанию

Все выложил
alumium вне форума Ответить с цитированием
Старый 18.08.2012, 00:45   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

все верно, у вас Addr уже адрес, а вы зачем то указатель берете от него и в итоге применяете функцию совсем иначе.
Код:
VirtualProtect(Pointer(Addr),Length(Bytes),PAGE_EXECUTE_READWRITE,OldPageProtection);
странно что в exe работало.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.08.2012, 00:59   #6
alumium
Пользователь
 
Регистрация: 17.08.2012
Сообщений: 17
По умолчанию

Спасибо, все заработало, держи плюс)))

Последний раз редактировалось alumium; 18.08.2012 в 01:03.
alumium вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема dll EXMP Софт 0 18.08.2010 09:30
Dll - проблема nXs Общие вопросы Delphi 2 16.07.2010 14:53
Проблема с DLL _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 3 09.06.2010 14:28
Проблема с DLL. profi Помощь студентам 5 06.01.2009 23:48
Проблема с dll( DM_bite Помощь студентам 10 31.07.2008 16:05