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

Delphi AOBScan с маской


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

Привет, форумчане!
Помогите, нужно в дельфи сделать AOBScan, который бы умел искать байты такого типа "00 01 ?? 03 04", и возвращал адреса по которым он находил такие байты.

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

Проще делать сканер сигнатур с маской. Впрочем, можно и в таком виде, но тогда тебе придется использовать регулярные выражения и преобразования строк. Это не простой вопрос, потому рекомендую сначала сделать обычный сканер сигнатур, как описывается в некоторых видео.

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

У Кодера в каком-то из уроков было по сканированию сигнатур. Но урок не был именно им посвящен. Урок был посвящен созданию трейнера. Так что смотри все уроки подряд. Ну и для решеток (С#) вроде keng статью делал.

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

Расскажи, чтоуже сделал, тогда кто-то из участников поможет. Или тебе нужно, чтобы для тебя написали код? Так это, получается, не помощь, а работа за тебя.

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

Вот лови исходник + модули сканера, и выбора процессов!

https://yadi.sk/d/FlD-IeQwcKFVt

Есть ещё модуль у меня, memoriscan.pas, сканиурет быстро, разные байты только нету "??", есть "xx"

Поподробнее в скайпе можно, так же могу привести пример трейнера, Сканирование в потоке!

Вот пример сканирования:

Сканер для XE_2

varAddress2: Tscanner_Faddress;====================================AOBScan(0, $7FFFFFFF, 'FF xx FF xx FF' , True, True);// True, True - это параметры доступа ( чтение, запись)    WriteB('90 90 90', 0);    case RunCheat(Address2) of      if_Activated:        begin          Result := 4;        end;      if_NotConnected:        begin          Result := 2;        end;      if_ErrorActivate:        begin          Result := 1;        end;    end;
//NullAlex: используем тег [code_][_/code] (без нижнего подчеркивания)
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Вот нашел проект со сканером, но он сканирует только статическую память, а к динамической не притрагивается. а мне очень нужно, что делать?

SigScanner.zip

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

Привет!

 

Предположу, что можно выяснить, как работает сканер из приведенного тобой архива, и поменять так, как тебе нужно. Вероятно, что как-то он отличает статическую память от динамической в процессе сканирования - это место и нужно будет поменять. Так же вероятно, что это будет просто битовый флажок (0x1001000 или что-нибудь в этом духе).

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

unction ScanSignature(base: Cardinal; size: Cardinal; sign: PByte; mask: PAnsiChar): integer;var  mbi: MEMORY_BASIC_INFORMATION;  offset: Cardinal;  buffer: PByte;  BytesRead: Cardinal;  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(PByte(Integer(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;

Вот функция сканирования, которая ток статические сканирует.

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

С чего ты взял? Вообще-то она сканирует виртуальную память. VirtualQueryEx тебе ни о чем не говорит?

Извини, но поэтому коду, я написал модуль

Который действительно сканирует и меняет!

НО меняет первый найденный аддрес и выходит из цикла, нужно создавать tstringlist..

PS извиняюсь, не так прочитал, ксипо.

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

Дык погоди, оно ведь и должно искать первое вхождение. Сигнатура-то уникальная. Если надо несколько просканировать - делай список сигнатур и получай список адресов, точно так же, циклом.

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

Сигнатура у меня уникальная. Но этой функцией я могу сканировать только статическую память. А когда сканирую сигнатуру из динамической, то она ничего не находит!

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

Будет и второй минус за бесконечное подъем темы. Не нужно стараться быть хитрее других и постоянно поднимать собственную тему, чтобы в топе держалась. Всем нужны ответы на заданные вопросы, и все терпеливо ждут.

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

Я все еще не совсем понял, в чем именно твоя проблема состоит. То ли у тебя

сканер сигнатур работает не так, как нужно вовсе, то ли тебе нужно искать 

сразу несколько адресов. Уникальность сигнатуры означает то, что такая 

последовательность байт встречается только один раз. У меня в уроках сканер 

был точно такой же с точки зрения логики и вполне нормально работыл - никаких 

жалоб не было. Если же тебе нужно искать несколько адресов, то делай список 

сигнатур и в цикле вызывай функцию сканирования для каждой.

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

Проблема - сканер сканирует только статическую память.
Статическая память - эта та область памяти, которая в СЕ обозначается зеленым цветом.
А та что никак не подсвечивается - Динамическая.

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

unction ScanSignature(base: Cardinal; size: Cardinal; sign: PByte; mask: PAnsiChar): integer;var  mbi: MEMORY_BASIC_INFORMATION;  offset: Cardinal;  buffer: PByte;  BytesRead: Cardinal;  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(PByte(Integer(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;

Вот функция сканирования, которая ток статические сканирует.

 

 

попытайся поменять 

if (mbi.State <> MEM_FREE) then beginGetMem(buffer, mbi.RegionSize);

на 

if (mbi.State=MEM_COMMIT) and not (mbi.Protect = PAGE_READWRITE)then begin GetMem(Buf, Mbi.RegionSize); и тд

 

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

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

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

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