OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
Macho.c
Go to the documentation of this file.
1
15#include <Library/BaseMemoryLib.h>
16#include <Library/DebugLib.h>
17#include <Library/MemoryAllocationLib.h>
18#include <Library/OcMachoLib.h>
19#include <Library/OcMiscLib.h>
20
21#include <string.h>
22#include <sys/time.h>
23
24#include <UserFile.h>
25
30
31STATIC
32int
34 IN OUT VOID *File,
35 IN UINT32 Size
36 )
37{
38 OC_MACHO_CONTEXT Context;
39
40 if (!MachoInitializeContext64 (&Context, File, Size, 0, Size)) {
41 return -1;
42 }
43
44 int Code = 0;
45
47
48 if ((Hdr != NULL) && (MachoGetFileSize (&Context) > 10) && (MachoGetLastAddress (&Context) != 10)) {
49 CopyMem (&mHeader, Hdr, sizeof (mHeader));
50 ++Code;
51 }
52
53 MACH_UUID_COMMAND *Cmd = MachoGetUuid (&Context);
54
55 if (Cmd != NULL) {
56 CopyMem (&mUuid, Cmd, sizeof (mUuid));
57 ++Code;
58 }
59
60 MACH_SEGMENT_COMMAND_64 *Segment = MachoGetSegmentByName64 (&Context, "__LINKEDIT");
61 MACH_SECTION_64 *Section;
62
63 if (Segment != NULL) {
64 CopyMem (&mSeg, Segment, sizeof (mSeg));
65 Section = MachoGetSectionByName64 (&Context, Segment, "__objc");
66 if (Section != NULL) {
67 CopyMem (&mSect, Section, sizeof (mSect));
68 ++Code;
69 }
70 }
71
72 UINT32 Index = 0;
73
74 while ((Section = MachoGetSectionByIndex64 (&Context, Index)) != NULL) {
75 CopyMem (&mSect, Section, sizeof (mSect));
76 ++Index;
77 }
78
79 if ((Section = MachoGetSectionByAddress64 (&Context, Index)) != NULL) {
80 CopyMem (&mSect, Section, sizeof (mSect));
81 ++Code;
82 }
83
84 MACH_NLIST_64 *Symbol = NULL;
85
86 for (Index = 0; (Symbol = MachoGetSymbolByIndex64 (&Context, Index)) != NULL; ++Index) {
87 CONST CHAR8 *Indirect = MachoGetIndirectSymbolName64 (&Context, Symbol);
88 if ( (AsciiStrCmp (MachoGetSymbolName64 (&Context, Symbol), "__hack") == 0)
89 || ((Indirect != NULL) && (AsciiStrCmp (Indirect, "__hack") == 0)))
90 {
91 ++Code;
92 }
93
94 if (MachoSymbolIsSection64 (Symbol)) {
95 ++Code;
96 }
97
98 if (MachoSymbolIsDefined64 (Symbol)) {
99 ++Code;
100 }
101
102 if (MachoSymbolIsLocalDefined64 (&Context, Symbol)) {
103 ++Code;
104 }
105
106 if (MachoIsSymbolValueInRange64 (&Context, Symbol)) {
107 ++Code;
108 }
109
110 UINT32 Offset;
111 if (MachoSymbolGetFileOffset64 (&Context, Symbol, &Offset, NULL)) {
112 Code += Offset;
113 }
114
115 if (MachoSymbolNameIsPureVirtual (MachoGetSymbolName64 (&Context, Symbol))) {
116 ++Code;
117 }
118
119 if (MachoSymbolNameIsPadslot (MachoGetSymbolName64 (&Context, Symbol))) {
120 ++Code;
121 }
122
123 if (MachoSymbolNameIsSmcp (&Context, MachoGetSymbolName64 (&Context, Symbol))) {
124 ++Code;
125 }
126
127 if (MachoSymbolNameIsMetaclassPointer (&Context, MachoGetSymbolName64 (&Context, Symbol))) {
128 ++Code;
129 }
130
131 char Out[64];
132 if ( MachoSymbolNameIsSmcp (&Context, MachoGetSymbolName64 (&Context, Symbol))
133 && MachoGetClassNameFromSuperMetaClassPointer (&Context, MachoGetSymbolName64 (&Context, Symbol), sizeof (Out), Out))
134 {
135 ++Code;
136 }
137
138 if (MachoSymbolNameIsVtable (MachoGetSymbolName64 (&Context, Symbol))) {
139 if (AsciiStrCmp (MachoGetClassNameFromVtableName (MachoGetSymbolName64 (&Context, Symbol)), "sym") != 0) {
140 ++Code;
141 }
142 }
143
144 if ( MachoGetFunctionPrefixFromClassName (MachoGetSymbolName64 (&Context, Symbol), sizeof (Out), Out)
145 && (AsciiStrCmp ("SomeReallyLongStringJustInCaseToCheckIt", Out) == 0))
146 {
147 ++Code;
148 }
149
150 if ( MachoSymbolNameIsMetaclassPointer (&Context, MachoGetSymbolName64 (&Context, Symbol))
151 && MachoGetClassNameFromMetaClassPointer (&Context, MachoGetSymbolName64 (&Context, Symbol), sizeof (Out), Out)
152 && (AsciiStrCmp ("SomeReallyLongStringJustInCaseToCheckIt", Out) == 0))
153 {
154 ++Code;
155 }
156
157 if ( MachoGetVtableNameFromClassName (MachoGetSymbolName64 (&Context, Symbol), sizeof (Out), Out)
158 && (AsciiStrCmp ("SomeReallyLongStringJustInCaseToCheckIt", Out) == 0))
159 {
160 ++Code;
161 }
162
163 if ( MachoGetMetaVtableNameFromClassName (MachoGetSymbolName64 (&Context, Symbol), sizeof (Out), Out)
164 && (AsciiStrCmp ("SomeReallyLongStringJustInCaseToCheckIt", Out) == 0))
165 {
166 ++Code;
167 }
168
169 if ( MachoGetFinalSymbolNameFromClassName (MachoGetSymbolName64 (&Context, Symbol), sizeof (Out), Out)
170 && (AsciiStrCmp ("SomeReallyLongStringJustInCaseToCheckIt", Out) == 0))
171 {
172 ++Code;
173 }
174
175 if (MachoSymbolNameIsCxx (MachoGetSymbolName64 (&Context, Symbol))) {
176 ++Code;
177 }
178
180 if (SCMP != NULL) {
181 if (AsciiStrCmp (MachoGetSymbolName64 (&Context, SCMP), "__hack") == 0) {
182 ++Code;
183 }
184
185 CONST MACH_NLIST_64 *Vtable;
186 CONST MACH_NLIST_64 *MetaVtable;
187 if (MachoGetVtableSymbolsFromSmcp64 (&Context, MachoGetSymbolName64 (&Context, SCMP), &Vtable, &MetaVtable)) {
188 if (AsciiStrCmp (MachoGetSymbolName64 (&Context, Vtable), "__hack") == 0) {
189 ++Code;
190 }
191
192 if (AsciiStrCmp (MachoGetSymbolName64 (&Context, MetaVtable), "__hack") == 0) {
193 ++Code;
194 }
195 }
196 }
197
198 MACH_NLIST_64 SSSS = *Symbol;
199 MachoRelocateSymbol64 (&Context, 0x100000000, &SSSS);
200 }
201
202 Symbol = MachoGetLocalDefinedSymbolByName64 (&Context, "_Assert");
203 if (Symbol != NULL) {
204 CONST CHAR8 *Indirect = MachoGetIndirectSymbolName64 (&Context, Symbol);
205 if ( (AsciiStrCmp (MachoGetSymbolName64 (&Context, Symbol), "__hack") == 0)
206 || ((Indirect != NULL) && (AsciiStrCmp (Indirect, "__hack") == 0)))
207 {
208 ++Code;
209 }
210
211 if (MachoSymbolIsSection64 (Symbol)) {
212 ++Code;
213 }
214
215 if (MachoSymbolIsDefined64 (Symbol)) {
216 ++Code;
217 }
218
219 if (MachoSymbolIsLocalDefined64 (&Context, Symbol)) {
220 ++Code;
221 }
222
223 if (MachoIsSymbolValueInRange64 (&Context, Symbol)) {
224 ++Code;
225 }
226
227 UINT32 Offset;
228 if (MachoSymbolGetFileOffset64 (&Context, Symbol, &Offset, NULL)) {
229 Code += Offset;
230 }
231
232 if (MachoSymbolNameIsPureVirtual (MachoGetSymbolName64 (&Context, Symbol))) {
233 ++Code;
234 }
235
236 if (MachoSymbolNameIsPadslot (MachoGetSymbolName64 (&Context, Symbol))) {
237 ++Code;
238 }
239
240 if (MachoSymbolNameIsSmcp (&Context, MachoGetSymbolName64 (&Context, Symbol))) {
241 ++Code;
242 }
243
244 if (MachoSymbolNameIsMetaclassPointer (&Context, MachoGetSymbolName64 (&Context, Symbol))) {
245 ++Code;
246 }
247
248 CHAR8 Out[64];
249 if ( MachoSymbolNameIsSmcp (&Context, MachoGetSymbolName64 (&Context, Symbol))
250 && MachoGetClassNameFromSuperMetaClassPointer (&Context, MachoGetSymbolName64 (&Context, Symbol), sizeof (Out), Out)
251 && (AsciiStrCmp ("SomeReallyLongStringJustInCaseToCheckIt", Out) == 0))
252 {
253 ++Code;
254 }
255
256 if (MachoSymbolNameIsVtable (MachoGetSymbolName64 (&Context, Symbol))) {
257 if (AsciiStrCmp (MachoGetClassNameFromVtableName (MachoGetSymbolName64 (&Context, Symbol)), "sym") != 0) {
258 ++Code;
259 }
260 }
261
262 if ( MachoGetFunctionPrefixFromClassName (MachoGetSymbolName64 (&Context, Symbol), sizeof (Out), Out)
263 && (AsciiStrCmp ("SomeReallyLongStringJustInCaseToCheckIt", Out) == 0))
264 {
265 ++Code;
266 }
267
268 if ( MachoSymbolNameIsMetaclassPointer (&Context, MachoGetSymbolName64 (&Context, Symbol))
269 && MachoGetClassNameFromMetaClassPointer (&Context, MachoGetSymbolName64 (&Context, Symbol), sizeof (Out), Out)
270 && (AsciiStrCmp ("SomeReallyLongStringJustInCaseToCheckIt", Out) == 0))
271 {
272 ++Code;
273 }
274
275 if ( MachoGetVtableNameFromClassName (MachoGetSymbolName64 (&Context, Symbol), sizeof (Out), Out)
276 && (AsciiStrCmp ("SomeReallyLongStringJustInCaseToCheckIt", Out) == 0))
277 {
278 ++Code;
279 }
280
281 if ( MachoGetMetaVtableNameFromClassName (MachoGetSymbolName64 (&Context, Symbol), sizeof (Out), Out)
282 && (AsciiStrCmp ("SomeReallyLongStringJustInCaseToCheckIt", Out) == 0))
283 {
284 ++Code;
285 }
286
287 if ( MachoGetFinalSymbolNameFromClassName (MachoGetSymbolName64 (&Context, Symbol), sizeof (Out), Out)
288 && (AsciiStrCmp ("SomeReallyLongStringJustInCaseToCheckIt", Out) == 0))
289 {
290 ++Code;
291 }
292
293 if (MachoSymbolNameIsCxx (MachoGetSymbolName64 (&Context, Symbol))) {
294 ++Code;
295 }
296 }
297
298 for (UINTN i = 0x1000000; i < MAX_UINTN; i += 0x1000000) {
299 if (MachoGetSymbolByRelocationOffset64 (&Context, i, &Symbol)) {
300 if (AsciiStrCmp (MachoGetSymbolName64 (&Context, Symbol), "__hack") == 0) {
301 ++Code;
302 }
303 }
304 }
305
306 return Code != 963;
307}
308
309int
311 int argc,
312 char *argv[]
313 )
314{
315 UINT32 FileSize;
316 UINT8 *Buffer;
317
318 if ((Buffer = UserReadFile ((argc > 1) ? argv[1] : "kernel", &FileSize)) == NULL) {
319 DEBUG ((DEBUG_ERROR, "Read fail\n"));
320 return -1;
321 }
322
323 return FeedMacho (Buffer, FileSize);
324}
325
326int
328 const uint8_t *Data,
329 size_t Size
330 )
331{
332 VOID *NewData;
333
334 if (Size > 0) {
335 NewData = AllocatePool (Size);
336 if (NewData != NULL) {
337 CopyMem (NewData, Data, Size);
338 FeedMacho (NewData, (UINT32)Size);
339 FreePool (NewData);
340 }
341 }
342
343 return 0;
344}
SMBIOS_STRUCTURE Hdr
Definition AppleSmBios.h:51
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
Definition Macho.c:327
STATIC int FeedMacho(IN OUT VOID *File, IN UINT32 Size)
Definition Macho.c:33
MACH_HEADER_64 mHeader
Definition Macho.c:26
MACH_SECTION_64 mSect
Definition Macho.c:27
MACH_SEGMENT_COMMAND_64 mSeg
Definition Macho.c:28
MACH_UUID_COMMAND mUuid
Definition Macho.c:29
DMG_SIZE_DEVICE_PATH Size
BOOLEAN MachoRelocateSymbol64(IN OUT OC_MACHO_CONTEXT *Context, IN UINT64 LinkAddress, IN OUT MACH_NLIST_64 *Symbol)
BOOLEAN MachoInitializeContext64(OUT OC_MACHO_CONTEXT *Context, IN VOID *FileData, IN UINT32 FileSize, IN UINT32 HeaderOffset, IN UINT32 InnerSize)
BOOLEAN MachoSymbolNameIsCxx(IN CONST CHAR8 *Name)
Definition CxxSymbols.c:391
BOOLEAN MachoSymbolNameIsPadslot(IN CONST CHAR8 *Name)
Definition CxxSymbols.c:51
MACH_NLIST_64 * MachoGetMetaclassSymbolFromSmcpSymbol64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Smcp)
BOOLEAN MachoGetClassNameFromMetaClassPointer(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *MetaClassName, IN UINTN ClassNameSize, OUT CHAR8 *ClassName)
Definition CxxSymbols.c:204
MACH_NLIST_64 * MachoGetSymbolByIndex64(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Index)
BOOLEAN MachoGetClassNameFromSuperMetaClassPointer(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SmcpName, IN UINTN ClassNameSize, OUT CHAR8 *ClassName)
Definition CxxSymbols.c:116
UINT32 MachoGetFileSize(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:77
MACH_HEADER_64 * MachoGetMachHeader64(IN OUT OC_MACHO_CONTEXT *Context)
CONST CHAR8 * MachoGetClassNameFromVtableName(IN CONST CHAR8 *VtableName)
Definition CxxSymbols.c:152
BOOLEAN MachoSymbolIsLocalDefined64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol)
MACH_NLIST_64 * MachoGetLocalDefinedSymbolByName64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *Name)
CONST CHAR8 * MachoGetIndirectSymbolName64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol)
BOOLEAN MachoGetFunctionPrefixFromClassName(IN CONST CHAR8 *ClassName, IN UINTN FunctionPrefixSize, OUT CHAR8 *FunctionPrefix)
Definition CxxSymbols.c:165
UINT64 MachoGetLastAddress(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:99
CONST CHAR8 * MachoGetSymbolName64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol)
BOOLEAN MachoGetFinalSymbolNameFromClassName(IN CONST CHAR8 *ClassName, IN UINTN FinalSymbolNameSize, OUT CHAR8 *FinalSymbolName)
Definition CxxSymbols.c:327
MACH_SECTION_64 * MachoGetSectionByName64(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SEGMENT_COMMAND_64 *Segment, IN CONST CHAR8 *SectionName)
MACH_SECTION_64 * MachoGetSectionByAddress64(IN OUT OC_MACHO_CONTEXT *Context, IN UINT64 Address)
BOOLEAN MachoSymbolIsSection64(IN CONST MACH_NLIST_64 *Symbol)
BOOLEAN MachoSymbolNameIsMetaclassPointer(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SymbolName)
Definition CxxSymbols.c:88
BOOLEAN MachoIsSymbolValueInRange64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol)
BOOLEAN MachoSymbolIsDefined64(IN CONST MACH_NLIST_64 *Symbol)
MACH_SECTION_64 * MachoGetSectionByIndex64(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Index)
BOOLEAN MachoGetSymbolByRelocationOffset64(IN OUT OC_MACHO_CONTEXT *Context, IN UINT64 Address, OUT MACH_NLIST_64 **Symbol)
BOOLEAN MachoSymbolNameIsVtable(IN CONST CHAR8 *SymbolName)
Definition CxxSymbols.c:379
BOOLEAN MachoGetVtableNameFromClassName(IN CONST CHAR8 *ClassName, IN UINTN VtableNameSize, OUT CHAR8 *VtableName)
Definition CxxSymbols.c:239
MACH_SEGMENT_COMMAND_64 * MachoGetSegmentByName64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SegmentName)
BOOLEAN MachoSymbolNameIsSmcp(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SymbolName)
Definition CxxSymbols.c:60
BOOLEAN MachoSymbolGetFileOffset64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Symbol, OUT UINT32 *FileOffset, OUT UINT32 *MaxSize OPTIONAL)
BOOLEAN MachoGetVtableSymbolsFromSmcp64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SmcpName, OUT CONST MACH_NLIST_64 **Vtable, OUT CONST MACH_NLIST_64 **MetaVtable)
BOOLEAN MachoSymbolNameIsPureVirtual(IN CONST CHAR8 *Name)
Definition CxxSymbols.c:42
MACH_UUID_COMMAND * MachoGetUuid(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:124
BOOLEAN MachoGetMetaVtableNameFromClassName(IN CONST CHAR8 *ClassName, IN UINTN VtableNameSize, OUT CHAR8 *VtableName)
Definition CxxSymbols.c:279
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
UINT8 * UserReadFile(IN CONST CHAR8 *FileName, OUT UINT32 *Size)
Definition UserFile.c:62
#define Code
Definition deflate.h:80
UINT8 uint8_t
int ENTRY_POINT(void)