-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathtask.h
198 lines (134 loc) · 4.97 KB
/
task.h
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/*
* Copyright (c) YungRaj
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <types.h>
#include <stdint.h>
#include <string.h>
#include <mach/mach_types.h>
#include <sys/types.h>
#include "disassembler.h"
namespace xnu {
class Kernel;
};
namespace darwin {
namespace dyld {
class Dyld;
};
};
namespace bsd {
class Process;
};
class Symbol;
class Segment;
class Section;
class MachO;
namespace darwin {
class MachOUserspace;
};
using namespace darwin;
namespace xnu {
class Task {
public:
explicit Task() : disassembler(new Disassembler(this)) {}
explicit Task(xnu::Kernel* kernel, int pid);
explicit Task(xnu::Kernel* kernel, char* name);
explicit Task(Kernel* kernel, xnu::mach::Port task_port)
: kernel(kernel), task_port(task_port) {}
~Task() = default;
xnu::Kernel* GetKernel();
int GetPid() {
return pid;
}
int FindPid();
xnu::mach::Port GetTaskPort() {
return task_port;
}
xnu::mach::VmAddress GetTask() {
return task;
}
xnu::mach::VmAddress GetProc() {
return proc;
}
char* GetName() {
return name;
}
darwin::dyld::Dyld* GetDyld() {
return dyld;
}
bsd::Process* GetProcess() {
return process;
}
Disassembler* GetDisassembler() {
return disassembler;
}
static xnu::mach::Port GetTaskForPid(int pid);
static Task* GetTaskInfo(Kernel* kernel, char* task_name);
static xnu::mach::VmAddress FindProcByPid(xnu::Kernel* kernel, int pid);
static xnu::mach::VmAddress FindProcByName(xnu::Kernel* kernel, char* name);
static xnu::mach::VmAddress FindTaskByPid(xnu::Kernel* kernel, int pid);
static xnu::mach::VmAddress FindTaskByName(xnu::Kernel* kernel, char* name);
static xnu::mach::VmAddress GetTaskFromProc(xnu::Kernel* kernel, xnu::mach::VmAddress proc);
static xnu::mach::VmAddress FindPort(xnu::Kernel* kernel, xnu::mach::VmAddress task,
xnu::mach::Port port);
virtual xnu::mach::VmAddress GetBase();
virtual Offset GetSlide();
virtual char* GetTaskName();
virtual UInt64 Call(char* symbolname, UInt64* arguments, Size argCount);
virtual UInt64 Call(xnu::mach::VmAddress func, UInt64* arguments, Size argCount);
virtual xnu::mach::VmAddress VmAllocate(Size size);
virtual xnu::mach::VmAddress VmAllocate(Size size, UInt32 flags, xnu::mach::VmProtection prot);
virtual void VmDeallocate(xnu::mach::VmAddress address, Size size);
virtual bool VmProtect(xnu::mach::VmAddress address, Size size, xnu::mach::VmProtection prot);
virtual void* VmRemap(xnu::mach::VmAddress address, Size size);
virtual UInt64 VirtualToPhysical(xnu::mach::VmAddress address);
virtual bool Read(xnu::mach::VmAddress address, void* data, Size size);
virtual bool ReadUnsafe(xnu::mach::VmAddress address, void* data, Size size);
virtual UInt8 Read8(xnu::mach::VmAddress address);
virtual UInt16 Read16(xnu::mach::VmAddress address);
virtual UInt32 Read32(xnu::mach::VmAddress address);
virtual UInt64 Read64(xnu::mach::VmAddress address);
virtual bool Write(xnu::mach::VmAddress address, void* data, Size size);
virtual bool WriteUnsafe(xnu::mach::VmAddress address, void* data, Size size);
virtual void Write8(xnu::mach::VmAddress address, UInt8 value);
virtual void Write16(xnu::mach::VmAddress address, UInt16 value);
virtual void Write32(xnu::mach::VmAddress address, UInt32 value);
virtual void Write64(xnu::mach::VmAddress address, UInt64 value);
virtual char* ReadString(xnu::mach::VmAddress address);
virtual Symbol* GetSymbolByName(char* symname);
virtual Symbol* GetSymbolByAddress(xnu::mach::VmAddress address);
virtual xnu::mach::VmAddress GetSymbolAddressByName(char* symbolname);
xnu::mach::VmAddress GetImageLoadedAt(char* image_name, char** image_path);
virtual void PrintLoadedImages();
protected:
xnu::Kernel* kernel;
darwin::MachOUserspace* macho;
Disassembler* disassembler;
xnu::mach::Port task_port;
Offset slide;
xnu::mach::VmAddress task;
xnu::mach::VmAddress proc;
xnu::mach::VmAddress map;
xnu::mach::VmAddress pmap;
char* name;
char* path;
bsd::Process* process;
int pid;
xnu::mach::VmAddress base;
xnu::mach::VmAddress dyld_base;
xnu::mach::VmAddress dyld_shared_cache;
darwin::dyld::Dyld* dyld;
};
}; // namespace xnu