Vlad2 Опубликовано 21 ноября, 2015 Поделиться Опубликовано 21 ноября, 2015 Здравствуйте, у меня есть модуль для сканирования памяти, но он работает только в диапазоне адресов 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 21 ноября, 2015 Поделиться Опубликовано 21 ноября, 2015 Как можно так писать код? Где отступы? Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 21 ноября, 2015 Автор Поделиться Опубликовано 21 ноября, 2015 Как можно так писать код? Где отступы?Улетучелись куда-то) Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 21 ноября, 2015 Поделиться Опубликовано 21 ноября, 2015 У регионов и блоков памяти имеются атрибуты защиты. Например, атрибут "на исполнение кода" (тот же PAGE_EXECUTE) и если искать по нему сигнатуру, то поиск будет значительно быстрее. Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 22 ноября, 2015 Автор Поделиться Опубликовано 22 ноября, 2015 У регионов и блоков памяти имеются атрибуты защиты. Например, атрибут "на исполнение кода" (тот же PAGE_EXECUTE) и если искать по нему сигнатуру, то поиск будет значительно быстрее.Дело не в скорости поиска, дело в том, что сигнатура не находится, если она расположена после адреса 0хFFFFFFFF. Допустим, моя сигнатура расположена по адресу 0х20FF30EC04.Я задам диапазон поиска 0х20FF30EC00 - 0х20FF30EC08. И сканер всеравно уйдет в бесконечный поиск. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 22 ноября, 2015 Поделиться Опубликовано 22 ноября, 2015 Попробую пошаговую отладку в Дельфи Ссылка на комментарий Поделиться на другие сайты Поделиться
Cemi4ka Опубликовано 22 ноября, 2015 Поделиться Опубликовано 22 ноября, 2015 Попробую пошаговую отладку в Дельфиче за бред причем тут отладка ? Здравствуйте, у меня есть модуль для сканирования памяти, но он работает только в диапазоне адресов 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. Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 22 ноября, 2015 Автор Поделиться Опубликовано 22 ноября, 2015 (изменено) че за бред причем тут отладка ? Ну дак если тебе нужно адаптировать сканер под 64 розрядные приложения ты хотябы удостойся выбрать розрядность своего приложения !!Я бы удостоился выбрать, если компилировал не на D7, а на XE Изменено 22 ноября, 2015 пользователем Vlad2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Cemi4ka Опубликовано 22 ноября, 2015 Поделиться Опубликовано 22 ноября, 2015 Я бы удостоился выбрать, если компилировал не на D7, а на XEну тогда не как (( Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 22 ноября, 2015 Поделиться Опубликовано 22 ноября, 2015 Попробую пошаговую отладку в Дельфи Хм.. как так я написал "Попробую", а "не попробуй". Даже в мыслях не было что-то делать. Странная опечатка. Насчет настроек D7 не знаю, возможно под 64 bit никак. Увы. Посмотри в Гугле, я думаю найдешь инфу Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 24 ноября, 2015 Автор Поделиться Опубликовано 24 ноября, 2015 Так и не нашел ответа, пришлось скачать ХЕ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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения