Когда мне надо посмотреть или проверить как работает та или иная функция, то обычно я пишу небольшую программку, которая эту самую функцию активно использует
Итак, представленная ниже программа (если я все правильно сделал) должна:
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 .
хех. цикл. бесконечный. очень любимый всякими патчами/кряками ("замораживание" процесса). н-да...