Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 26.05.2014, 07:52   #1
 Разведчик
Аватар для arxlex
 
arxlex скоро будет известенarxlex скоро будет известенarxlex скоро будет известен
Регистрация: 05.07.2010
Сообщений: 1
Популярность: 279
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 1 сообщении
 
Post Сканер сигнатур для Delphi by ArxLex

Привет всем! Решил поделиться сканером сигнатур написанный мною aka ArxLex на Delphi. Материал чисто для ознакомительных целей. В качестве основы и принципа работы были взяты функции с C++. Пример написан для новичков и любителей WINAPI в виде консольного приложения, для большего удобства и понимания кода.
Код:
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 Cheat[ON].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.
Источник: [Ссылки могут видеть только зарегистрированные пользователи. ]

Последний раз редактировалось arxlex; 26.05.2014 в 17:16.
  Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
артём612 (26.05.2014), NebesaBag (27.05.2014), RenatPro (27.05.2014)
Старый 26.05.2014, 13:33   #2
 Разведчик
Аватар для Dinmaite[Work]
 
Dinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небе
Регистрация: 05.03.2011
Сообщений: 40
Популярность: 841
Сказал(а) спасибо: 1
Поблагодарили 9 раз(а) в 8 сообщениях
 
По умолчанию Re: Сканер сигнатур для Delphi by ArxLex

где?

...
ну вот, другое дело
________________
Dinmaite пишет с меня, когда он на работе.

Последний раз редактировалось Dinmaite; 26.05.2014 в 17:45.
  Ответить с цитированием
Старый 26.05.2014, 17:13   #3
Подпольщик RF Online
 Пехотинец
Аватар для артём612
 
артём612 лучик света в грозовом небеартём612 лучик света в грозовом небеартём612 лучик света в грозовом небеартём612 лучик света в грозовом небеартём612 лучик света в грозовом небеартём612 лучик света в грозовом небеартём612 лучик света в грозовом небе
Регистрация: 10.10.2011
Сообщений: 65
Популярность: 772
Сказал(а) спасибо: 58
Поблагодарили 57 раз(а) в 32 сообщениях
Отправить сообщение для артём612 с помощью Skype™
 
По умолчанию Re: Сканер сигнатур для Delphi by ArxLex

Цитата:
Сообщение от Dinmaite[Work]Посмотреть сообщение
где?

Он просто сделал чтобы код открывался после того как ему поставят спасибо
Но [THANKLIM] походу работает криво

вот что должно быть

Цитата:
Код:
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 Cheat[ON].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.
Источник: [Ссылки могут видеть только зарегистрированные пользователи. ]
(C)arxlex

  Ответить с цитированием
Старый 28.05.2014, 18:19   #4
Super Moderator
 Маршал
Аватар для Тигрь
 
Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(
Регистрация: 05.05.2009
Сообщений: 875
Популярность: 48955
Золото Zhyk.Ru: 850
Сказал(а) спасибо: 155
Поблагодарили 739 раз(а) в 274 сообщениях
 
По умолчанию Re: Сканер сигнатур для Delphi by ArxLex

Ужасная реализация, всегда ужасался когда натыкался на исходники читов для PB на с++ и там был этот сканер сигнатур. Зачем делать сигнатуру и маску? Когда это все можно записать в одной строке.
Вот в соседней теме нормальная реализация сигнатурного поиска, за исключением того как в функцию передаются параметры(если бы это было не в виде длл то было бы нормально), ну и еще на кой-то адрес возвращается как строка.
http://zhyk.ru/forum/showthread.php?t=887570
________________
Продаю приват читы для AION Absolute, desteny 3.5, Legend, Cataclysm, Ru, EU, NA
Продаю многооконку на R2 Пишу читы на заказ под любые игры. Предложения в ЛС.
Все мои читы/программы/статьи тут: http://zhyk.ru/forum/showpost.php?p=38501&postcount=21

Последний раз редактировалось Тигрь; 28.05.2014 в 18:23.
  Ответить с цитированием
Старый 22.06.2014, 04:41   #5
 Разведчик
Аватар для N0iD
 
N0iD никому не известный тип
Регистрация: 21.06.2014
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Сканер сигнатур для Delphi by ArxLex

Приветствую, возможно мой вопрос будет нубским, но все же прошу обратить на него внимание.

При попытке компиляции ругается на выделенное красным: &mbi скорей всего опечатка, но все же.
Цитата:
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;

И каким образом подбирается данное значение, собственно то которое выделено красным.

Цитата:
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';


Последний раз редактировалось N0iD; 22.06.2014 в 07:34.
  Ответить с цитированием
Старый 12.08.2014, 10:41   #6
Бандеровец
 Лейтенант-командор
Аватар для VeTaL_UA
 
VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(
Регистрация: 12.08.2010
Сообщений: 727
Популярность: 30569
Золото Zhyk.Ru: 1
Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
Отправить сообщение для VeTaL_UA с помощью ICQ Отправить сообщение для VeTaL_UA с помощью Skype™
 
По умолчанию Re: Сканер сигнатур для Delphi by ArxLex

Цитата:
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);

Ну очевидно же, что по количеству элементов массива, в массиве 23 байта, значит от 0 до 22 индексы идут.
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.

Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.


  Ответить с цитированием
Ответ

Метки
arxlex, сканер сигнатур для delphi, signature scanner delphi


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Руководство] Сканер адрессов + Поиск сигнатур крайслер Разработка ПО для Point Blank 36 07.04.2015 22:05
Delphi нужен сканер сигнатур Drakon3 Вопросы и ответы, обсуждения 11 26.05.2014 07:56
2 вид сканера сигнатур BLACK_DEAD Разработка ПО для Point Blank 15 17.02.2013 23:44
[Помогите!] Поиск сигнатур. Workoutt Вопросы и ответы, обсуждения 7 06.12.2012 19:52
[Помогите!] Сканер сигнатур Workoutt Вопросы и ответы, обсуждения 6 24.11.2012 21:25

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 01:58.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net