Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
10th
Апр
Дамп памяти чужого процесса
Posted by Chas under Delphi
Есть определенный процесс, как мне из своей программы сделать что-то типа его дампа? Необходимо это для того чтобы потом в этом дампе произвести поиск определенного флага и если флаг будет найден убить процесс
Человек_Борща
Ну вот в общем-то конечный продукт моих стараний, не без помощи:
1. MSDN
2. mss’а
3. GunSmoker’а
{-------------------------------------------------------------------------------
Функция: MoveProcessMemoryToFile
Автор: Человек_Борща & mss & GunSmoker
Дата: 2011.08.31
Входные параметры: aPID: DWORD; aSaveFileTo,aFailMesage: string
Результат: Boolean
Описание:
Функция сбрасывает дамп(снимок) текущего состояния памяти процесса на диск в файл.
aPID - идентификатор процесса
aSaveFileTo - путь к файлу в который будет сброшена память
aFailMesage - что-то вроде CallBack сюда сбрасывается сообщение если результат false.
-------------------------------------------------------------------------------}
function MoveProcessMemoryToFile(aPID: DWORD; aSaveFileTo,aFailMesage: string): Boolean;
const
GB4 = 4294967296; //размер 4 гб в байтах
var
hProcess: Cardinal;
MBI: TMemoryBasicInformation;
FS: TFileStream;
Buff: PByte;
BaseAddr,
RecivedBytes: Cardinal;
begin
Result := False;
BaseAddr := 0;
RecivedBytes := 0;
//Открываем процесс
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_READ, False, aPID);
try
if hProcess <> 0 then
begin
//Если открыли, создаём файл
fs := TFileStream.Create(aSaveFileTo, fmCreate or fmOpenWrite);
try
//Запращиваем память по указанному адресу BaseAddr
while VirtualQueryEx(hProcess, Pointer(BaseAddr), MBI, SizeOf(MBI)) <> 0 do
begin
//Если страница памяти доступна и не заблокирована для нас
if ((MBI.State = MEM_COMMIT) and (not (MBI.Protect = PAGE_GUARD) or (MBI.Protect = PAGE_NOACCESS))) then
begin
try
//Выделяем часть памяти равной размеру региона памяти из кучи ОЗУ
Buff := AllocMem(MBI.RegionSize);
//Читаем память этого региона
if ReadProcessMemory(hProcess, MBI.BaseAddress, Buff, MBI.RegionSize, RecivedBytes) then
begin
//пишем в файл прочитанную информацию равную кол-ву считанных байт
FS.Write(Buff^, RecivedBytes);
end
//Если не удачно
else if (GetLastError <> ERROR_PARTIAL_COPY) and
(GetLastError <> ERROR_ACCESS_DENIED) then
begin
//Ложный результат
aFailMesage:=Format('Error #%d with RMessage: %s ', [GetLastError, SysErrorMessage(GetLastError)]);
Exit;
end;
finally
//Освобождаем занятую нами память
FreeMem(Buff);
end;
end;
//Увеличиваем(инкрементируем) стартовый адрес на размер региона
BaseAddr := BaseAddr + MBI.RegionSize;
//проверяем непревышает ли он размер 4 гб.
if BaseAddr = GB4 then
begin
Exit;
end;
end;
//Тупо проверка, сбросили мы в буфер хоть что-нибудь :d
if FS.Size > 0 then
begin
Result := True;
end;
finally
FreeAndNil(fs);
end;
end
else
begin
aFailMesage:=Format('Error #%d with RMessage: %s ', [GetLastError, SysErrorMessage(GetLastError)]);
Exit;
end;
finally
CloseHandle(hProcess);
end;
end;
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)