Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Знакомство с 
codesign 
Гуменный Руслан
Подписывание кода 
• гарантировать то, что код не был изменен 
• идентифицировать источник кода (разработчика 
или того, к...
Public Key Cryptography 
Суть шифрования с открытым ключом заключается в том, 
что для шифрования данных используется один...
Сертификат
Сертификат 
публичный ключ + описание
Сертификат
RSA 
• данные зашифрованные при помощи открытого 
ключа, могут быть расшифрованы только при 
помощи закрытого 
• данные за...
Цифровая подпись 
Сочетание зашифрованной контрольной суммы (digest) и 
цифрового сертификата
Проверка цифровой 
подписи
Provisioning profile 
Назначение — не допустить запуск кода не разрешенного 
Apple 
• связывает разработчиков и устройства...
Provisioning profile 
Внутри лежит xml, который можно извлечь командой: 
cms -D -i embedded.mobileprovision
Provisioning profile 
<key>DeveloperCertificates</key> 
<array> 
<data>…</data> 
</array> 
<key>Entitlements</key> 
<dict>...
Поле DeveloperCertificates 
-----BEGIN CERTIFICATE----- 
MIIFmTC.... 
-----END CERTIFICATE----- 
openssl x509 -text -in tm...
Что нужно для подписи 
• developer или distribution сертификат 
• приватный ключ для сертификата 
• provisioning profile в...
Что подписываем 
• бинарник основного приложения 
• динамические библиотеки
IPA 
unzip Orders -d Payload
IPA 
Интересные файлы: 
• embedded.mobileprovision 
• PkgInfo 
• _CodeSignature/CodeResources 
• ResourcesRules.plist
PkgInfo 
Является наследием OS X 
Содержит байты {65, 80, 80, 76, 63, 63, 63, 63} 
или строку "APPL????"
CodeResources … 
<dict> 
<key>files</key> 
<dict> 
<key>AppIcon60x60@2x.png</key> 
<data> 
LuxPgpygBTlxoj9r3S14ZCEdwU8= 
<...
ResourceRules.plist 
… 
<dict> 
<key>rules</key> 
<dict> 
<key>.*</key> 
<true/> 
<key>Info.plist</key> 
<dict> 
<key>omit...
Бинарный файл 
• Fat binary (склейка нескольких архитектур, 
armv7, armv7s, arm64) 
• Мach-O (описывает одну архитектуру) ...
Fat
Mach-O 
• mach-O состоит из секций 
• подпись лежит в секции LC_CODE_SIGNATURE 
• подпись тоже состоит из секций, которые ...
Blobs 
• Requirements 
• Entitlements 
• Code Directory 
• CMS
Requirements Blob 
• размер 12 байт 
• хранит magic-строку
Entitlements Blob 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http:// 
...
Code Directory Blob 
• хеш от entitlements blob 
• хеш от requirements blob 
• хеш файла CodeResources 
• хеш файл Info.pl...
CMS Blob 
• Цифровая подпись (зашифрованный хеш + 
сетрификат) для Code Directory Blob
Команда codesign 
Команда codesign используется для создания, 
проверки и отображения подписей кода. 
http://opensource.ap...
Утилита codesign 
Подписать сборку: 
codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 "Payload/ 
Apts.app/Apts" 
-f...
Типовые задачи 
• проверить, что AdHoc сборка может запускаться 
на устройстве 
• переподписать сборку с новым сертификато...
Проверка IPA 
• распаковать ipa как zip файл 
• открыть файл embedded.mobileprovision и найти 
секцию ProvisionedDevices 
...
Проверка IPA 
Установить плагин для Quick Look 
https://github.com/chockenberry/Provisioning 
https://github.com/ealeksand...
Переподписывание сборки 
• распаковать IPA 
• заменить файл embedded.mobileprovision тем, 
который будет подходить для при...
Переподписывание сборки 
#!/bin/sh 
rm Application.resigned.ipa 
rm -rf output 
mkdir output 
unzip ipa/Apts.ipa -d output...
Внедрение кода 
• 6-й xCode позволяет собирать динамические 
библиотеки для iOS (раньше надо было править 
конфигурационны...
Внедрение кода 
Чтобы не указывать абсолютный путь, можно использовать 
@executable_path/inferno.dylib
Внедрение кода 
• распаковать IPA 
• заменить файл embedded.mobileprovision тем, который будет 
подходить для приватного к...
Внедрение кода 
#!/bin/sh 
rm Application.resigned.ipa 
rm -rf output 
mkdir output 
unzip ipa/Apts.ipa -d output/extracte...
IPA из AppStore 
• зашифрованные 
• можно расшифровать при помощи устройства с 
jailbreak используя Clutch 
• после расшиф...
IPA из AppStore
Спасибо за внимание 
fanruten@gmail.com 
ruslan.gumenniy@e-legion.com
Upcoming SlideShare
Loading in …5
×

#MBLTdev: Знакомство с codesign (e-Legion)

964 views

Published on

#MBLTdev: Конференция мобильных разработчиков
Спикер: Руслан Гуменный
iOS-разработчик, e-Legion
http://mbltdev.ru/

Published in: Mobile
  • Login to see the comments

#MBLTdev: Знакомство с codesign (e-Legion)

  1. 1. Знакомство с codesign Гуменный Руслан
  2. 2. Подписывание кода • гарантировать то, что код не был изменен • идентифицировать источник кода (разработчика или того, кто его подписал) • определить, что код имеет право выполнять определенные задачи (доступ в keychain, доступ в iCloud, …)
  3. 3. Public Key Cryptography Суть шифрования с открытым ключом заключается в том, что для шифрования данных используется один ключ (открытый), а для расшифрования другой (закрытый) (поэтому такие системы часто называют ассиметричными).
  4. 4. Сертификат
  5. 5. Сертификат публичный ключ + описание
  6. 6. Сертификат
  7. 7. RSA • данные зашифрованные при помощи открытого ключа, могут быть расшифрованы только при помощи закрытого • данные зашифрованные при помощи закрытого ключа, могут быть расшифрованы только при помощи открытого
  8. 8. Цифровая подпись Сочетание зашифрованной контрольной суммы (digest) и цифрового сертификата
  9. 9. Проверка цифровой подписи
  10. 10. Provisioning profile Назначение — не допустить запуск кода не разрешенного Apple • связывает разработчиков и устройства c командой (Development Team) • определяет, что может делать код (entitlements) • формируется Apple и изначально подписан
  11. 11. Provisioning profile Внутри лежит xml, который можно извлечь командой: cms -D -i embedded.mobileprovision
  12. 12. Provisioning profile <key>DeveloperCertificates</key> <array> <data>…</data> </array> <key>Entitlements</key> <dict> <key>com.apple.developer.team-identifier</key> <string>6TWG7MTXRP</string> <key>get-task-allow</key> <true/> </dict> <key>ProvisionedDevices</key> <array> <string>324a5b08c19f3f8f3c2d65e9432be21069e47e41</string> </array> developer/distribution certificates (.cer file) в base64
  13. 13. Поле DeveloperCertificates -----BEGIN CERTIFICATE----- MIIFmTC.... -----END CERTIFICATE----- openssl x509 -text -in tmp.pem.
  14. 14. Что нужно для подписи • developer или distribution сертификат • приватный ключ для сертификата • provisioning profile в котором есть используемый сертификат
  15. 15. Что подписываем • бинарник основного приложения • динамические библиотеки
  16. 16. IPA unzip Orders -d Payload
  17. 17. IPA Интересные файлы: • embedded.mobileprovision • PkgInfo • _CodeSignature/CodeResources • ResourcesRules.plist
  18. 18. PkgInfo Является наследием OS X Содержит байты {65, 80, 80, 76, 63, 63, 63, 63} или строку "APPL????"
  19. 19. CodeResources … <dict> <key>files</key> <dict> <key>AppIcon60x60@2x.png</key> <data> LuxPgpygBTlxoj9r3S14ZCEdwU8= </data> <key>Assets.car</key> <data> dJ4xkjYAgGJQMKMCXZOe3q8FgBA= …. </dict> <key>rules</key> <dict> <key>.*</key> <true/> <key>Info.plist</key> SHA-1 hashes
  20. 20. ResourceRules.plist … <dict> <key>rules</key> <dict> <key>.*</key> <true/> <key>Info.plist</key> <dict> <key>omit</key> <true/> <key>weight</key> <real>10</real> </dict> <key>ResourceRules.plist</key> <dict> <key>omit</key> <true/> <key>weight</key> <real>100</real> </dict> </dict> </dict> …
  21. 21. Бинарный файл • Fat binary (склейка нескольких архитектур, armv7, armv7s, arm64) • Мach-O (описывает одну архитектуру) • Каждая архитектура подписывается отдельно
  22. 22. Fat
  23. 23. Mach-O • mach-O состоит из секций • подпись лежит в секции LC_CODE_SIGNATURE • подпись тоже состоит из секций, которые называются blobs
  24. 24. Blobs • Requirements • Entitlements • Code Directory • CMS
  25. 25. Requirements Blob • размер 12 байт • хранит magic-строку
  26. 26. Entitlements Blob <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http:// www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.developer.team-identifier</key> <string>6TWG7MTXRP</string> <key>keychain-access-groups</key> <array> <string>6TWG7MTXRP.*</string> </array> <key>application-identifier</key> <string>6TWG7MTXRP.*</string> <key>get-task-allow</key> <true/> </dict> </plist>
  27. 27. Code Directory Blob • хеш от entitlements blob • хеш от requirements blob • хеш файла CodeResources • хеш файл Info.plist • набор хешей бинарника разбитого на секции по 4096 байт
  28. 28. CMS Blob • Цифровая подпись (зашифрованный хеш + сетрификат) для Code Directory Blob
  29. 29. Команда codesign Команда codesign используется для создания, проверки и отображения подписей кода. http://opensource.apple.com/tarballs/ • security_systemkeychain/ • libsecurityd • libsecurity_utilities • libsecurity_cdsa_client • libsecurity_cdsa_utilities • libsecurity_codesigning
  30. 30. Утилита codesign Подписать сборку: codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 "Payload/ Apts.app/Apts" -f удалять существующую подпись -s идентификатор сертификата (developer/distribution) Получить список идентификаторов: security find-identity -v -p codesigning 1) D5B28E0000920A4C86ED025CBEA94AF8FA88755D "iPhone Developer: Ruslan Gumenniy (J362LCRMQS)" 2) 60855F0569C7595362202CDDE4E5B1671A1E86CC "iPhone Distribution: e-Legion (96GT47C53G)" 3) 5BB0183A7B66911A2E36D75E26137456B3A90258 "iPhone Developer: Ruslan Gumenniy (9P8FPFW4PQ)"
  31. 31. Типовые задачи • проверить, что AdHoc сборка может запускаться на устройстве • переподписать сборку с новым сертификатом • внедрить свой код
  32. 32. Проверка IPA • распаковать ipa как zip файл • открыть файл embedded.mobileprovision и найти секцию ProvisionedDevices • убедиться, что в секции ProvisionedDevices есть UDID устройства на которое производится установка
  33. 33. Проверка IPA Установить плагин для Quick Look https://github.com/chockenberry/Provisioning https://github.com/ealeksandrov/ProvisionQL
  34. 34. Переподписывание сборки • распаковать IPA • заменить файл embedded.mobileprovision тем, который будет подходить для приватного ключа используемого при переподписи • удалить файл CodeResources • взывать codesign • запаковать в ZIP и изменить расширение на IPA
  35. 35. Переподписывание сборки #!/bin/sh rm Application.resigned.ipa rm -rf output mkdir output unzip ipa/Apts.ipa -d output/extracted > /dev/null 2>&1 rm -rf Payload/*.app/_CodeSignature 2> /dev/null | true /usr/bin/codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 "Payload/ Apts.app/Apts" /usr/bin/xcrun -sdk iphoneos PackageApplication -v Payload/*.app -o “Application.resigned.ipa" --embed ../../support_files/embedded.mobileprovision
  36. 36. Внедрение кода • 6-й xCode позволяет собирать динамические библиотеки для iOS (раньше надо было править конфигурационные файлы xCode) • можно собрать динамическую библиотеку dylib и сделать так, чтобы приложение загружало ее при старте https://github.com/fanruten/mach-patcher/
  37. 37. Внедрение кода Чтобы не указывать абсолютный путь, можно использовать @executable_path/inferno.dylib
  38. 38. Внедрение кода • распаковать IPA • заменить файл embedded.mobileprovision тем, который будет подходить для приватного ключа используемого при переподписи • удалить файл CodeResources • скопировать dylib в бандл • модифицировать бинарник (внедрить dylib) • взывать codesign для бинарника и dylib • запаковать в ZIP и изменить расширение на IPA
  39. 39. Внедрение кода #!/bin/sh rm Application.resigned.ipa rm -rf output mkdir output unzip ipa/Apts.ipa -d output/extracted > /dev/null 2>&1 rm -rf Payload/*.app/_CodeSignature 2> /dev/null | true mach-patcher Payload/*.app/Artique @executable_path/inferno.dylib cp ../../support_files/inferno.dylib Payload/*.app/ /usr/bin/codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 Payload/*.app/ inferno.dylib /usr/bin/codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 "Payload/Apts.app/Apts" /usr/bin/xcrun -sdk iphoneos PackageApplication -v Payload/*.app -o “Application.resigned.ipa" -- embed ../../support_files/embedded.mobileprovision
  40. 40. IPA из AppStore • зашифрованные • можно расшифровать при помощи устройства с jailbreak используя Clutch • после расшифровки получим IPA, который можно подписать и ставить на устройства
  41. 41. IPA из AppStore
  42. 42. Спасибо за внимание fanruten@gmail.com ruslan.gumenniy@e-legion.com

×