1fd98b2af3773437487af0df22c428f3db630949awaylonis// Copyright (c) 2006, Google Inc. 2fd98b2af3773437487af0df22c428f3db630949awaylonis// All rights reserved. 3fd98b2af3773437487af0df22c428f3db630949awaylonis// 4fd98b2af3773437487af0df22c428f3db630949awaylonis// Redistribution and use in source and binary forms, with or without 5fd98b2af3773437487af0df22c428f3db630949awaylonis// modification, are permitted provided that the following conditions are 6fd98b2af3773437487af0df22c428f3db630949awaylonis// met: 7fd98b2af3773437487af0df22c428f3db630949awaylonis// 8fd98b2af3773437487af0df22c428f3db630949awaylonis// * Redistributions of source code must retain the above copyright 9fd98b2af3773437487af0df22c428f3db630949awaylonis// notice, this list of conditions and the following disclaimer. 10fd98b2af3773437487af0df22c428f3db630949awaylonis// * Redistributions in binary form must reproduce the above 11fd98b2af3773437487af0df22c428f3db630949awaylonis// copyright notice, this list of conditions and the following disclaimer 12fd98b2af3773437487af0df22c428f3db630949awaylonis// in the documentation and/or other materials provided with the 13fd98b2af3773437487af0df22c428f3db630949awaylonis// distribution. 14fd98b2af3773437487af0df22c428f3db630949awaylonis// * Neither the name of Google Inc. nor the names of its 15fd98b2af3773437487af0df22c428f3db630949awaylonis// contributors may be used to endorse or promote products derived from 16fd98b2af3773437487af0df22c428f3db630949awaylonis// this software without specific prior written permission. 17fd98b2af3773437487af0df22c428f3db630949awaylonis// 18fd98b2af3773437487af0df22c428f3db630949awaylonis// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19fd98b2af3773437487af0df22c428f3db630949awaylonis// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20fd98b2af3773437487af0df22c428f3db630949awaylonis// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21fd98b2af3773437487af0df22c428f3db630949awaylonis// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22fd98b2af3773437487af0df22c428f3db630949awaylonis// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23fd98b2af3773437487af0df22c428f3db630949awaylonis// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24fd98b2af3773437487af0df22c428f3db630949awaylonis// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25fd98b2af3773437487af0df22c428f3db630949awaylonis// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26fd98b2af3773437487af0df22c428f3db630949awaylonis// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27fd98b2af3773437487af0df22c428f3db630949awaylonis// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28fd98b2af3773437487af0df22c428f3db630949awaylonis// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29e5dc60822e5938fea2ae892ccddb906641ba174emmentovai 30fd98b2af3773437487af0df22c428f3db630949awaylonis// macho_id.h: Functions to gather identifying information from a macho file 31fd98b2af3773437487af0df22c428f3db630949awaylonis// 32fd98b2af3773437487af0df22c428f3db630949awaylonis// Author: Dan Waylonis 33fd98b2af3773437487af0df22c428f3db630949awaylonis 34fd98b2af3773437487af0df22c428f3db630949awaylonis#ifndef COMMON_MAC_MACHO_ID_H__ 35fd98b2af3773437487af0df22c428f3db630949awaylonis#define COMMON_MAC_MACHO_ID_H__ 36fd98b2af3773437487af0df22c428f3db630949awaylonis 37fd98b2af3773437487af0df22c428f3db630949awaylonis#include <limits.h> 38b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org#include <mach/machine.h> 39fd98b2af3773437487af0df22c428f3db630949awaylonis#include <mach-o/loader.h> 40e919fdd63b4550a3261422ffde3c8d631007f75bmark@chromium.org 418fac6df2a0dfbfe7512c3f6616cda4cbac4f0d9dqsr@chromium.org#include "common/mac/macho_walker.h" 42e919fdd63b4550a3261422ffde3c8d631007f75bmark@chromium.org#include "common/md5.h" 43fd98b2af3773437487af0df22c428f3db630949awaylonis 44fd98b2af3773437487af0df22c428f3db630949awaylonisnamespace MacFileUtilities { 45fd98b2af3773437487af0df22c428f3db630949awaylonis 46fd98b2af3773437487af0df22c428f3db630949awaylonisclass MachoID { 47fd98b2af3773437487af0df22c428f3db630949awaylonis public: 48fd98b2af3773437487af0df22c428f3db630949awaylonis MachoID(const char *path); 498fac6df2a0dfbfe7512c3f6616cda4cbac4f0d9dqsr@chromium.org MachoID(const char *path, void *memory, size_t size); 50fd98b2af3773437487af0df22c428f3db630949awaylonis ~MachoID(); 51fd98b2af3773437487af0df22c428f3db630949awaylonis 52b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org // For the given |cpu_type| and |cpu_subtype|, return a UUID from the LC_UUID 53b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org // command. 54fd98b2af3773437487af0df22c428f3db630949awaylonis // Return false if there isn't a LC_UUID command. 55b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org bool UUIDCommand(cpu_type_t cpu_type, 56b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org cpu_subtype_t cpu_subtype, 57b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org unsigned char identifier[16]); 58fd98b2af3773437487af0df22c428f3db630949awaylonis 59b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org // For the given |cpu_type| and |cpu_subtype|, return a UUID from the 60b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org // LC_ID_DYLIB command. 61fd98b2af3773437487af0df22c428f3db630949awaylonis // Return false if there isn't a LC_ID_DYLIB command. 62b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org bool IDCommand(cpu_type_t cpu_type, 63b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org cpu_subtype_t cpu_subtype, 64b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org unsigned char identifier[16]); 65fd98b2af3773437487af0df22c428f3db630949awaylonis 66b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org // For the given |cpu_type| and |cpu_subtype|, return the Adler32 CRC for the 67b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org // mach-o data segment(s). 68fd98b2af3773437487af0df22c428f3db630949awaylonis // Return 0 on error (e.g., if the file is not a mach-o file) 69b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org uint32_t Adler32(cpu_type_t cpu_type, 70b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org cpu_subtype_t cpu_subtype); 71fd98b2af3773437487af0df22c428f3db630949awaylonis 72b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org // For the given |cpu_type|, and |cpu_subtype| return the MD5 for the mach-o 73b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org // data segment(s). 74fd98b2af3773437487af0df22c428f3db630949awaylonis // Return true on success, false otherwise 75b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org bool MD5(cpu_type_t cpu_type, 76b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org cpu_subtype_t cpu_subtype, 77b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org unsigned char identifier[16]); 78fd98b2af3773437487af0df22c428f3db630949awaylonis 79fd98b2af3773437487af0df22c428f3db630949awaylonis private: 80fd98b2af3773437487af0df22c428f3db630949awaylonis // Signature of class member function to be called with data read from file 81fd98b2af3773437487af0df22c428f3db630949awaylonis typedef void (MachoID::*UpdateFunction)(unsigned char *bytes, size_t size); 82fd98b2af3773437487af0df22c428f3db630949awaylonis 83fd98b2af3773437487af0df22c428f3db630949awaylonis // Update the CRC value by examining |size| |bytes| and applying the algorithm 84fd98b2af3773437487af0df22c428f3db630949awaylonis // to each byte. 85fd98b2af3773437487af0df22c428f3db630949awaylonis void UpdateCRC(unsigned char *bytes, size_t size); 86fd98b2af3773437487af0df22c428f3db630949awaylonis 87fd98b2af3773437487af0df22c428f3db630949awaylonis // Update the MD5 value by examining |size| |bytes| and applying the algorithm 88fd98b2af3773437487af0df22c428f3db630949awaylonis // to each byte. 89fd98b2af3773437487af0df22c428f3db630949awaylonis void UpdateMD5(unsigned char *bytes, size_t size); 90fd98b2af3773437487af0df22c428f3db630949awaylonis 91fd98b2af3773437487af0df22c428f3db630949awaylonis // Bottleneck for update routines 924ac61acb3a7dad6ce722fe07564be8ec92713228dmaclach void Update(MachoWalker *walker, off_t offset, size_t size); 93fd98b2af3773437487af0df22c428f3db630949awaylonis 948fac6df2a0dfbfe7512c3f6616cda4cbac4f0d9dqsr@chromium.org // Factory for the MachoWalker 95b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org bool WalkHeader(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype, 96b2cb7ad7bc83205d23f77b660438bf8e8d16fcb5qsr@chromium.org MachoWalker::LoadCommandCallback callback, void *context); 978fac6df2a0dfbfe7512c3f6616cda4cbac4f0d9dqsr@chromium.org 98e919fdd63b4550a3261422ffde3c8d631007f75bmark@chromium.org // The callback from the MachoWalker for CRC and MD5 99fd98b2af3773437487af0df22c428f3db630949awaylonis static bool WalkerCB(MachoWalker *walker, load_command *cmd, off_t offset, 100fd98b2af3773437487af0df22c428f3db630949awaylonis bool swap, void *context); 101fd98b2af3773437487af0df22c428f3db630949awaylonis 102fd98b2af3773437487af0df22c428f3db630949awaylonis // The callback from the MachoWalker for LC_UUID 103fd98b2af3773437487af0df22c428f3db630949awaylonis static bool UUIDWalkerCB(MachoWalker *walker, load_command *cmd, off_t offset, 104fd98b2af3773437487af0df22c428f3db630949awaylonis bool swap, void *context); 105fd98b2af3773437487af0df22c428f3db630949awaylonis 106fd98b2af3773437487af0df22c428f3db630949awaylonis // The callback from the MachoWalker for LC_ID_DYLIB 107fd98b2af3773437487af0df22c428f3db630949awaylonis static bool IDWalkerCB(MachoWalker *walker, load_command *cmd, off_t offset, 108fd98b2af3773437487af0df22c428f3db630949awaylonis bool swap, void *context); 109fd98b2af3773437487af0df22c428f3db630949awaylonis 110fd98b2af3773437487af0df22c428f3db630949awaylonis // File path 111fd98b2af3773437487af0df22c428f3db630949awaylonis char path_[PATH_MAX]; 112fd98b2af3773437487af0df22c428f3db630949awaylonis 1138fac6df2a0dfbfe7512c3f6616cda4cbac4f0d9dqsr@chromium.org // Memory region to read from 1148fac6df2a0dfbfe7512c3f6616cda4cbac4f0d9dqsr@chromium.org void *memory_; 1158fac6df2a0dfbfe7512c3f6616cda4cbac4f0d9dqsr@chromium.org 1168fac6df2a0dfbfe7512c3f6616cda4cbac4f0d9dqsr@chromium.org // Size of the memory region 1178fac6df2a0dfbfe7512c3f6616cda4cbac4f0d9dqsr@chromium.org size_t memory_size_; 118fd98b2af3773437487af0df22c428f3db630949awaylonis 119fd98b2af3773437487af0df22c428f3db630949awaylonis // The current crc value 120fd98b2af3773437487af0df22c428f3db630949awaylonis uint32_t crc_; 121fd98b2af3773437487af0df22c428f3db630949awaylonis 122fd98b2af3773437487af0df22c428f3db630949awaylonis // The MD5 context 12397bed584e322953bad9eee43c49955aa4684b19eted.mielczarek google_breakpad::MD5Context md5_context_; 124fd98b2af3773437487af0df22c428f3db630949awaylonis 125fd98b2af3773437487af0df22c428f3db630949awaylonis // The current update to call from the Update callback 126fd98b2af3773437487af0df22c428f3db630949awaylonis UpdateFunction update_function_; 127fd98b2af3773437487af0df22c428f3db630949awaylonis}; 128fd98b2af3773437487af0df22c428f3db630949awaylonis 129fd98b2af3773437487af0df22c428f3db630949awaylonis} // namespace MacFileUtilities 130fd98b2af3773437487af0df22c428f3db630949awaylonis 131fd98b2af3773437487af0df22c428f3db630949awaylonis#endif // COMMON_MAC_MACHO_ID_H__ 132