![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дамп памяти процесса
Form © (2004-07-22 10:03:00)Вопрос: Есть некоторый процесс (например стандартный "калькулятор"), необходимо сделать дамп памяти этого процесса! Под Вынь98 все работает, но под ХП и 2000 не работает, проблема с правами! Как мне взять своему приложению права, чтобы можно было читать память чужего процесса ("Калькулятора")???
Итак текст процедуры (вроде так):
function GetWMPath:string;
var
memarr:array of char; // динамический массив для памяти!
hProc : THandle;
MBI : MEMORY_BASIC_INFORMATION;
counter,i,j : cardinal;
ln : Integer;
MaxAddy,temp : Cardinal;
dwSize, dwAddress: cardinal;
hwnd, proc_id: dword;
f: file;
begin
enabledebug; // вызов процедуры получения прав, смотри ниже!!!
counter :=0;
SetLength(memarr, 0);
dwAddress := $400000;
MaxAddy := $80000000;
hwnd:=FindWindow (pchar('SciCalc'), nil); // получаем хэндл по классу окна
GetWindowThreadProcessId (hwnd,@proc_id);
hProc := OpenProcess(PROCESS_QUERY_INFORMATION, False, Proc_ID);
While (VirtualQueryEx(hProc, Pointer(dwAddress), MBI, SizeOf(MEMORY_BASIC_INFORMATION)) > 0) and (cardinal(MBI.BaseAddress) + MBI.RegionSize < MaxAddy) do
begin
If (MBI.Protect = PAGE_READWRITE) and (MBI.Type_9 = MEM_PRIVATE) and ((MBI.State = MEM_COMMIT) or (MBI.State = MEM_RESERVE)) Then
begin
dwSize := MBI.RegionSize;
dwAddress := cardinal(MBI.BaseAddress) + (MBI.RegionSize - dwSize);
SetLength(memarr, counter + dwSize);
ReadProcessMemory(hproc,
pointer(dwAddress),
@memarr[counter],
dwSize,
temp);
counter := counter + dwSize;
end;
Inc(dwAddress, MBI.RegionSize);
end;
CloseHandle(hProc);
assignfile(f, 'test.txt'); // debug - сохранение дампа
rewrite(f,1); // оставил на всякий случай!
i:=0;
repeat
blockwrite(f, memarr[i], 50);
i:=i+50;
until i >= counter;
closefile(f);
Finalize(memarr);
FreeMem(memarr);
end;
---
А вот так я пытаюсь взять себе нужные права(НЕ РАБОТАЕТ!!!):
procedure enabledebug;
var TokenHandle: THandle; dwNull: DWORD;
TokenPrivilege, Tmp: TTokenPrivileges;
begin
try
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle);
LookupPrivilegeValue(nil, 'SeDebugPrivilege', TokenPrivilege.Privileges[0].Luid);
with TokenPrivilege do begin
PrivilegeCount := 1;
Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
end;
dwNull := 0;
AdjustTokenPrivileges(TokenHandle, False,
TokenPrivilege, SizeOf(TTokenPrivileges), Tmp, dwNull);
except
ShowMessage('debug error!');
end;
end;
Digitman (2004-07-22 10:29:00) [21]
> Form
> SetLength(memarr, counter + dwSize);
тебе на кой ляд весь дамп в памяти хранить-то ? а если потребуется целый гигабайт ? или более ? виртуальное адресное пространство тек.процесса не резиновое ! да и еще перераспределяешь память при каждой итерации, ничтоже сумняшеся "ворочая" огромные блоки памяти туда-сюда.. нет бы сразу в файл писать !
Form_1 (2004-07-22 10:25:00) [22]К сожалению писал это всё не я первая функция работает под виндоус 98(я проверил) а в 2000 винде действительно нехватает привилерий (1 мессадж скопирован с другого форума. там вразумительного ответа автору получить не удалось у меня сейчас таже проблема)
Digitman (2004-07-22 10:22:00) [23]
> НЕ РАБОТАЕТ
тебя кто научил так вызывать функцииWinAPI ?
почему вызываешь их как процедуры ? почему не анализируешь результат их выполнения ?
> except
> ShowMessage('debug error!');
> end;
с какого перепугу ты решил, что любое исключение следует интерпретировать как ошибка отладки ? где анализ класса исключения, если оно возникает ?
WinAPI-функции вообще не возбуждают никаких исключений ! они всегда возвращают результат !