forked from AlexanderBagel/ProcessMemoryMap
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpmm_plugin.pas
More file actions
176 lines (151 loc) · 8.62 KB
/
Copy pathpmm_plugin.pas
File metadata and controls
176 lines (151 loc) · 8.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
////////////////////////////////////////////////////////////////////////////////
//
// ****************************************************************************
// * Project : ProcessMM
// * Unit Name : pmm_plugin.pas
// * Purpose : Модуль с декларацией структур для плагинов PMM
// * Author : Александр (Rouse_) Багель
// * Copyright : © Fangorn Wizards Lab 1998 - 2023.
// * Version : 1.3.23
// * Home Page : http://rouse.drkb.ru
// * Home Blog : http://alexander-bagel.blogspot.ru
// ****************************************************************************
// * Stable Release : http://rouse.drkb.ru/winapi.php#pmm2
// * Latest Source : https://github.com/AlexanderBagel/ProcessMemoryMap
// ****************************************************************************
//
unit pmm_plugin;
interface
uses
Windows;
{
Для облегчения отладки плагина можно использовать командную строку.
1. В параметрах запуска указать путь к утилите (Host application).
Например: ..\..\..\..\Win64\SingleInstance\ProcessMM.exe
2. В командной строке прописать параметры запуска утилиты в формате
"Идентификатор процесса" (int), "Адрес страницы" ($HEX), "режим дизассеблирования" (-d)
Например: 27992 $00540000 -d
3. Для отладки 32 битной библиотеки необходимо переключить РММ в 32 битный режим
принудительно выставлением флага x32 (только для 64 битных ОС)
Например: x32 27992 $00540000 -d
}
const
/// <summary>
/// версия API на которой был собран плагин, должна возвращаться в TPlugin.VersionApi
/// </summary>
PMM_API_VER = 1;
/// <summary>
/// плагин должен экспортировать эту функцию, возвращающую структуру TPlugin
/// </summary>
PMM_PLUGIN_ENTRYPOINT_NAME = 'pmm_get_plugin_info';
type
/// <summary>
/// двусвязный список передаваемый на вход TPluginOpenProcess
/// </summary>
PProcessModule = ^TProcessModule;
TProcessModule = record
BLink: PProcessModule; // ссылка на предыдущую структуру (или nil)
FLink: PProcessModule; // ссылка на следующую структуру (nil - конец списка)
Instance: ULONG64; // база загрузки модуля в открытом хостом процессе
ImagePath: PWideChar; // полный путь к модулю
LoadAsDataFile: BOOL; // флаг присутствия модуля в списках лоадера (исполняемый или отмапленый)
end;
/// <summary>
/// команда плагину об открытии нового процесса (нужно инициализароваться)
/// в случае успеха фунция должна вернуть NO_ERROR
/// </summary>
TPluginOpenProcess =
function(AProcessID: DWORD; AModuleList: PProcessModule): DWORD; stdcall;
/// <summary>
/// команда плагину о закрытии процесса (нужно освободить ресурсы)
/// </summary>
TPluginCloseProcess = procedure(); stdcall;
/// <summary>
/// запрос о количестве известных плагину дескрипторов
/// в случае неуспеха функция должна вернуть ноль!
/// </summary>
TPluginDescriptorCount = function(): Integer; stdcall;
/// <summary>
/// Тип дескриптора
/// </summary>
TDescriptorType = (
/// <summary>
/// Флаг типа дескриптора, означающий произвольные данные, описываемые им, например коментарий
/// </summary>
PMM_DESCR_TYPE_UNKNOWN = 0,
/// <summary>
/// Флаг типа дескриптора, означающий что дескриптор описывает поле структуры
/// При это в TDescriptorData желательно заполнение наименования структуры в поле NameSpace
/// </summary>
PMM_DESCR_TYPE_STRUCT = 1,
/// <summary>
/// Флаг типа дескриптора, означающий что дескриптор описывает функцию
/// </summary>
PMM_DESCR_TYPE_FUNCTION = 2
);
/// <summary>
/// уникальный описатель известной плагину информации по адресу
/// </summary>
PDescriptor = ^TDescriptor;
TDescriptor = record
AddrVA: ULONG64; // описываемый адрес
Handle: THandle; // уникальный маркер задаваемый плагином
DescrType: TDescriptorType; // тип дескриптора
end;
/// <summary>
/// запрос дескриптора по индексу
/// </summary>
TPluginGetDescriptor = function(Index: Integer; pDesc: PDescriptor): DWORD; stdcall;
/// <summary>
/// данные описываемые дескриптором
/// </summary>
PDescriptorData = ^TDescriptorData;
TDescriptorData = record
Caption: PWideChar; // описание адреса, например имя функции или имя поля структуры
// необязательные поля (не используются в режиме дизассемблера)
NameSpace: PWideChar; // принадлежность адреса к более обьемному блоку (например структуре или таблице)
Description: PWideChar; // коментарий к адресу
Size: DWORD; // размер описываемого блока
end;
/// <summary>
/// запрос данных дескриптора. Память должна быть выделена вызывающей стороной.
/// необходимый размер данных возвращается в параметре pSize
/// AHandle - параметр полученый ранее из структуры TDescriptor
/// Если pDescData равна NIL или pSize содержит недостаточный размер
/// функция обязана вернуть ERROR_INSUFFICIENT_BUFFER
/// В случае успеха функция должна вернуть NO_ERROR
/// </summary>
TPluginGetDescriptorData = function(AHandle: THandle;
pDescData: PDescriptorData; pSize: PInteger): DWORD; stdcall;
/// <summary>
/// адреса функций посредством которых идет работа с плагином
/// Close является не обязательны и может быть не назначен.
/// </summary>
TPluginCallGate = record
Open: TPluginOpenProcess;
Close: TPluginCloseProcess;
DescriptorCount: TPluginDescriptorCount;
GetDescriptor: TPluginGetDescriptor;
GetDescriptorData: TPluginGetDescriptorData;
end;
/// <summary>
/// структура возвращаемая pmm_get_plugin_info()
/// </summary>
TPlugin = record
VersionApi: DWORD; // поле должно быть заполнено значением PMM_API_VER
PluginUID: DWORD; // уникальный идентификатор плагина.
// не должен быть равен нулю и
// не должен меняться при выпуске новой версии плагина!!!
Gate: TPluginCallGate; // шлюз вызовов плагина
// следующие поля не обязательны и могут быть равны nil
PluginName: PWideChar; // имя плагина (используется в диалоге прогресса)
PluginAuthor: PWideChar; // автор плагина
PluginHomePage: PWideChar; // домашняя страницы плагина
PluginDesсription: PWideChar; // краткое описание плагина
end;
/// <summary>
/// точка входа в плагин. именно с неё начинается работа
/// </summary>
Tpmm_get_plugin_info = function(): TPlugin; stdcall;
implementation
end.