Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2014, 03:57   #1
N0iD
Пользователь
 
Аватар для N0iD
 
Регистрация: 05.05.2010
Сообщений: 50
По умолчанию CreateToolhelp32Snapsot - x64

Приветствую, имеется вот такой вот код. Это сканер сигнатур, и все бы хорошо, но он не заточен под работу с приложениями x64. Работает на Delphi2007 и Delphi2010, на Delphi7 и Delphi XE2 не завелось. (Это там где я пробовал\проверял).

//На форме мемо и бутон.
PHP код:
unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
Dialogs,TlHelp32StdCtrls;

type
  TForm1 
= class(TForm)
    
Button1TButton;
    
Memo1TMemo;
    
procedure Button1Click(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;
  
m_pIDinteger;
  
m_hProcTHandle;
  
moduleTModuleEntry32;
  
m_Signinteger;

  const
   
procName 'file.exe';
   
Sign: array [.. 5of byte = ($89, $05, $84$BA, $03, $00  );
   
Mask 'xxxxxx'//Чтобы пропускать символы ставим в заместо "x" символ "?"
implementation

{$R *.dfm}

procedure GetPID;
var
  
snapshotTHandle;
  
pInfoPROCESSENTRY32;
begin
  snapshot 
:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS0);
  
pInfo.dwSize := sizeof(PROCESSENTRY32);
  if (
Process32First(snapshotpInfo)) then
  begin
    
while (Process32Next(snapshotpInfo)) 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_namePCharmain_processboolean): TModuleEntry32;
var
  
snapshotTHandle;
  
moduleTModuleEntry32;
begin
  snapshot 
:= CreateToolhelp32Snapshot(TH32CS_SNAPMODULEm_pID);
  
module.dwSize := sizeof(TModuleEntry32);
  if (
Module32First(snapshotmodule)) then
  begin
    
if (main_processthen
    begin
      CloseHandle
(snapshot);
      
result := module;
    
end;
    while (
Module32Next(snapshotmodule)) do
    
begin
      
if (StrIComp(PChar(ExtractFileName(module.szModule)), PChar(module_name)) = 0then
      begin
        CloseHandle
(snapshot);
        
result := module;
      
end;
    
end;
  
end;
  
result := module;
end;

function 
DataCompare(dataPBytesignPBytemaskPAnsiChar): 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(baseDwordsizeDwordsignPBytemaskPAnsiChar): integer;
var
  
mbiMEMORY_BASIC_INFORMATION;
  
offsetinteger;
  
bufferPByte;
  
BytesReadDword;
  
iinteger;
begin
  offset 
:= 0;
  while (
offset size) do
  
begin
    VirtualQueryEx
(m_hProcPointer(base offset), &mbisizeof(MEMORY_BASIC_INFORMATION));
    if (
mbi.State <> MEM_FREEthen
    begin
      GetMem
(buffermbi.RegionSize);
      
ReadProcessMemory(m_hProcmbi.BaseAddressbuffermbi.RegionSizeBytesRead);
      for 
:= 0 to mbi.RegionSize do
      
begin
        
if (DataCompare(buffer isignmask)) then
        begin
          FreeMem
(buffer);
          
result := integer(mbi.BaseAddress) + i;
          exit;
        
end;
      
end;
      
FreeMem(buffer);
    
end;
    
offset := offset mbi.RegionSize;
  
end;
  
result := 0;
end;

procedure TForm1.Button1Click(SenderTObject);
begin
Memo1
.Lines.Clear;
GetPID();
  if (
m_pID <> 0then
  begin
    module 
:= GetModuleInfo(niltrue);
    
m_hProc := OpenProcess(PROCESS_ALL_ACCESSfalsem_pID);
    
m_Sign := ScanSignature(integer(module.modBaseAddr), module.modBaseSize, @SignMask);

        
Memo1.Lines.Clear;
        
Memo1.Lines.AddIntToStr(m_hProc));
        
Memo1.Lines.Add('Handle Process: $' +inttohex(m_hProcsizeof(m_hProc)));
        
Memo1.Lines.Add('Pid: $'+inttohex(m_pIDsizeof(m_pID)));
        
Memo1.Lines.Add('Process Base Address: $'inttohex(integer(module.modBaseAddr), sizeof(module.modBaseAddr)));
        
Memo1.Lines.Add('Process Base Size: $'inttohex(module.modBaseSizesizeof(module.modBaseSize)));
        
Memo1.Lines.Add('Signature Address: $' inttohex(m_Signsizeof(m_Sign)));;

    
CloseHandle(m_hProc);
  
end;
end
Дни гугления дали свои плоды, может быть для кого то это очевидно, но для меня стало откровением то что в function GetModuleInfo нужно использовать для x64 приложений , EnumProcessModulesEx или как понял GetProcessImageFileName. Своих знаний на переделку не хватает, надеюсь на ваше снисхождение в помощи, в правке.

Или же я вообще несу ахинею и меня следует сжечь на костре?

Последний раз редактировалось N0iD; 24.06.2014 в 09:35.
N0iD вне форума Ответить с цитированием
Старый 24.06.2014, 03:58   #2
N0iD
Пользователь
 
Аватар для N0iD
 
Регистрация: 05.05.2010
Сообщений: 50
По умолчанию

И еще вопрос по поводу составления сигнатуры с маской, так как для составление сигнатуры для x32 я пользовался OllyDBG, то для x64 лишь по аналогии вручную сделал из вот такого кода, вот такую сигнатуру с маской. Правильно ли я сделал маску для x64?

x64
PHP код:
48 8B 81 48020000  mov rax,[rcx+00000248]
48 8B CA                mov rcx,rdx
48 89 02                
mov [rdx],rax 
PHP код:
$48, $8b, $81, $48, $02, $00, $00, $48, $8B$CA, $48, $89 $02
xxx
????xxxxxx 
И то что дала OllyDBG для x32
PHP код:
8B 81 78010000    mov eax,[ecx+00000178]
8B 75 08              mov esi,[ebp+08]
8B CE                  mov ecx,esi 
PHP код:
$8B, $81, $78, $01, $00, $00, $8B, $75, $08, $8B$CE
xx
????xxxxx 

Последний раз редактировалось N0iD; 24.06.2014 в 09:30.
N0iD вне форума Ответить с цитированием
Старый 24.06.2014, 11:29   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
но для меня стало откровением то что в function GetModuleInfo нужно использовать для x64 приложений , EnumProcessModulesEx или как понял GetProcessImageFileName.
Чепуха притом полнейшая. На MSDN об этом не разу ни слова.

Вместо CreateToolhelp32Snapshot, надежнее использовать PsAPI.

Сигнатурымогут быть вполне одинаковы как для x32 процесса, так и для x64.
Читайте установки PE-заголовка и ищите сигнатуры в зависимости от платформы.
Человек_Борща вне форума Ответить с цитированием
Старый 24.06.2014, 14:28   #4
N0iD
Пользователь
 
Аватар для N0iD
 
Регистрация: 05.05.2010
Сообщений: 50
По умолчанию

Человек_Борща
Спасибо за пищу для размышления.
N0iD вне форума Ответить с цитированием
Старый 24.06.2014, 14:41   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Сигнатурымогут быть вполне одинаковы как для x32 процесса, так и для x64.
А мне вот интересно если в секции данных будет искомая сигнатура, как программа отреагирует на это?
Т.е. мы нашли, но... нашли не совсем то что искали )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2014, 14:45   #6
N0iD
Пользователь
 
Аватар для N0iD
 
Регистрация: 05.05.2010
Сообщений: 50
По умолчанию

Человек_Борща
Кстате, скомпилил я тестовый файлик x64, и внем в данном варианте превосходно все находит, но указанною мною сигнатуру с маской не видит, когда я все тоже самое проделываю над нужным мне файлом, кроется сомнение все же в том, правильно ли я сделал маску.

Код:
48 8B 81 48020000  - mov rax,[rcx+00000248]
48 8B CA                - mov rcx,rdx
48 89 02                - mov [rdx],rax 

$48, $8b, $81, $48, $02, $00, $00, $48, $8B, $CA, $48, $89 $02
xxx????xxxxxx
А, и еще при повторном нажатие на поиск ни чего не находится, эти все проблемы решатся с PSapi ?

Последний раз редактировалось N0iD; 24.06.2014 в 14:52.
N0iD вне форума Ответить с цитированием
Старый 24.06.2014, 15:02   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от N0iD Посмотреть сообщение
Человек_Борща
Кстате, скомпилил я тестовый файлик x64, и внем в данном варианте превосходно все находит, но указанною мною сигнатуру с маской не видит, когда я все тоже самое проделываю над нужным мне файлом, кроется сомнение все же в том, правильно ли я сделал маску.

Код:
48 8B 81 48020000  - mov rax,[rcx+00000248]
48 8B CA                - mov rcx,rdx
48 89 02                - mov [rdx],rax 

$48, $8b, $81, $48, $02, $00, $00, $48, $8B, $CA, $48, $89 $02
xxx????xxxxxx
А, и еще при повторном нажатие на поиск ни чего не находится, эти все проблемы решатся с PSapi ?
PSAPI не будет искать за вас.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.08.2014, 02:03   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
А мне вот интересно если в секции данных будет искомая сигнатура, как программа отреагирует на это?
Это зависит от состояния файла. Если он запущен - правильнее искать в памяти процесса, если не запущен то нужно искать в файле, но уже более "умную" сигнатуру. Да и что мешает трояну хранить что-то искомое в секции данных или даже text?

Маска должна быть в самой сигнатуре, т.е.:
EB FF E5 ?? ?? ?? 03 F7 EF

+.т.к. это сигнатура, то встречается она всего 1 раз, и зачем сканировать весь файл, если можно точно обозначить пределы, где эти байты могут быть расположены...

Тоже самое для процесса.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
va_list x64 Perchik71 Visual C++ 0 09.12.2013 00:20
Delphi XE2 x64 asm написанная под x32 преобразование к x64 Ecosasha Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 26.11.2013 22:45
Wi-Fi в Windows 7 x64 russian-stalker Windows 4 12.07.2011 23:35
Windows 7 x64 СисТемникс Windows 7 13.09.2010 07:09
Реестр в x64 Xatr Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 17.01.2010 04:00