ArxLex Опубликовано 25 мая, 2014 Поделиться Опубликовано 25 мая, 2014 (изменено) Привет всем! Решил поделиться сканером сигнатур написанный мною на Delphi. Материал чисто для ознакомительных целей. В качестве основы и принципа работы были взяты функции с C++. Пример написан для новичков и любителей WINAPI в виде консольного приложения, для большего удобства и понимания кода program signaturescanner;{$APPTYPE CONSOLE}usesWindows, SysUtils, TlHelp32;varm_pID: integer;m_hProc: THandle;module: TModuleEntry32;m_Sign: integer;constprocName = 'D3D9Test.exe';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;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;function 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 ScanSignature(base: Dword; size: Dword; sign: PByte; mask: PAnsiChar): integer;varmbi: MEMORY_BASIC_INFORMATION;offset: integer;buffer: PByte;BytesRead: Dword;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(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;constSign: array [0 .. 22] of byte = ($68, $00, $00, $00, $00, $68, $00, $00, $00, $00, $68, $00, $00, $00, $00, $FF, $15, $00, $00, $00, $00, $6A, $20);Mask = 'x????x????x????xx????xx';beginGetPID();if (m_pID <> 0) thenbeginmodule := GetModuleInfo(nil, true);m_hProc := OpenProcess(PROCESS_ALL_ACCESS, false, m_pID);m_Sign := ScanSignature(integer(module.modBaseAddr), module.modBaseSize, @Sign, Mask);writeln(' *************************************************************');writeln(' * Signature Scanner for Delphi *');writeln(' * Coded by ArxLex (2014) *');writeln(' *************************************************************'+#10#13#10#13);writeln(' Handle Process: $', inttohex(m_hProc, sizeof(m_hProc)));writeln(' Pid: $', inttohex(m_pID, sizeof(m_pID)));writeln(' Process Base Address: $', inttohex(integer(module.modBaseAddr), sizeof(module.modBaseAddr)));writeln(' Process Base Size: $', inttohex(module.modBaseSize, sizeof(module.modBaseSize)));writeln(' Signature Address: $', inttohex(m_Sign, sizeof(m_Sign)));readln;CloseHandle(m_hProc);end;end.P.S. Еще раз спасибо участнику Coder за видео уроки и общее развите гэймхакинга Изменено 19 августа, 2015 пользователем ArxLex 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
DenkA003 Опубликовано 25 мая, 2014 Поделиться Опубликовано 25 мая, 2014 /DEL Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость vers0 Опубликовано 19 марта, 2016 Поделиться Опубликовано 19 марта, 2016 Не компилится, ругается на: if DataCompare (buffer + i, sign, mask) then --> operator not applicable operand type P.S. написать все без пробелов и с ошибками - издевательство ))))) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 20 марта, 2016 Поделиться Опубликовано 20 марта, 2016 В 19.03.2016в14:56, vers0 сказал: Не компилится, ругается на: if DataCompare (buffer + i, sign, mask) then --> operator not applicable operand type P.S. написать все без пробелов и с ошибками - издевательство ))))) Код был нормальным, просто при обновлении версии форумного движка он поехал. Потихоньку исправляем, где находим, когда есть время. Здесь пока еще не исправили. Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 20 марта, 2016 Поделиться Опубликовано 20 марта, 2016 24 минуты назад, Xipho сказал: Код был нормальным, просто при обновлении версии форумного движка он поехал. Потихоньку исправляем, где находим, когда есть время. Здесь пока еще не исправили. Вот про это я ещё давно писал... Невозможно код читать/копировать Ссылка на комментарий Поделиться на другие сайты Поделиться
ArxLex Опубликовано 24 июня, 2017 Автор Поделиться Опубликовано 24 июня, 2017 Скрытый текст program signaturescanner; {$APPTYPE CONSOLE} uses Windows, SysUtils, TlHelp32; var m_pID: integer; m_hProc: THandle; module: TModuleEntry32; m_Sign: integer; const procName = 'D3D9Test.exe'; 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 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; 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: Dword; size: Dword; sign: PByte; mask: PAnsiChar): integer; var mbi: MEMORY_BASIC_INFORMATION; offset: integer; buffer: PByte; BytesRead: Dword; i: integer; 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 := integer(mbi.BaseAddress) + i; exit; end; end; FreeMem(buffer); end; offset := offset + mbi.RegionSize; end; result := 0; end; const Sign: array [0 .. 22] of byte = ($68, $00, $00, $00, $00, $68, $00, $00, $00, $00, $68, $00, $00, $00, $00, $FF, $15, $00, $00, $00, $00, $6A, $20); Mask = 'x????x????x????xx????xx'; begin GetPID(); if (m_pID <> 0) then begin module := GetModuleInfo(nil, true); m_hProc := OpenProcess(PROCESS_ALL_ACCESS, false, m_pID); m_Sign := ScanSignature(integer(module.modBaseAddr), module.modBaseSize, @Sign, Mask); writeln(' *************************************************************'); writeln(' * Signature Scanner for Delphi *'); writeln(' * Special for GameHackLab.ru by ArxLex *'); writeln(' *************************************************************'+#10#13#10#13); writeln(' Handle Process: $', inttohex(m_hProc, sizeof(m_hProc))); writeln(' Pid: $', inttohex(m_pID, sizeof(m_pID))); writeln(' Process Base Address: $', inttohex(integer(module.modBaseAddr), sizeof(module.modBaseAddr))); writeln(' Process Base Size: $', inttohex(module.modBaseSize, sizeof(module.modBaseSize))); writeln(' Signature Address: $', inttohex(m_Sign, sizeof(m_Sign))); readln; CloseHandle(m_hProc); end; end. ......Такой код - не плохо было бы спрятать. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения