Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Когда мне надо посмотреть или проверить как работает та или иная функция, то обычно я пишу небольшую программку, которая эту самую функцию активно использует
Итак, представленная ниже программа (если я все правильно сделал) должна:
1) найти все запущенные процессы
2) в области виртуальной памяти каждого процесса найти используемые им части (регионы/блоки) и вывести по ним информацию
Если выводить в файл, то он получается размером в 2,37 мб ))
Код: Выделить весь код
program vpe;

{$APPTYPE CONSOLE}

uses
  Windows, PsAPI;

var
  hProcess: Cardinal;
  Buf: Memory_Basic_Information;
  tmp: array[0..200] of Cardinal; // буыер под 201 процесс =))
  i, k, j: Cardinal;
//  si: System_Info;

label
  l;

function Int2Hex( Value : DWord; Digits : Integer ): ShortString;
{ this function is copyrighted by KSer}
asm
        MOV       [ECX], DL
        XADD      EDX, ECX
@@loop1:
        PUSH      EAX
        db   $24, $0F    // and  al,$0F
        AAM
        //AAD
        DB $D5, $11
        db   $04, $30    // add  al,$30
        MOV       [EDX], AL
        POP       EAX
        SHR       EAX, 4
        DEC       EDX
        LOOP      @@loop1
end;

function GetAProtect(const i: Cardinal): String;
var
  temp: Cardinal;
const
  PAGE_WRITECOMBINE = $400;
begin
  Result := '';

  if i = 0 then begin
    Result := 'unknown (0)'; Exit; end;
     
  temp := i and $000000FF;
  case temp of
    PAGE_NOACCESS:          Result := 'PAGE_NOACCESS';
    PAGE_READONLY:          Result := 'PAGE_READONLY';
    PAGE_READWRITE:         Result := 'PAGE_READWRITE';
    PAGE_WRITECOPY:         Result := 'PAGE_WRITECOPY';
    PAGE_EXECUTE:           Result := 'PAGE_EXECUTE';
    PAGE_EXECUTE_READ:      Result := 'PAGE_EXECUTE_READ';
    PAGE_EXECUTE_READWRITE: Result := 'PAGE_EXECUTE_READWRITE';
    PAGE_EXECUTE_WRITECOPY: Result := 'PAGE_EXECUTE_WRITECOPY';
  end;

  if i and PAGE_GUARD <> 0 then
     Result := Result + ' && PAGE_GUARD';
  if i and PAGE_NOCACHE <> 0 then
     Result := Result + ' && PAGE_NOCACHE';
  if i and PAGE_WRITECOMBINE <> 0 then
     Result := Result + ' && PAGE_WRITECOMBINE';
     
  if Result = '' then Result := '!!! Error';
end;

function GetState(const i: Cardinal): String;
begin
  case i of
    MEM_COMMIT:  Result := 'MEM_COMMIT';
    MEM_FREE:    Result := 'MEM_FREE';
    MEM_RESERVE: Result := 'MEM_RESERVE';
    else         Result := '!!! Error';
  end;
end;

function GetType(const i: Integer): String;
begin
  case i of
    0:           Result := 'unknown (0)';
    MEM_IMAGE:   Result := 'MEM_IMAGE';
    MEM_MAPPED:  Result := 'MEM_MAPPED';
    MEM_PRIVATE: Result := 'MEM_PRIVATE';
    else         Result := '!!! Error';
  end;
end;

begin
// Через GetSystemInfo можно узнать размер страницы в памяти и так как
// Вам нужно добраться до определенной страницы, то ее адрес вычисляется
// просто: Base_Address + si.dwPageSize * PageNumber_In_Allocation_Region
//  GetSystemInfo(si);
  if not EnumProcesses(@tmp, sizeof(tmp), i) then Exit;
  for k := 0 to (i div 4) - 1 do begin
    WriteLn(#10#13'* * * * * // PID = ', tmp[k]);
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, True, tmp[k]);
    j := 0;
l:  if VirtualQueryEx(hProcess, Ptr(j), Buf, sizeof(Buf)) > 0 then begin
      WriteLn('Base Address: 0x' + Int2Hex(Cardinal(Buf.BaseAddress), 8) + ' (', Cardinal(Buf.BaseAddress), ')');
      WriteLn('Allocation Base: 0x' + Int2Hex(Cardinal(Buf.AllocationBase), 8) + ' (', Cardinal(Buf.AllocationBase), ')');
      WriteLn('Allocation Protect: ', GetAProtect(Buf.AllocationProtect));
      WriteLn('Region Size: 0x' + Int2Hex(Buf.RegionSize, 8) + ' (', Buf.RegionSize, ')');
      WriteLn('State: ', GetState(Buf.State));
      WriteLn('Protect: ', Buf.Protect);
      WriteLn('Type: ', GetType(Buf.Type_9));
      if (Cardinal(Buf.BaseAddress) + Buf.RegionSize < $FFFFFFFF) and (Buf.RegionSize > 0) then begin
        WriteLn;
        j := Cardinal(Buf.BaseAddress) + Buf.RegionSize;
        goto l; // loop
      end;
    end;                           
  end;

  ReadLn;
end.
Эх, млин чуть-чуть не успел, вот и пост DillerInc'a появился...

Цитата:
Мне необходимо поймать на крючок вызов функции LoadLibrary
Это уже хуки. Если не ошибаюсь, то подробности в гугле по Hooking Windows API .

Цитата:
EB FE
хех. цикл. бесконечный. очень любимый всякими патчами/кряками ("замораживание" процесса). н-да...

Отправлено: 23:20, 21-07-2005 | #5