MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / ParseHeaders

Method ParseHeaders

view/macho/universalview.cpp:158–206  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

156
157
158bool UniversalViewType::ParseHeaders(BinaryView* data, FatHeader& fatHeader, vector<FatArch64>& fatArchEntries, bool& isFat64, string& errorMsg)
159{
160 if (!IsTypeValidForData(data))
161 {
162 errorMsg = "Universal (Fat Mach-O): invalid signature";
163 return false;
164 }
165
166 BinaryReader reader(data);
167 reader.SetEndianness(BigEndian);
168 fatHeader.magic = reader.Read32();
169 fatHeader.nfat_arch = reader.Read32();
170
171 isFat64 = (fatHeader.magic == FAT_MAGIC_64);
172 size_t requiredFatHeaderSize = fatHeader.nfat_arch * (isFat64 ? 32 : 20) + 8;
173 if (requiredFatHeaderSize > data->GetLength())
174 {
175 errorMsg = "Universal (Fat Mach-O): header truncated";
176 return false;
177 }
178
179 for (size_t i = 0; i < fatHeader.nfat_arch; i++)
180 {
181 FatArch64 fatArch;
182 if (isFat64)
183 {
184 fatArch.cputype = reader.Read32();
185 fatArch.cpusubtype = reader.Read32();
186 fatArch.offset = reader.Read64();
187 fatArch.size = reader.Read64();
188 fatArch.align = reader.Read32();
189 fatArch.reserved = reader.Read32();
190 }
191 else
192 {
193 fatArch.cputype = reader.Read32();
194 fatArch.cpusubtype = reader.Read32();
195 fatArch.offset = reader.Read32();
196 fatArch.size = reader.Read32();
197 fatArch.align = reader.Read32();
198 }
199
200 // Mask away cpu subtype capability bits
201 fatArch.cpusubtype &= ~MACHO_CPU_SUBTYPE_MASK;
202 fatArchEntries.push_back(fatArch);
203 }
204
205 return true;
206}
207
208
209Ref<Settings> UniversalViewType::GetLoadSettingsForData(BinaryView* data)

Callers 2

UniversalViewMethod · 0.45

Calls 5

push_backMethod · 0.80
SetEndiannessMethod · 0.45
Read32Method · 0.45
GetLengthMethod · 0.45
Read64Method · 0.45

Tested by

no test coverage detected