Сейчас на форуме: _MBK_, tyns777, UniSoft (+11 невидимых)

 eXeL@B —› Программирование —› Помогите написать функцию на Delphi сканирования памяти
Посл.ответ Сообщение

Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 июня 2012 17:36
· Личное сообщение · #1

Помогите написать функцию на Delphi сканирования памяти, т.е. массива байт (Aob Scan) как это реализовано в Cheat Engine или любой другой подобной программе. Рылся в исходниках, но там полная каша и куча ненужных мне модулей.

На вход функции подавать Application Handle, и набор байт вида: AB CD ?? 01 02 03 ?? 04 ?? 05.

Надеюсь на вашу помощь. Заранее большое Спасибо!



Ранг: 42.2 (посетитель), 42thx
Активность: 0.040
Статус: Участник

Создано: 29 июня 2012 17:44
· Личное сообщение · #2

ReadProcessMemory



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 29 июня 2012 17:50
· Личное сообщение · #3

Вот тут пример поиска по маске
http://www.accessroot.com/arteam/forums/showtopic=9904



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 29 июня 2012 18:18
· Личное сообщение · #4

kid
Одним ReadProcessMemory тут не обойтись. Исключая брут всего адресного пространства, по хорошему надо знать раскладку памяти процесса (GetSystemInfo, VirtualQueryEx), их атрибуты, тип.
soulkeeper
гуглите лучше!
Code:
  1. var
  2.   ProcessID, Addr, Value, BytesRead: DWord;
  3.   ProcessHandle: THandle;
  4.   Mbi: TMemoryBasicInformation;
  5.   i: Cardinal;
  6.   Buf: PChar;
  7. begin
  8.   ProcessHandle := FindWindow(nil, PChar('Заголовок окна процесса'));
  9.   GetWindowThreadProcessId(ProcessHandle, @ProcessID);
  10.   Value := 12321;
  11.   ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_ALL_ACCESS or PROCESS_VM_OPERATION, false, ProcessID);
  12.     if ProcessHandle <> 0 then
  13.       try
  14.         Addr := 0;
  15.           while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do
  16.             begin
  17.               if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
  18.                 begin
  19.                   GetMem(Buf, Mbi.RegionSize);
  20.                     try
  21.                       if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, Buf, Mbi.RegionSize, BytesRead) then
  22.                         begin
  23.                           for i := 0 to BytesRead - SizeOf(Value) do
  24.                             begin
  25.                               if PDWord(@Buf[i])= Value then Memo1.Lines.Add('$' + IntToHex(Integer(Cardinal(Mbi.BaseAddress) + i), 8));
  26.                             end;
  27.                         end
  28.                       else
  29.                     finally
  30.                       FreeMem(Buf);
  31.                     end;
  32.                 end;
  33.               Addr := Addr + Mbi.RegionSize;
  34.             end;
  35.       finally
  36.         CloseHandle(ProcessHandle);
  37.       end;
  38. end;




Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 июня 2012 18:40
· Личное сообщение · #5

Vovan666 пишет:
Вот тут пример поиска по маске
http://www.accessroot.com/arteam/forums/showtopic=9904

Ссылка доступна только для зарегистрированных пользователей, а регистрация закрыта...



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 июня 2012 18:45
· Личное сообщение · #6

ELF_7719116 пишет:
гуглите лучше!
Code:
var
  ProcessID, Addr, Value, BytesRead: DWord;
  ProcessHandle: THandle;
  Mbi: TMemoryBasicInformation;
  i: Cardinal;
  Buf: PChar;
begin
  ProcessHandle := FindWindow(nil, PChar('Заголовок окна процесса'));
  GetWindowThreadProcessId(ProcessHandle, @ProcessID);
  Value := 12321;
  ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_ALL_ACCESS or PROCESS_VM_OPERATION, false, ProcessID);
    if ProcessHandle <> 0 then
      try
        Addr := 0;
          while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do
            begin
              if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
                begin
                  GetMem(Buf, Mbi.RegionSize);
                    try
                      if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, Buf, Mbi.RegionSize, BytesRead) then
                        begin
                          for i := 0 to BytesRead - SizeOf(Value) do
                            begin
                              if PDWord(@Buf[i])^ = Value then Memo1.Lines.Add('$' + IntToHex(Integer(Cardinal(Mbi.BaseAddress) + i), 8));
                            end;
                        end
                      else
                    finally
                      FreeMem(Buf);
                    end;
                end;
              Addr := Addr + Mbi.RegionSize;
            end;
      finally
        CloseHandle(ProcessHandle);
      end;
end;


Так тут же нет маски((



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 29 июня 2012 18:46
· Личное сообщение · #7

soulkeeper

b3b0_29.06.2012_EXELAB.rU.tgz - Текстовый документ (2).txt



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 июня 2012 18:53 · Поправил: soulkeeper
· Личное сообщение · #8

Vovan666 пишет:
soulkeeper

b3b0_29.06.2012_EXELAB.rU.tgz - Текстовый документ (2).txt

Спасибо, сейчас буду разбираться, а пока все кажется сложным. Если есть еще варианты пишите, буду признателен.

*** Добавлено ***
Немного разобрался с исходником... Он не подходит, т.к. он ищет в файле, а не в процессе



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 29 июня 2012 19:04
· Личное сообщение · #9

soulkeeper пишет:
Немного разобрался с исходником... Он не подходит, т.к. он ищет в файле, а не в процессе

Да какая тебе разница где и как ищет. скрести его с исходником от ELF_7719116 и радуйся, делов на 5 минут.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 29 июня 2012 19:45
· Личное сообщение · #10

Детский сад какой-то. Уже и так написали, и эдак. Подумай хотя бы немного и допиши уже самостоятельно.

| Сообщение посчитали полезным: plutos
 eXeL@B —› Программирование —› Помогите написать функцию на Delphi сканирования памяти
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати