А можно какое-то сравнение z-wave, zigbee, bt 4.0 le? Хотя бы вкратце? Потому как тоже смотрю в сторону home automation, и тут столько вариантов, что глаза разбегаются.
Вкратце – вы живете на деньги, полученные в прошлом месяце, и планируете куда потратить деньги в следующем (по большему счету, если у вас нет кредитной карты – то вы всегда так и жили). Интересный момент это то, что важно бюджетировать все деньги на конкретные цели, а прогноз помогает анализировать ситуацию.
Скопировать файлы приложения туда, где их найдет Springboard – это совершенно не проблема. Проблема только с цифровой подписью, а обойти ее уже существенно проблематичнее. Если конечно этот механизм не был отключен целиком во время джейла.
Дело в том, что у остальных секций иногда есть легитимные права на изменения (и да, там не ELF, там Mach-O, но не суть). Но идея в библиотеке без __text просто шикарна, конечно.
Часто при эксплуатации уязвимостей приходится перебирать какой-нибудь параметр
Это вы о «fuzzing». В данном случае, ASLR к эксплойту не имеет отношения. ASLR вообще защищает от «повреждений памяти», например buffer overrun. Защита обеспечивается тем, что мы имеем возможность выполнить буквально несколько инструкций, и мы не знаем внутреннее состояние процесса (где в памяти что лежит).
TL;DR: Статья очень плохая, потому что внутри мешанина всех и вся. Кроме того,
хотя знание С было заявлено как не нужное, а дальше идет куча ляпов из-за не
знания С.
Автору – вы учитесь и на правильном пути. копните глубже в фундаментальные вещи,
это позволит вам лучше понять природу вещей. Ничего в программировании не
происходит «автоматически». Докапывайтесь до причин, это весьма полезные знания.
> Начало: метод класса и метод экземпляра
Интересное «начало», учитывая какие темы рассматриваются дальше.
> Класс для Objective-C, часто можно интерпретировать как объект и наоборот
Очень сложное к пониманию предложение.
> есть классы, которые нельзя назвать объектами. Они называются «протоколы»
Протокол нельзя «создать», потому в данном случае сравнение не корректно.
> Различие состоит в том, что «протокол» не может иметь подкласс или дочерний
> объект
То что вы не сталкивались с иерархией в протоколах, не значит, чо ее нет ;-)
И да, «дочернего объекта» у протокола может и не быть. Но можно «привести» тип
объекта к протоколу.
> Вот те методы, которые со знаком "-" мы активно применяем как в отношении
> объектов — экземпляров класса, так и отношении самого класса
Нет, методы с "-" нельзя применять к классу.
> Любой другой объект в Objective-C по определению — потомок NSObject
Нет. И да, я понимаю что вы пытаетесь написать статью для новичков, но новички
с заведомо ложными убеждениями – это большая проблема для нас в будущем.
> NSResponder’а тоже могут быть дочерние объекты
Наверно дочерние классы?
> выделяет для него место в ОЗУ
Выделяет место в ОЗУ как раз таки +alloc, а не -init.
> выделил для него такой адрес в памяти
> 0x000000000
У вас только что зафейлился malloc, сопротивление бесполезно. В качестве примера
указателя лучше использовать что-то с живыми цифрами.
> Вы будете удивлены тем, чему равняется Ваше «i»
Не буду удивлен. А почему? А потому что я знаю как работает стек. Знать про стек
в языках основанных на С – полезно. Иногда полезнее, чем уметь создавать
сабклассы табличек с кнопочками в ячейках.
> Также будет создан экземпляр объекта «isa»
Нет. isa – это указатель на структуру класса. Она уже создана рантаймом (еще во
время линковки).
> То есть теоретически объект уже есть после применения метода «alloc»
Он практически «есть». Но «существовать» – не значит «быть готовым к
использованию».
> потому что он вроде как есть, но в принципе он равен «nil»
Он не равен nil, я вам точно говорю.
> В файле «Primus.h» объявлены методы:
Не совсем понятно куда пропали ± ил примера. Он не нагляден.
> В отличие от некоторых других языков программирования в Objective-C методы не
> вызываются, а посылаются объектам
Это предложение, в контексте параграфа, лишено смысла, так как не объясняет, в
чем, собственно, разница.
> Скажем это «слабый» тип объекта
Не стоит так говорить, потому что будет сложно ответить на вопрос, что такое
"__weak id".
> Что такое «void»?
void – это тип данных, который фактически обозначает «тут ничего нет». Нельзя
объявить переменную «void» – потому что в ней ничего не будет. Но можно объявить
указатель «void *» – потому что переменная хранит адрес, а вот адрес чего, ее
уже как-то не так сильно волнует. Фактически проблема будет только если этот
указатель разименовать.
Методы возвращают «void» когда они, собственно, не возвращают ничего. В паскале
для них есть отдельный термин – процедура, но обычно ЯП на такое не
размениваются.
> Но не в конце
return можно писать и в конце (хотя в этом и мало смысла, да). Но метод, который
возвращает void не может содержвать в себе код «return XXX;», потому что все что
программист напишет в XXX – осязаемо и имеет смысл.
> Что такое «self»?
Очевидно это указатель на текущий объект в контексте. Или на класс (т.к. класс
тоже объект). Но вы не рассмотрели указатели, потому что они слишком
фундаментальны и принадлежат миру С, так что приходится выкручиваться.
А еще стоило бы сказать про канонические аргументы self и _cmd в любом IMP и все
стало бы проще.
> if (!myPrimus){
в контексте инициализатора в Objective-C эта проверка лишена смысла. Проверяют,
обычно, что [super init] не вернул nil (эта ситуация на самом деле крайне редка
и сейчас больше дань традиции). В вашем коде проверяется что +alloc не вернул
nil, но если он вернул nil, у вас есть намного более существенные проблемы, о
которых надо волноваться в данный момент.
> Для того, чтобы понять можно ли написать «self» или нельзя
В лобом методе можно писать self.
> casserolAndPan:(NSArray)pan
NSArray * же.
> Если есть переменная, например «variable», то задать ей нужное значение можно
> через префикс «set»
Задать значение переменной можно через оператор "->"
self->temperature = 500;
Но опять же, для этого надо знать немного С, что бы понимать указатели и что
происходит.
> Это можно производить не только через свойства, но и через доступ к ним по
> принципу ключ-значение
KVC в статье, где рассказывается про базовое ООП, как-то несколько лишнее.
> Понятие «runtime» можно охарактеризовать
Нет. Runtime – это дословно «среда исполнения». Это тот код, который выполняет
все то, что в вашем коде остается «за кадром». Этот код, фактически, выполняет
все те «магические» штуки. И не важно, на чем он написан. В случае с
Objective-C, там есть и C++, а у C++ есть свой рантайм.
> [myPrimus initWithGas:gelium temperature:nil];
второй аргумент – это NSInteger, пишите типы корректно.
> Единственная его переменная
NSObject – он не такой простой.
> Затем присвоить ему „nil“, для того чтобы он не взял случайный адрес в памяти. Конструкция
> static dispatch_once_t predicate;
Значит объекту nil надо присваивать, а предикату – нет? А как он тогда работает?
И снова надо копать в С, и в static, и в то, что статические переменные при
запуске приложения будут обнулены.
> [super allocWithZone:nil]
Ну зачем вы еще +allocWithZone: вытащили, +alloc мало?
> опять же присваивая ему «nil» в качестве адреса размещения
Откуда у вас эти идеи берутся? Наверно, от того что вы продолжаете игнорировать
наследие С? PAGEZERO например, сегмент, который применяется для первой страницы
в виртуальном адресном пространстве что бы ловить «бажные» нулевые указатели.
> Методы протоколов Вы не посылаете своему объекту
Что мешает вам это делать? Это вообще нормальное использование протоколов.
> Внутри любого метода протокола может быть любой метод класса
О чем это?
> То есть, метод протокола — это контейнер, в котором находятся любые другие
> методы, собственно как и любой реализуемый Вами метод
Я даже не могу прокомментировать, просто не понятно, что происходит.
> К примеру, нужно сделать так, чтобы Ваша формочка делала что-то, при
> определённых условиях
Формочка – это наследие делфи? Раз уж было упомянуто MVC, то и остальную
терминологию стоило бы причесать.
Нативный __weak не работает (вернее работает, но как __unsafe_unretained, ссылаясь на мусор).
Но, MAZeroingWeakRef работает отлично! (как только у него оторвать «фиксы» для использования нативных методов)
Еще есть интересная плюшка с необнулением объектов – RM все кидает в autorelease pool, а создать свой нельзя (потому что он тоже кидает его в авторелиз :) ). Решается так:
id Autoreleased(id(^block)(void))
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id ret = block();
[pool release];
return ret;
}
Вкратце – вы живете на деньги, полученные в прошлом месяце, и планируете куда потратить деньги в следующем (по большему счету, если у вас нет кредитной карты – то вы всегда так и жили). Интересный момент это то, что важно бюджетировать все деньги на конкретные цели, а прогноз помогает анализировать ситуацию.
Если СМС только по РФ – то надо бы сделать часть с +7 не редактируемой.
Если международные – то надо бы дать возможность ввести международный номер.
Достойный мод чтобы игралось интереснее.
Это вы о «fuzzing». В данном случае, ASLR к эксплойту не имеет отношения. ASLR вообще защищает от «повреждений памяти», например buffer overrun. Защита обеспечивается тем, что мы имеем возможность выполнить буквально несколько инструкций, и мы не знаем внутреннее состояние процесса (где в памяти что лежит).
Нет, тут скорее вопрос побега из «песочницы». Права у фалов бекапа вообще не проверяются.
Да, скорее всего.
хотя знание С было заявлено как не нужное, а дальше идет куча ляпов из-за не
знания С.
Автору – вы учитесь и на правильном пути. копните глубже в фундаментальные вещи,
это позволит вам лучше понять природу вещей. Ничего в программировании не
происходит «автоматически». Докапывайтесь до причин, это весьма полезные знания.
> Начало: метод класса и метод экземпляра
Интересное «начало», учитывая какие темы рассматриваются дальше.
> Класс для Objective-C, часто можно интерпретировать как объект и наоборот
Очень сложное к пониманию предложение.
> есть классы, которые нельзя назвать объектами. Они называются «протоколы»
Протокол нельзя «создать», потому в данном случае сравнение не корректно.
> Различие состоит в том, что «протокол» не может иметь подкласс или дочерний
> объект
То что вы не сталкивались с иерархией в протоколах, не значит, чо ее нет ;-)
И да, «дочернего объекта» у протокола может и не быть. Но можно «привести» тип
объекта к протоколу.
> Вот те методы, которые со знаком "-" мы активно применяем как в отношении
> объектов — экземпляров класса, так и отношении самого класса
Нет, методы с "-" нельзя применять к классу.
> Любой другой объект в Objective-C по определению — потомок NSObject
Нет. И да, я понимаю что вы пытаетесь написать статью для новичков, но новички
с заведомо ложными убеждениями – это большая проблема для нас в будущем.
> NSResponder’а тоже могут быть дочерние объекты
Наверно дочерние классы?
> выделяет для него место в ОЗУ
Выделяет место в ОЗУ как раз таки +alloc, а не -init.
> выделил для него такой адрес в памяти
> 0x000000000
У вас только что зафейлился malloc, сопротивление бесполезно. В качестве примера
указателя лучше использовать что-то с живыми цифрами.
> Вы будете удивлены тем, чему равняется Ваше «i»
Не буду удивлен. А почему? А потому что я знаю как работает стек. Знать про стек
в языках основанных на С – полезно. Иногда полезнее, чем уметь создавать
сабклассы табличек с кнопочками в ячейках.
> Также будет создан экземпляр объекта «isa»
Нет. isa – это указатель на структуру класса. Она уже создана рантаймом (еще во
время линковки).
> То есть теоретически объект уже есть после применения метода «alloc»
Он практически «есть». Но «существовать» – не значит «быть готовым к
использованию».
> потому что он вроде как есть, но в принципе он равен «nil»
Он не равен nil, я вам точно говорю.
> В файле «Primus.h» объявлены методы:
Не совсем понятно куда пропали ± ил примера. Он не нагляден.
> В отличие от некоторых других языков программирования в Objective-C методы не
> вызываются, а посылаются объектам
Это предложение, в контексте параграфа, лишено смысла, так как не объясняет, в
чем, собственно, разница.
> Скажем это «слабый» тип объекта
Не стоит так говорить, потому что будет сложно ответить на вопрос, что такое
"__weak id".
> Что такое «void»?
void – это тип данных, который фактически обозначает «тут ничего нет». Нельзя
объявить переменную «void» – потому что в ней ничего не будет. Но можно объявить
указатель «void *» – потому что переменная хранит адрес, а вот адрес чего, ее
уже как-то не так сильно волнует. Фактически проблема будет только если этот
указатель разименовать.
Методы возвращают «void» когда они, собственно, не возвращают ничего. В паскале
для них есть отдельный термин – процедура, но обычно ЯП на такое не
размениваются.
> Но не в конце
return можно писать и в конце (хотя в этом и мало смысла, да). Но метод, который
возвращает void не может содержвать в себе код «return XXX;», потому что все что
программист напишет в XXX – осязаемо и имеет смысл.
> Что такое «self»?
Очевидно это указатель на текущий объект в контексте. Или на класс (т.к. класс
тоже объект). Но вы не рассмотрели указатели, потому что они слишком
фундаментальны и принадлежат миру С, так что приходится выкручиваться.
А еще стоило бы сказать про канонические аргументы self и _cmd в любом IMP и все
стало бы проще.
> if (!myPrimus){
в контексте инициализатора в Objective-C эта проверка лишена смысла. Проверяют,
обычно, что [super init] не вернул nil (эта ситуация на самом деле крайне редка
и сейчас больше дань традиции). В вашем коде проверяется что +alloc не вернул
nil, но если он вернул nil, у вас есть намного более существенные проблемы, о
которых надо волноваться в данный момент.
> Для того, чтобы понять можно ли написать «self» или нельзя
В лобом методе можно писать self.
> casserolAndPan:(NSArray)pan
NSArray * же.
> Если есть переменная, например «variable», то задать ей нужное значение можно
> через префикс «set»
Задать значение переменной можно через оператор "->"
self->temperature = 500;
Но опять же, для этого надо знать немного С, что бы понимать указатели и что
происходит.
> Это можно производить не только через свойства, но и через доступ к ним по
> принципу ключ-значение
KVC в статье, где рассказывается про базовое ООП, как-то несколько лишнее.
> Понятие «runtime» можно охарактеризовать
Нет. Runtime – это дословно «среда исполнения». Это тот код, который выполняет
все то, что в вашем коде остается «за кадром». Этот код, фактически, выполняет
все те «магические» штуки. И не важно, на чем он написан. В случае с
Objective-C, там есть и C++, а у C++ есть свой рантайм.
> [myPrimus initWithGas:gelium temperature:nil];
второй аргумент – это NSInteger, пишите типы корректно.
> Единственная его переменная
NSObject – он не такой простой.
> Затем присвоить ему „nil“, для того чтобы он не взял случайный адрес в памяти. Конструкция
> static dispatch_once_t predicate;
Значит объекту nil надо присваивать, а предикату – нет? А как он тогда работает?
И снова надо копать в С, и в static, и в то, что статические переменные при
запуске приложения будут обнулены.
> [super allocWithZone:nil]
Ну зачем вы еще +allocWithZone: вытащили, +alloc мало?
> опять же присваивая ему «nil» в качестве адреса размещения
Откуда у вас эти идеи берутся? Наверно, от того что вы продолжаете игнорировать
наследие С? PAGEZERO например, сегмент, который применяется для первой страницы
в виртуальном адресном пространстве что бы ловить «бажные» нулевые указатели.
> Методы протоколов Вы не посылаете своему объекту
Что мешает вам это делать? Это вообще нормальное использование протоколов.
> Внутри любого метода протокола может быть любой метод класса
О чем это?
> То есть, метод протокола — это контейнер, в котором находятся любые другие
> методы, собственно как и любой реализуемый Вами метод
Я даже не могу прокомментировать, просто не понятно, что происходит.
> К примеру, нужно сделать так, чтобы Ваша формочка делала что-то, при
> определённых условиях
Формочка – это наследие делфи? Раз уж было упомянуто MVC, то и остальную
терминологию стоило бы причесать.
Нативный __weak не работает (вернее работает, но как __unsafe_unretained, ссылаясь на мусор).
Но, MAZeroingWeakRef работает отлично! (как только у него оторвать «фиксы» для использования нативных методов)
Еще есть интересная плюшка с необнулением объектов – RM все кидает в autorelease pool, а создать свой нельзя (потому что он тоже кидает его в авторелиз :) ). Решается так: