16.03.2013 Views

dynamic-code-injection

dynamic-code-injection

dynamic-code-injection

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

!<br />

// Dynamic Code Injection!<br />

// in iOS Applications!<br />

//!<br />

// Created by Paul Taykalo on 14-03-13.!<br />

//!<br />

#import !<br />

Dynamic Code Injection !


Dynamic Code Injection!<br />

А что это?!


Dynamic Code Injection!<br />

! !


Dynamic Code Injection!<br />

!<br />

Debugging!<br />

Hot fixes!<br />

Hacks!<br />

Tweaks!


Dynamic Code Injection!<br />

!<br />

J!


Как<br />

исправляются<br />

баги?*!


Как исправляются баги!


Как исправляются баги!


Как исправляются баги!


Как исправляются баги!


Как исправляются баги!


Как исправляются баги!


Как исправляются баги!


Как исправляются баги!


Как исправляются баги!


На что тратится<br />

время?!


На что тратится время?!<br />

Сборка!<br />

Компиляция!<br />

Ресурсы!<br />

Зависимости!


На что тратится время?!


На что тратится время?!<br />

Запуск!<br />

Воспроизведение !<br />

!<br />

Чаще всего -<br />

ручная работа!


Как воспроизвести<br />

ситуацию, в<br />

которой возникают<br />

ошибки?!


Как уменьшить<br />

время на<br />

воспроизведение<br />

ошибки?!


Code !<br />

Injection !


А ведь можно<br />

было просто …!


• Тесты!<br />

• Модульность!<br />

• Mock’и!<br />

• 1001 способ!


Code !<br />

Injection !


DCI Tools!<br />

DYCI!<br />

Injection !<br />

for X<strong>code</strong>!


DCI Tools!<br />

DYCI!<br />

Injection !<br />

for X<strong>code</strong>!


DCI Tools!<br />

Как это<br />

работает?!


Как это работает?!


Как это работает?!<br />

!


Как это работает?!<br />

!<br />

!


Как это работает?!<br />

!<br />

!<br />

!


Подмена!


Подмена!<br />

class_replaceMethod(!<br />

!originalClass, !<br />

!selector, !<br />

!injectedImplementation, !<br />

!types!<br />

);!


Подмена!<br />

ресурсов!


Инъекция!


Инъекция!


Инъекция!


Инъекция!<br />

FileSystem Watchers!<br />

!<br />

HTTP Server/Sockets!


Перекомпиляция!


Перекомпиляция!<br />

!


Перекомпиляция!<br />

!<br />

!


Перекомпиляция!<br />

!<br />

!<br />

!


Строка компиляции!


-x!<br />

objective-c!<br />

-arch!<br />

i386!<br />

-fmessage-length=0!<br />

-std=gnu99!<br />

-Wno-trigraphs!<br />

-fpascal-strings!<br />

-O0!<br />

-Wno-missing-field-initializers!<br />

-Wmissing-prototypes!<br />

-Wreturn-type!<br />

-Wno-implicit-atomic-properties!<br />

-Wno-receiver-is-weak!<br />

-Wformat!<br />

-Wno-missing-braces!<br />

-Wparentheses!<br />

-Wswitch!<br />

-Wno-unused-function!<br />

-Wno-unused-label!<br />

-Wno-unused-parameter!<br />

-Wunused-variable!<br />

-Wunused-value!<br />

-Wno-empty-body!<br />

-Wno-uninitialized!<br />

-Wno-unknown-pragmas!<br />

-Wno-shadow!<br />

-Wno-four-char-constants!<br />

-Wno-conversion!<br />

-Wno-constant-conversion!<br />

-Wno-int-conversion!<br />

-Wno-enum-conversion!<br />

-Wno-shorten-64-to-32!<br />

-Wpointer-sign!<br />

-Wno-newline-eof!<br />

-Wno-selector!<br />

-Wno-strict-selector-match!<br />

-Wno-undeclared-selector!<br />

-Wno-deprecated-implementations!<br />

-DDEBUG=1!<br />

-DSIDEBUG=1!<br />

-DTTMAXLOGLEVEL=5!<br />

-isysroot!<br />

/Applications/X<strong>code</strong>.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk!<br />

-fexceptions!<br />

-fasm-blocks!<br />

-fstrict-aliasing!<br />

-Wprotocol!<br />

-Wdeprecated-declarations!<br />

-g!<br />

-Wno-sign-conversion!<br />

-fobjc-abi-version=2!<br />

-fobjc-legacy-dispatch!<br />

-mios-simulator-version-min=3.0!<br />

-iquote!<br />

/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-generated-files.hmap!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-own-target-headers.hmap!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-all-target-headers.hmap!<br />

-iquote!<br />

/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-project-headers.hmap!<br />

-iquote/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/Three20/src/Three20UI/** /Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/Three20/src/Three20Style!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style/Configurations!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style/Headers!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style/Sources!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style/UnitTests!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style/UnitTests/Resources!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style/UnitTests/Resources/PropertyLists!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/include!<br />

-I/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/socials-library/build/Products/socials!<br />

-I/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/cookbook-library/build/Products/cookbook!<br />

-I/Applications/X<strong>code</strong>.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/usr/include/libxml2!<br />

-I/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/Three20/Build/Products/three20!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Products/socials!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Products/cookbook!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/three20!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/../three20!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/../IntermediateBuildFilesPath/Products/cookbook!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/../IntermediateBuildFilesPath/Products/socials!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../../Headers/socials!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../../Headers/cookbook!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../Headers/socials!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../Headers/cookbook!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/DerivedSources/i386!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/DerivedSources!<br />

-F/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator!<br />

-include!<br />

/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/PrecompiledHeaders/MobileNews-Prefix-aiinsfqqjeowvmdibiqscpcwsbet/MobileNews-Prefix.pch!<br />

-MMD!<br />

-MT!<br />

dependencies!<br />

-MF!<br />

/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/Objects-normal/i386/MN2HTMLNavigationContent.d!<br />

--serialize-diagnostics!<br />

/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/Objects-normal/i386/MN2HTMLNavigationContent.dia!<br />

-c!<br />

/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Classes/v2/config/view/html/MN2HTMLNavigationContent.m!<br />

-o!<br />

/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/Objects-normal/i386/MN2HTMLNavigationContent.o!<br />

/Users/paultaykalo/Projects/_OLD/FHR/MobileNews!<br />

Строка компиляции!


-x!<br />

objective-c!<br />

-arch!<br />

i386!<br />

-fmessage-length=0!<br />

-std=gnu99!<br />

-Wno-trigraphs!<br />

-fpascal-strings!<br />

-O0!<br />

-Wno-missing-field-initializers!<br />

-Wmissing-prototypes!<br />

-Wreturn-type!<br />

-Wno-implicit-atomic-properties!<br />

-Wno-receiver-is-weak!<br />

-Wformat!<br />

-Wno-missing-braces!<br />

-Wparentheses!<br />

-Wswitch!<br />

-Wno-unused-function!<br />

-Wno-unused-label!<br />

-Wno-unused-parameter!<br />

-Wunused-variable!<br />

-Wunused-value!<br />

-Wno-empty-body!<br />

-Wno-uninitialized!<br />

-Wno-unknown-pragmas!<br />

-Wno-shadow!<br />

-Wno-four-char-constants!<br />

-Wno-conversion!<br />

-Wno-constant-conversion!<br />

-Wno-int-conversion!<br />

-Wno-enum-conversion!<br />

-Wno-shorten-64-to-32!<br />

-Wpointer-sign!<br />

-Wno-newline-eof!<br />

-Wno-selector!<br />

-Wno-strict-selector-match!<br />

-Wno-undeclared-selector!<br />

-Wno-deprecated-implementations!<br />

-DDEBUG=1!<br />

-DSIDEBUG=1!<br />

-DTTMAXLOGLEVEL=5!<br />

-isysroot!<br />

/Applications/X<strong>code</strong>.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk!<br />

-fexceptions!<br />

-fasm-blocks!<br />

-fstrict-aliasing!<br />

-Wprotocol!<br />

-Wdeprecated-declarations!<br />

-g!<br />

-Wno-sign-conversion!<br />

-fobjc-abi-version=2!<br />

-fobjc-legacy-dispatch!<br />

-mios-simulator-version-min=3.0!<br />

-iquote!<br />

/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-generated-files.hmap!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-own-target-headers.hmap!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-all-target-headers.hmap!<br />

-iquote!<br />

/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-project-headers.hmap!<br />

-iquote/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/Three20/src/Three20UI/** /Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/Three20/src/Three20Style!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style/Configurations!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style/Headers!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style/Sources!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style/UnitTests!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style/UnitTests/Resources!<br />

-iquoteLibs/core/Libs/Three20/src/Three20Style/UnitTests/Resources/PropertyLists!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/include!<br />

-I/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/socials-library/build/Products/socials!<br />

-I/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/cookbook-library/build/Products/cookbook!<br />

-I/Applications/X<strong>code</strong>.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/usr/include/libxml2!<br />

-I/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/Three20/Build/Products/three20!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Products/socials!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Products/cookbook!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/three20!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/../three20!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/../IntermediateBuildFilesPath/Products/cookbook!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/../IntermediateBuildFilesPath/Products/socials!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../../Headers/socials!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../../Headers/cookbook!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../Headers/socials!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../Headers/cookbook!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/DerivedSources/i386!<br />

-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/DerivedSources!<br />

-F/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator!<br />

-include!<br />

/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/PrecompiledHeaders/MobileNews-Prefix-aiinsfqqjeowvmdibiqscpcwsbet/MobileNews-Prefix.pch!<br />

-MMD!<br />

-MT!<br />

dependencies!<br />

-MF!<br />

/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/Objects-normal/i386/MN2HTMLNavigationContent.d!<br />

--serialize-diagnostics!<br />

/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/Objects-normal/i386/MN2HTMLNavigationContent.dia!<br />

-c!<br />

/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Classes/v2/config/view/html/MN2HTMLNavigationContent.m!<br />

-o!<br />

/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/Objects-normal/i386/MN2HTMLNavigationContent.o!<br />

/Users/paultaykalo/Projects/_OLD/FHR/MobileNews!<br />

Строка компиляции!<br />

~100 строк!<br />

~7 Kb!


Перекомпиляция в DYCI!<br />

!


Перекомпиляция в DYCI!<br />

!<br />

!


Перекомпиляция в DYCI!<br />

!<br />

!


Перекомпиляция в DYCI!<br />

!<br />

!<br />

!


Перекомпиляция в DYCI!<br />

!<br />

! !<br />

!


Инъекция в DYCI!


Инъекция в DYCI!


Инъекция в DYCI!


Инъекция в DYCI!


Инъекция в DYCI!<br />

!


Инъекция в DYCI!<br />

!


Инъекция в DYCI!<br />

!


Подмена в DYCI!


Подмена в DYCI!<br />

class_replaceMethod(!<br />

!originalClass, !<br />

!selector, !<br />

!injectedImplementation, !<br />

!types!<br />

);!


Profit!!


“Example”!


- (void)updateOnClassInjection {!<br />

[self setBackgroundColor:!<br />

[UIColor redColor]!<br />

];!<br />

}!


^X!<br />

- (void)updateOnClassInjection {!<br />

[self setBackgroundColor:!<br />

[UIColor redColor]!<br />

];!<br />

}!


^X!<br />

- (void)updateOnClassInjection {!<br />

[self setBackgroundColor:!<br />

[UIColor redColor]!<br />

];!<br />

}!


На практике чаще всего!<br />

Работа с UI!<br />

цвета, шрифты, тени, !<br />

сложный layout, !<br />

сложная анимация!


На практике реже!<br />

XIB UI!<br />

Мелкий тюнинг!<br />

Поиск причин ошибок!<br />

Logging OFF / Logging ON!


На практике время от времени!<br />

Работа с UI : !<br />

цвета, шрифты, тени,<br />

сложный layout, сложная<br />

анимация!


На практике!


Ресурсы!


UIImage Cache!<br />

NSBundle Cache!


Update On !<br />

Class/Resource!<br />

Injection!


!<br />

!


dyci<br />

Видео :)<br />

http://www.youtube.com/watch?<br />

v=8nyEpAqUug4


Спасибо за<br />

внимание!<br />

Павел Тайкало!<br />

Компания : Stanfy!<br />

ptaykalo@stanfy.com.ua !


Dynamic Code Injection<br />

Павел Тайкало!<br />

Компания : Stanfy!<br />

ptaykalo@stanfy.com.ua !

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!