772 lines
18 KiB
C
772 lines
18 KiB
C
|
#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
|