Перейти к содержанию

Delphi7 сканер сигнатур х64


Рекомендуемые сообщения

Здравствуйте, у меня есть модуль для сканирования памяти, но он работает только в диапазоне адресов 0х00000000 - 0хFFFFFFFF. И получается в 64 разрядных приложениях, он не может достать до некоторых адресов, которые за этим пределом.
Нужно, чтоб он работал в таком диапазоне 0х00000000000 - 0хFFFFFFFFFFF, но не могу никак его заставить это делать.


В функцию ScanSignature передается адрес с которого начинать сканировать, адрес до которого сканировать, байты и маска.
Так как адреса начала и конца сканирования передаются в типе Cardinal, а его диапазон до 0хFFFFFFFF, то я решил поменять этот тип на Int64, его диапазон заканчивается на 0х7FFFFFFFFFFFFFFF, но это не дало результатов. Поиск просто стал длиться бесконечно долго. Помогите адаптировать этот сканер под 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.
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

У регионов и блоков памяти имеются атрибуты защиты. Например, атрибут "на исполнение кода" (тот же PAGE_EXECUTE) и если искать по нему сигнатуру, то поиск будет значительно быстрее.

Ссылка на комментарий
Поделиться на другие сайты

У регионов и блоков памяти имеются атрибуты защиты. Например, атрибут "на исполнение кода" (тот же PAGE_EXECUTE) и если искать по нему сигнатуру, то поиск будет значительно быстрее.

Дело не в скорости поиска, дело в том, что сигнатура не находится, если она расположена после адреса 0хFFFFFFFF. Допустим, моя сигнатура расположена по адресу 0х20FF30EC04.

Я задам диапазон поиска 0х20FF30EC00 - 0х20FF30EC08. И сканер всеравно уйдет в бесконечный поиск.

Ссылка на комментарий
Поделиться на другие сайты

Попробую пошаговую отладку в Дельфи

че за бред причем тут отладка ?

 

Здравствуйте, у меня есть модуль для сканирования памяти, но он работает только в диапазоне адресов 0х00000000 - 0хFFFFFFFF. И получается в 64 разрядных приложениях, он не может достать до некоторых адресов, которые за этим пределом.

Нужно, чтоб он работал в таком диапазоне 0х00000000000 - 0хFFFFFFFFFFF, но не могу никак его заставить это делать.

В функцию ScanSignature передается адрес с которого начинать сканировать, адрес до которого сканировать, байты и маска.

Так как адреса начала и конца сканирования передаются в типе Cardinal, а его диапазон до 0хFFFFFFFF, то я решил поменять этот тип на Int64, его диапазон заканчивается на 0х7FFFFFFFFFFFFFFF, но это не дало результатов. Поиск просто стал длиться бесконечно долго. Помогите адаптировать этот сканер под 64 разрядные приложения. 

 

Ну дак если тебе нужно адаптировать сканер под 64 розрядные приложения ты хотябы удостойся  выбрать розрядность своего приложения !!

10571931.png

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.
Ссылка на комментарий
Поделиться на другие сайты

че за бред причем тут отладка ?

 

 

Ну дак если тебе нужно адаптировать сканер под 64 розрядные приложения ты хотябы удостойся  выбрать розрядность своего приложения !!

10571931.png

Я бы удостоился выбрать, если компилировал не на D7, а на XE

Изменено пользователем Vlad2
Ссылка на комментарий
Поделиться на другие сайты

offtopic.gif

Попробую пошаговую отладку в Дельфи

 

Хм.. как так я написал "Попробую", а "не попробуй". Даже в мыслях не было что-то делать. Странная опечатка.

 

Насчет настроек D7 не знаю, возможно под 64 bit никак. Увы. Посмотри в Гугле, я думаю найдешь инфу

Ссылка на комментарий
Поделиться на другие сайты

Так и не нашел ответа, пришлось скачать ХЕ8 и компилировать проект на ней.

Адаптировал для работы на 64 разрядной версии. Сканируется все как положено. 


Может кому-то пригодится.

unit SignScan;interfaceuses  Windows, 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: int64; WriteValue: array of Byte);  function ScanSignature(base: int64; size: int64; sign: PByte; mask: PAnsiChar): int64;var  m_pID: int64;  m_hProc: THandle;  module: TModuleEntry32;  m_Sign: int64;  PidID, PidHandle: int64;implementationfunction GetModuleInfo(const module_name: PChar; main_process: boolean): TModuleEntry32;var  snapshot: THandle;  module: TModuleEntry32;begin  snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, m_pID);  module.dwSize := sizeof(TModuleEntry32);  if (Module32First(snapshot, module)) then  begin        if (main_process) then        begin          CloseHandle(snapshot);          result := module;        end;        while (Module32Next(snapshot, module)) do        begin          if (StrIComp(PChar(ExtractFileName(module.szModule)), PChar(module_name)) = 0) then          begin                CloseHandle(snapshot);                result := module;          end;        end;  end;  result := module;end;procedure GetPID;var  snapshot: THandle;  pInfo: PROCESSENTRY32;begin  snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  pInfo.dwSize := sizeof(PROCESSENTRY32);  if (Process32First(snapshot, pInfo)) then  begin    while (Process32Next(snapshot, pInfo)) do    begin      if pInfo.szExeFile = procName then      begin        m_pID := pInfo.th32ProcessID;        CloseHandle(snapshot);        exit;      end;    end;  end;  m_pID := 0;  CloseHandle(snapshot);  exit;end;function DataCompare(data: PByte; sign: PByte; mask: PAnsiChar): boolean;begin  while mask^ <> #0 do  begin    if ((mask^ = 'x') and (data^ <> sign^)) then    begin      result := false;      exit;    end;    inc(mask);    inc(data);    inc(sign);  end;  result := true;end;function ScanSignature(base: int64; size: int64; sign: PByte; mask: PAnsiChar): int64;var  mbi: MEMORY_BASIC_INFORMATION;  offset: int64;  buffer: PByte;  BytesRead: Size_T;  i: int64;begin  offset := 0;  while (offset < size) do  begin    VirtualQueryEx(m_hProc, Pointer(base + offset), &mbi, sizeof(MEMORY_BASIC_INFORMATION));    if (mbi.State <> MEM_FREE) then    begin      GetMem(buffer, mbi.RegionSize);      ReadProcessMemory(m_hProc, mbi.BaseAddress, buffer, mbi.RegionSize, BytesRead);      for i := 0 to mbi.RegionSize do      begin        if (DataCompare(buffer + i, sign, mask)) then        begin          FreeMem(buffer);          result := int64(mbi.BaseAddress) + i;          exit;        end;      end;      FreeMem(buffer);    end;    offset := offset + mbi.RegionSize;  end;  result := 0;end;procedure Write(ProcessID: Cardinal; WriteAdress: int64; WriteValue: array of Byte);var  pHandle:LongInt;  Bytes : SIZE_T;  Aob_old_Protect_OFF: dword;  Aob_old_Protect_ON:dword;begin  pHandle:=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;end.
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.