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

Проблема с поиском по сигнатуре


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

ребята , помогите не хочет сканировать и менять сигнатуру , сканирую в браузере опера вообще не катит, вот функциии прроцедуры

 

 var    m_pID: integer;  m_hProc: THandle;  module: TModuleEntry32;  m_Sign: integer;  procName: string;  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 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; end; procedure Write(ProcessID: SIZE_T; WriteAdress: Integer; 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; function ScanSignature(base: Cardinal; size: SIZE_T; sign: PByte; mask: PAnsiChar): integer;var  mbi: MEMORY_BASIC_INFORMATION;  offset: integer;  buffer: PByte;  BytesRead: SIZE_T;  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; procedure TForm2.sCheckBox1Click(Sender: TObject);const  poisk: array [0..10] of byte =  ($66,$0F,$D6,$8D,$58,$FF,$FF,$FF,$C7,$85,$60); //Сигнатура поиска  zamena: array [0..10] of byte = ($90,$90,$90,$90,$90,$90,$90,$90,$C7,$85,$60); //Сигнатура замены  Mask = 'xxxxxxxxxx';begin     if sCheckBox1.Checked then  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, @poisk, Mask);    if m_Sign = 0 then    begin       sCheckBox1.Caption := 'Ошибка';    end    else    begin      Write(m_pID,m_Sign,zamena);      sCheckBox1.Caption := 'Деактивировать';    end;    end;    CloseHandle(m_hProc);  end  else  if sCheckBox1.Checked = False then  begin     Write(m_pID,m_Sign,poisk);     sCheckBox1.Caption := 'Активировать';  end;end;   
Как я понял, нету просто доступа к правам памяти( ReadOnly/ и т.д.) но как же мне поправить это дело

делаю на ХЕ5

//NullAlex: заголовок темы изменил, с "ПОМОГИТЕ" на более информативный - "Проблема с поиском по сигнатуре". На будущее прошу учесть, что темы нужно называть информативно, чтобы заголовок отражал суть вопроса. Предупреждение устное, на этот раз.

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

Код в порядке, вроде.

Вот по поводу маски - сомневаюсь. Попробуй выставить (в обработчике OnClick sCheckBox1) не 'xxxxxxxxxx', а примерно такую: 'x????x????x????xx????xx'.

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

Код в порядке, вроде.

Вот по поводу маски - сомневаюсь. Попробуй выставить (в обработчике OnClick sCheckBox1) не 'xxxxxxxxxx', а примерно такую: 'x????x????x????xx????xx'.

Можешь дать скайп, у меня есть вопрос приватный =), да и код всёравно не сканирует, возможно сканирует, но не заменяет!

Изменено пользователем ∟DarkPan
Ссылка на комментарий
Поделиться на другие сайты

код всёравно не сканирует, возможно сканирует, но не заменяет!

Перепилил код под Delphi 7 - все отлично работает. Разве что замену по сигнатуре не проверял, но поиск - вполне.

Только код GetPID отваливается временами, почему - разбираться не стал, но с этим сам уже разберешься.

 

Можешь дать скайп, у меня есть вопрос приватный =)

Задавай здесь, или в личном сообщении. Мой скайп - моя крепость :)

SigScanner.zip

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

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

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

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