diff options
Diffstat (limited to 'core/objc.h')
-rw-r--r-- | core/objc.h | 772 |
1 files changed, 772 insertions, 0 deletions
diff --git a/core/objc.h b/core/objc.h new file mode 100644 index 0000000..b09b461 --- /dev/null +++ b/core/objc.h @@ -0,0 +1,772 @@ +#ifndef OBJC_H +#define OBJC_H + +struct objc_module { + uint32_t version; + uint32_t size; + uint32_t name; + uint32_t symtab; +}; + +struct objc_module_64 { + uint32_t version; + uint32_t size; + uint64_t name; + uint64_t symtab; +}; + +struct objc_symtab { + uint32_t sel_ref_cnt; + uint32_t refs; + uint16_t cls_def_cnt; + uint16_t cat_def_cnt; +}; + +struct objc_symtab_64 { + uint32_t sel_ref_cnt; + uint64_t refs; + uint16_t cls_def_cnt; + uint16_t cat_def_cnt; +}; + +struct objc_class { + uint32_t isa; + uint32_t super_class; + uint32_t name; + uint32_t version; + uint32_t info; + uint32_t instance_size; + uint32_t ivars; + uint32_t methods; + uint32_t cache; + uint32_t protocols; +}; + +struct objc_class_64 { + uint64_t isa; + uint64_t super_class; + uint64_t name; + uint64_t version; + uint64_t info; + uint64_t instance_size; + uint64_t ivars; + uint64_t methods; + uint64_t cache; + uint64_t protocols; +}; + +struct objc_protocol { + uint32_t isa; + uint32_t name; + uint32_t protocols; + uint32_t instance_methods; + uint32_t class_methods; +}; + +struct objc_protocol_64 { + uint64_t isa; + uint64_t name; + uint64_t protocols; + uint64_t instance_methods; + uint64_t class_methods; +}; + +struct objc_method { + uint32_t name; + uint32_t types; + uint32_t imp; +}; + +struct objc_method_64 { + uint64_t name; + uint64_t types; + uint64_t imp; +}; + +struct objc_method_list { + uint32_t next; + uint32_t count; + // objc_method method[1]; +}; + +struct objc_category { + uint32_t category_name; + uint32_t class_name; + uint32_t instance_methods; + uint32_t class_methods; + uint32_t protocols; +}; + +struct objc_category_64 { + uint64_t category_name; + uint64_t class_name; + uint64_t instance_methods; + uint64_t class_methods; + uint64_t protocols; +}; + +struct objc2_class { + uint32_t isa; + uint32_t super_class; + uint32_t cache; + uint32_t vtable; + uint32_t data; +}; + +struct objc2_class_64 { + uint64_t isa; + uint64_t super_class; + uint64_t cache; + uint64_t vtable; + uint64_t data; +}; + +struct objc2_class_data { + uint32_t flags; + uint32_t instance_start; + uint32_t instance_size; + uint32_t ivar_layout; + uint32_t name; + uint32_t base_methods; + uint32_t base_protocols; + uint32_t ivars; + uint32_t weak_ivar_layout; + uint32_t base_properties; +}; + +struct objc2_class_data_64 { + uint32_t flags; + uint32_t instance_start; + uint32_t instance_size; + uint32_t reserved; + uint64_t ivar_layout; + uint64_t name; + uint64_t base_methods; + uint64_t base_protocols; + uint64_t ivars; + uint64_t weak_ivar_layout; + uint64_t base_properties; +}; + +struct objc2_method { + uint32_t name; + uint32_t types; + uint32_t imp; +}; + +struct objc2_method_64 { + uint64_t name; + uint64_t types; + uint64_t imp; +}; + +struct objc2_category { + uint32_t name; + uint32_t cls; + uint32_t instance_methods; + uint32_t class_methods; + uint32_t protocols; + uint32_t instance_properties; +}; + +struct objc2_category_64 { + uint64_t name; + uint64_t cls; + uint64_t instance_methods; + uint64_t class_methods; + uint64_t protocols; + uint64_t instance_properties; +}; + +struct objc2_protocol { + uint32_t isa; + uint32_t name; + uint32_t protocols; + uint32_t instance_methods; + uint32_t class_methods; + uint32_t optional_instance_methods; + uint32_t optional_class_methods; + uint32_t instance_properties; +}; + +struct objc2_protocol_64 { + uint64_t isa; + uint64_t name; + uint64_t protocols; + uint64_t instance_methods; + uint64_t class_methods; + uint64_t optional_instance_methods; + uint64_t optional_class_methods; + uint64_t instance_properties; +}; + +struct objc2_message { + uint32_t imp; + uint32_t name; +}; + +struct objc2_message_64 { + uint64_t imp; + uint64_t name; +}; + +class MacArchitecture; +class MacSegment; + +class IObjcMethod : public IObject +{ +public: + virtual uint64_t address() const = 0; + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const = 0; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const = 0; +}; + +class IObjcMethodList : public ObjectList<IObjcMethod> +{ +public: + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const = 0; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const = 0; +}; + +class IObjcClass : public IObject +{ +public: + virtual uint64_t address() const = 0; + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const = 0; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const = 0; +}; + +class IObjcClassList : public ObjectList<IObjcClass> +{ +public: + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const = 0; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const = 0; +}; + +class IObjcCategory : public IObject +{ +public: + virtual uint64_t address() const = 0; + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const = 0; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const = 0; +}; + +class IObjcCategoryList : public ObjectList<IObjcCategory> +{ +public: + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const = 0; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const = 0; +}; + +class IObjcSelector : public IObject +{ +public: + virtual uint64_t address() const = 0; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const = 0; +}; + +class IObjcSelectorList : public ObjectList<IObjcSelector> +{ +public: + virtual void GetStringReferences(std::set<uint64_t> &address_list) const = 0; +}; + +class IObjcProtocol : public IObject +{ +public: + virtual uint64_t address() const = 0; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const = 0; +}; + +class IObjcProtocolList : public ObjectList<IObjcProtocol> +{ +public: + virtual void GetStringReferences(std::set<uint64_t> &address_list) const = 0; +}; + +class IObjcStorage : public IObject +{ +public: + virtual void ReadFromFile(MacArchitecture &file) = 0; + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const = 0; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const = 0; + virtual std::vector<MacSegment *> segment_list() const = 0; +}; + +class BaseObjcClass : public IObjcClass +{ +public: + BaseObjcClass(IObjcClassList *owner, uint64_t address); + virtual ~BaseObjcClass(); + virtual uint64_t address() const { return address_; } +private: + IObjcClassList *owner_; + uint64_t address_; +}; + +class BaseObjcClassList : public IObjcClassList +{ +public: + virtual void AddObject(IObjcClass *object); + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const; + IObjcClass *GetClassByAddress(uint64_t address) const; +private: + std::map<uint64_t, IObjcClass *> map_; +}; + +class BaseObjcMethod : public IObjcMethod +{ +public: + BaseObjcMethod(IObjcMethodList *owner, uint64_t address); + virtual ~BaseObjcMethod(); + virtual uint64_t address() const { return address_; } +private: + IObjcMethodList *owner_; + uint64_t address_; +}; + +class BaseObjcMethodList : public IObjcMethodList +{ +public: + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const; +}; + +class BaseObjcCategory : public IObjcCategory +{ +public: + BaseObjcCategory(IObjcCategoryList *owner, uint64_t address); + virtual ~BaseObjcCategory(); + virtual uint64_t address() const { return address_; } +private: + IObjcCategoryList *owner_; + uint64_t address_; +}; + +class BaseObjcCategoryList : public IObjcCategoryList +{ +public: + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const; +}; + +class BaseObjcSelector : public IObjcSelector +{ +public: + BaseObjcSelector(IObjcSelectorList *owner, uint64_t address); + virtual ~BaseObjcSelector(); + virtual uint64_t address() const { return address_; } +private: + IObjcSelectorList *owner_; + uint64_t address_; +}; + +class BaseObjcSelectorList : public IObjcSelectorList +{ +public: + virtual void GetStringReferences(std::set<uint64_t> &address_list) const; +}; + +class BaseObjcProtocol : public IObjcProtocol +{ +public: + BaseObjcProtocol(IObjcProtocolList *owner, uint64_t address); + virtual ~BaseObjcProtocol(); + virtual uint64_t address() const { return address_; } +private: + IObjcProtocolList *owner_; + uint64_t address_; +}; + +class BaseObjcProtocolList : public IObjcProtocolList +{ +public: + IObjcProtocol *GetProtocolByAddress(uint64_t address) const; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const; +}; + +enum ObjcMethodType { + mtUnknown, + mtLoad +}; + +class ObjcMethod : public BaseObjcMethod +{ +public: + ObjcMethod(IObjcMethodList *owner, uint64_t address); + void ReadFromFile(MacArchitecture &file); + void GetLoadMethodReferences(std::set<uint64_t> &address_list) const; + void GetStringReferences(std::set<uint64_t> &address_list) const; +private: + OperandSize size_; + uint64_t name_; + uint64_t types_; + uint64_t imp_; + ObjcMethodType type_; +}; + +class ObjcMethodList : public BaseObjcMethodList +{ +public: + ObjcMethodList(); + ObjcMethod *item(size_t index) const; + void ReadFromFile(MacArchitecture &file, uint64_t address); +private: + ObjcMethod *Add(uint64_t address); +}; + +class ObjcClass : public BaseObjcClass +{ +public: + ObjcClass(IObjcClassList *owner, uint64_t address); + ~ObjcClass(); + void ReadFromFile(MacArchitecture &file); + uint64_t isa() const { return isa_; } + uint64_t super_class() const { return super_class_; } + uint64_t info() const { return info_; } + void GetLoadMethodReferences(std::set<uint64_t> &address_list) const; + void GetStringReferences(std::set<uint64_t> &address_list) const; +private: + OperandSize size_; + uint64_t isa_; + uint64_t super_class_; + uint64_t name_; + uint64_t version_; + uint64_t info_; + uint64_t instance_size_; + uint64_t ivars_; + uint64_t methods_; + uint64_t cache_; + uint64_t protocols_; + ObjcMethodList *method_list_; + + // no copy ctr or assignment op + ObjcClass(const ObjcClass &); + ObjcClass &operator =(const ObjcClass &); +}; + +class ObjcClassList : public BaseObjcClassList +{ +public: + ObjcClassList(); + ObjcClass *item(size_t index) const; + void ReadFromFile(MacArchitecture &file, size_t class_count); +private: + ObjcClass *Add(uint64_t address); +}; + +class ObjcCategory: public BaseObjcCategory +{ +public: + ObjcCategory(IObjcCategoryList *owner, uint64_t address); + ~ObjcCategory(); + void ReadFromFile(MacArchitecture &file); + void GetLoadMethodReferences(std::set<uint64_t> &address_list) const; + void GetStringReferences(std::set<uint64_t> &address_list) const; +private: + OperandSize size_; + uint64_t category_name_; + uint64_t class_name_; + uint64_t instance_methods_; + uint64_t class_methods_; + uint64_t protocols_; + ObjcMethodList *method_list_; + ObjcMethodList *class_method_list_; + + // no copy ctr or assignment op + ObjcCategory(const ObjcCategory &); + ObjcCategory &operator =(const ObjcCategory &); +}; + +class ObjcCategoryList : public BaseObjcCategoryList +{ +public: + ObjcCategoryList(); + ObjcCategory *item(size_t index) const; + void ReadFromFile(MacArchitecture &file, size_t category_count); +private: + ObjcCategory *Add(uint64_t address); +}; + +class ObjcSelector : public BaseObjcSelector +{ +public: + ObjcSelector(IObjcSelectorList *owner, uint64_t address); + virtual void GetStringReferences(std::set<uint64_t> &address_list) const; +}; + +class ObjcSelectorList : public BaseObjcSelectorList +{ +public: + ObjcSelectorList(); + void ReadFromFile(MacArchitecture &file); +private: + ObjcSelector *Add(uint64_t address); +}; + +class ObjcProtocolList; + +class ObjcProtocol : public BaseObjcProtocol +{ +public: + ObjcProtocol(ObjcProtocolList *owner, uint64_t address); + void ReadFromFile(MacArchitecture &file); + void GetStringReferences(std::set<uint64_t> &address_list) const; +private: + OperandSize size_; + uint64_t isa_; + uint64_t name_; + uint64_t protocols_; + uint64_t instance_methods_; + uint64_t class_methods_; +}; + +class ObjcProtocolList : public BaseObjcProtocolList +{ +public: + ObjcProtocolList(); + ObjcProtocol *item(size_t index) const; + void ReadFromFile(MacArchitecture &file); +private: + ObjcProtocol *Add(uint64_t address); +}; + +class ObjcStorage : public IObjcStorage +{ +public: + ObjcStorage(); + ~ObjcStorage(); + virtual void ReadFromFile(MacArchitecture &file); + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const; + virtual std::vector<MacSegment *> segment_list() const { return segment_list_; } +private: + ObjcClassList *class_list_; + ObjcCategoryList *category_list_; + ObjcSelectorList *selector_list_; + ObjcProtocolList *protocol_list_; + std::vector<MacSegment *> segment_list_; + + // no copy ctr or assignment op + ObjcStorage(const ObjcStorage &); + ObjcStorage &operator =(const ObjcStorage &); +}; + +class Objc2Method : public BaseObjcMethod +{ +public: + Objc2Method(IObjcMethodList *owner, uint64_t address); + void ReadFromFile(MacArchitecture &file); + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const; +private: + OperandSize size_; + uint64_t name_; + uint64_t types_; + uint64_t imp_; + ObjcMethodType type_; +}; + +class Objc2MethodList : public BaseObjcMethodList +{ +public: + Objc2MethodList(); + Objc2Method *item(size_t index) const; + void ReadFromFile(MacArchitecture &file, uint64_t address); +private: + Objc2Method *Add(uint64_t address); +}; + +class Objc2Class : public BaseObjcClass +{ +public: + Objc2Class(IObjcClassList *owner, uint64_t address); + ~Objc2Class(); + void ReadFromFile(MacArchitecture &file); + uint64_t isa() const { return isa_; } + uint64_t super_class() const { return super_class_; } + void GetLoadMethodReferences(std::set<uint64_t> &address_list) const; + void GetStringReferences(std::set<uint64_t> &address_list) const; +private: + OperandSize size_; + uint64_t isa_; + uint64_t super_class_; + uint64_t cache_; + uint64_t vtable_; + uint64_t data_; + uint32_t flags_; + uint32_t instance_start_; + uint32_t instance_size_; + uint64_t ivar_layout_; + uint64_t name_; + uint64_t base_methods_; + uint64_t base_protocols_; + uint64_t ivars_; + uint64_t protocols_; + uint64_t weak_ivar_layout_; + uint64_t base_properties_; + Objc2MethodList *method_list_; + + // no copy ctr or assignment op + Objc2Class(const Objc2Class &); + Objc2Class &operator =(const Objc2Class &); +}; + +class Objc2ClassList : public BaseObjcClassList +{ +public: + Objc2ClassList(); + Objc2Class *item(size_t index) const; + void ReadFromFile(MacArchitecture &file); +private: + Objc2Class *Add(uint64_t address); +}; + +class Objc2Category: public BaseObjcCategory +{ +public: + Objc2Category(IObjcCategoryList *owner, uint64_t address); + ~Objc2Category(); + void ReadFromFile(MacArchitecture &file); + void GetLoadMethodReferences(std::set<uint64_t> &address_list) const; + void GetStringReferences(std::set<uint64_t> &address_list) const; +private: + OperandSize size_; + uint64_t name_; + uint64_t cls_; + uint64_t instance_methods_; + uint64_t class_methods_; + uint64_t protocols_; + uint64_t instance_properties_; + Objc2MethodList *method_list_; + Objc2MethodList *class_method_list_; + + // no copy ctr or assignment op + Objc2Category(const Objc2Category &); + Objc2Category &operator =(const Objc2Category &); +}; + +class Objc2CategoryList : public BaseObjcCategoryList +{ +public: + Objc2CategoryList(); + Objc2Category *item(size_t index) const; + void ReadFromFile(MacArchitecture &file); +private: + Objc2Category *Add(uint64_t address); +}; + +class Objc2SelectorList : public BaseObjcSelectorList +{ +public: + Objc2SelectorList(); + void ReadFromFile(MacArchitecture &file); +private: + ObjcSelector *Add(uint64_t address); +}; + +class Objc2ProtocolList; + +class Objc2Protocol : public BaseObjcProtocol +{ +public: + Objc2Protocol(Objc2ProtocolList *owner, uint64_t address); + ~Objc2Protocol(); + void ReadFromFile(MacArchitecture &file); + void GetStringReferences(std::set<uint64_t> &address_list) const; +private: + OperandSize size_; + uint64_t isa_; + uint64_t name_; + uint64_t protocols_; + uint64_t instance_methods_; + uint64_t class_methods_; + uint64_t optional_instance_methods_; + uint64_t optional_class_methods_; + uint64_t instance_properties_; + Objc2MethodList *method_list_; + + // no copy ctr or assignment op + Objc2Protocol(const Objc2Protocol &); + Objc2Protocol &operator =(const Objc2Protocol &); +}; + +class Objc2ProtocolList : public BaseObjcProtocolList +{ +public: + Objc2ProtocolList(); + Objc2Protocol *item(size_t index) const; + void ReadFromFile(MacArchitecture &file); + void GetStringReferences(std::set<uint64_t> &address_list) const; +private: + Objc2Protocol *Add(uint64_t address); +}; + +class Objc2MessageList; + +class Objc2Message : public IObject +{ +public: + Objc2Message(Objc2MessageList *owner, uint64_t address); + ~Objc2Message(); + void ReadFromFile(MacArchitecture &file); + void GetStringReferences(std::set<uint64_t> &address_list) const; +private: + Objc2MessageList *owner_; + uint64_t address_; + OperandSize size_; + uint64_t imp_; + uint64_t name_; +}; + +class Objc2MessageList : public ObjectList<Objc2Message> +{ +public: + Objc2MessageList(); + void ReadFromFile(MacArchitecture &file); + void GetStringReferences(std::set<uint64_t> &address_list) const; +private: + Objc2Message *Add(uint64_t address); +}; + +class Objc2Storage : public IObjcStorage +{ +public: + Objc2Storage(); + ~Objc2Storage(); + virtual void ReadFromFile(MacArchitecture &file); + virtual void GetLoadMethodReferences(std::set<uint64_t> &address_list) const; + virtual void GetStringReferences(std::set<uint64_t> &address_list) const; + virtual std::vector<MacSegment *> segment_list() const { return segment_list_; } +private: + Objc2ClassList *class_list_; + Objc2CategoryList *category_list_; + Objc2SelectorList *selector_list_; + Objc2ProtocolList *protocol_list_; + Objc2MessageList *message_list_; + std::vector<MacSegment *> segment_list_; + + // no copy ctr or assignment op + Objc2Storage(const Objc2Storage &); + Objc2Storage &operator =(const Objc2Storage &); +}; + +class Objc : public IObject +{ +public: + Objc(); + ~Objc(); + bool ReadFromFile(MacArchitecture &file); + void GetLoadMethodReferences(std::set<uint64_t> &address_list) const; + void GetStringReferences(std::set<uint64_t> &address_list) const; + std::vector<MacSegment *> segment_list() const; +private: + IObjcStorage *storage_; + + // no copy ctr or assignment op + Objc(const Objc &); + Objc &operator =(const Objc &); +}; + +#endif
\ No newline at end of file |