-
Постов
33 -
Зарегистрирован
-
Посещение
-
Победитель дней
6
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные Cemi4ka
-
-
Доброе время суток !!!
Хотел спросить или то я сошел с ума или то игра меня за дурака держыт
Приведу пример на инструкции здоровья :
83 B9 ?? ?? ?? ?? ?? ?? ?? 6A ?? 68 ?? ?? 00 00 - Сигнатура [Execute/Read only:16]
Сама инструкция :
01592F27 - 83 B9 B0 42 51 02 00 - cmp dword ptr [ecx+025142B0],0001592F2E - 7E 6C - jle 01592F9C01592F30 - 6A FF - push -0101592F32 - 68 CA 00 00 00 - push 000000CA
Дак вот начал я писать трейнер и меня немного смутило то что кажись адреса инструкций фиксированные ну они меняються (благо есть ОБСКАН) думаю хух полегчало как снова трабл Смищение инструкции
cmp dword ptr [ecx+025142B0],00
сменились на
cmp dword ptr [ecx+014942B4],00
вот тут я в тупике кто сталкивался с подобным ?
-
Пример записи с изминением атрибута защиты блока памяти :
procedure Write(ProcessID: Cardinal; WriteAdress: Integer; WriteValue: array of Byte);varpHandle:LongInt;Bytes : Cardinal;Aob_old_Protect_OFF: dword;Aob_old_Protect_ON:dword;beginpHandle:=OpenProcess(PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_VM_OPERATION,false,ProcessID);VirtualProtectEx(pHandle,ptr(WriteAdress),SizeOf(WriteValue),PAGE_EXECUTE_READWRITE,Aob_old_Protect_OFF);//Устанавливает атрибут Чтение\Запись (PAGE_EXECUTE_READWRITE)Application.ProcessMessages;WriteProcessMemory(pHandle,ptr(WriteAdress),(@WriteValue),SizeOf(WriteValue),Bytes);VirtualProtectEx(pHandle,ptr(WriteAdress),SizeOf(WriteValue),Aob_old_Protect_OFF,Aob_old_Protect_ON);//ВвостанавливаемCloseHandle(pHandle);End;
- 1
-
Функция VirtualProtect позволяет изменить атрибуты защиты указанного региона виртуального адресного програнства указанного процесса.
{ Вариант 1 }function VirtualProtectEx( hProcess: THandle; //дескриптор процесса lpAddress: Pointer; // начальный адрес фрагмента памяти dwSize: DWORD; // размер фрагмента памяти flNewProtect: DWORD; // новые атрибуты защиты lpflOldProtect: Pointer // старые атрибуты защиты): BOOL; stdcall; overload;{ Вариант 2 }function VirtualProtectEx( hProcess: THandle; //дескриптор процесса lpAddress: Pointer; // начальный адрес фрагмента памяти dwSize: DWORD; // размер фрагмента памяти flNewProtect: DWORD; // новые атрибуты защиты var OldProtect: DWORD // старые атрибуты защиты): BOOL; stdcall; overload;
Описание
Вы можете установить атрибуты доступа только для страниц, под которыми присутствует физическая память. Если хотя-бы под одной из страниц указанного диапазона нет физической памяти, то функция вернет ошибку и никакого изменения атрибутов защиты не произойдет.
Функция VirtualProtectEx в целом идентичнафункции VirtualProtect, за исключением того, что позволяет изменять атрибуты защиты страниц памяти любого указанного процесса.
Windows NT/2000: Указание атрибута PAGE_GUARD доступа к странице позволяет создавать в памяти защищаемые страницы. Создание таких страниц позволяет нам отловить попытки доступа к странице. Для большей информации смотрите раздел "Создание защищаемых страниц".
Windows 95/98: Вы не можете использвоать функцию VirtualProtect к любому региону адресного пространства, расположенного внутри разделяемого адресного пространства (от $80000000 до $BFFFFFFF).
Требования
Windows NT/2000: Требуется Windows NT 3.1 или более поздняя версия
Windows 95/98: Требуется Windows 95 или более поздняя версия
Бибиотека: Kernel32.dll
Подключаемый модуль: WindowsИсточник : http://www.hot.ee/memman/virtual/VirtualProtectEx.html
-
Я бы удостоился выбрать, если компилировал не на D7, а на XE
ну тогда не как ((
-
Попробую пошаговую отладку в Дельфи
че за бред причем тут отладка ?
Здравствуйте, у меня есть модуль для сканирования памяти, но он работает только в диапазоне адресов 0х00000000 - 0хFFFFFFFF. И получается в 64 разрядных приложениях, он не может достать до некоторых адресов, которые за этим пределом.
Нужно, чтоб он работал в таком диапазоне 0х00000000000 - 0хFFFFFFFFFFF, но не могу никак его заставить это делать.
В функцию ScanSignature передается адрес с которого начинать сканировать, адрес до которого сканировать, байты и маска.
Так как адреса начала и конца сканирования передаются в типе Cardinal, а его диапазон до 0хFFFFFFFF, то я решил поменять этот тип на Int64, его диапазон заканчивается на 0х7FFFFFFFFFFFFFFF, но это не дало результатов. Поиск просто стал длиться бесконечно долго. Помогите адаптировать этот сканер под 64 разрядные приложения.
Ну дак если тебе нужно адаптировать сканер под 64 розрядные приложения ты хотябы удостойся выбрать розрядность своего приложения !!
unit SignScan;interfaceusesWindows, SysUtils, Forms, TlHelp32;function DataCompare(data: PByte; sign: PByte; mask: PAnsiChar): boolean;function GetModuleInfo(const module_name: PChar; main_process: boolean): TModuleEntry32;procedure GetPID;procedure Write(ProcessID: Cardinal; WriteAdress: Integer; WriteValue: array of Byte);function ScanSignature(base: Cardinal; size: Cardinal; sign: PByte; mask: PAnsiChar): integer;varm_pID: integer;m_hProc: THandle;module: TModuleEntry32;m_Sign: integer;procName: string;implementationfunction DataCompare(data: PByte; sign: PByte; mask: PAnsiChar): boolean;beginwhile mask^ <> #0 dobeginif ((mask^ = 'x') and (data^ <> sign^)) thenbeginresult := false;exit;end;inc(mask);inc(data);inc(sign);end;result := true;end;function GetModuleInfo(const module_name: PChar; main_process: boolean): TModuleEntry32;varsnapshot: THandle;module: TModuleEntry32;beginsnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, m_pID);module.dwSize := sizeof(TModuleEntry32);if (Module32First(snapshot, module)) thenbeginif (main_process) thenbeginCloseHandle(snapshot);result := module;end;while (Module32Next(snapshot, module)) dobeginif (StrIComp(PChar(ExtractFileName(module.szModule)), PChar(module_name)) = 0) thenbeginCloseHandle(snapshot);result := module;end;end;end;result := module;end;procedure GetPID;varsnapshot: THandle;pInfo: PROCESSENTRY32;beginsnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);pInfo.dwSize := sizeof(PROCESSENTRY32);if (Process32First(snapshot, pInfo)) thenbeginwhile (Process32Next(snapshot, pInfo)) dobeginif pInfo.szExeFile = procName thenbeginm_pID := pInfo.th32ProcessID;CloseHandle(snapshot);exit;end;end;end;m_pID := 0;CloseHandle(snapshot);exit;end;procedure Write(ProcessID: Cardinal; WriteAdress: Integer; WriteValue: array of Byte);varpHandle:LongInt;Bytes : Cardinal;Aob_old_Protect_OFF: dword;Aob_old_Protect_ON:dword;beginpHandle:=OpenProcess(PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_VM_OPERATION,false,ProcessID);VirtualProtectEx(pHandle,ptr(WriteAdress),SizeOf(WriteValue),PAGE_EXECUTE_READWRITE,Aob_old_Protect_OFF);//Ñíÿòèå ïðîòåêöèè ñ ïàìÿòèApplication.ProcessMessages;WriteProcessMemory(pHandle,ptr(WriteAdress),(@WriteValue),SizeOf(WriteValue),Bytes);VirtualProtectEx(pHandle,ptr(WriteAdress),SizeOf(WriteValue),Aob_old_Protect_OFF,Aob_old_Protect_ON);//Âîñòàíîâëåíèå ïðîòåêöèè ñ ïàìÿòèCloseHandle(pHandle);End;function ScanSignature(base: Cardinal; size: Cardinal; sign: PByte; mask: PAnsiChar): integer;varmbi: MEMORY_BASIC_INFORMATION;offset: Cardinal;buffer: PByte;BytesRead: Cardinal;i: integer;beginoffset := 0;while (offset < size) dobeginVirtualQueryEx(m_hProc, Pointer(base + offset), mbi, sizeof(MEMORY_BASIC_INFORMATION));if (mbi.State <> MEM_FREE) thenbeginGetMem(buffer, mbi.RegionSize);ReadProcessMemory(m_hProc, mbi.BaseAddress, buffer, mbi.RegionSize, BytesRead);for i := 0 to mbi.RegionSize dobeginif (DataCompare(PByte(Integer(buffer) + i), sign, mask)) thenbeginFreeMem(buffer);result := integer(mbi.BaseAddress) + i;exit;end;end;FreeMem(buffer);end;offset := offset + mbi.RegionSize;end;result := 0;end;end.
Trainer
in Высокоуровневое программирование
Опубликовано
По поводу поиска сигнатуры в игре :
http://zhyk.ru/forum/showthread.php?t=887570
По поводу если тебе нужно записать инструкцию - байты в игру ну не в самой ехе , а в длл игры есть функция