ãã®ç« ãšãã®æ¬å šäœãããiOSããã°ã©ãã³ã°ã®ã»ãšãã©ã®æ å ±ãå ¬éãã¬ãŒã ã¯ãŒã¯ã«å«ãŸããŠããããšã¯æããã§ãããSDKã«ã¯å«ãŸããŠããŸããã ããã«é¢ããAppleã®éå ¬åŒã®ããªã·ãŒã¯åçŽã§ããããã¯ãã¹ãŠäœ¿çšã§ããŸããããèªèº«ã®å±éºãšãªã¹ã¯ãããå Žåã«éããŸãã 次ã®ãã¡ãŒã ãŠã§ã¢æŽæ°äžã«ã³ãŒããç Žæããå ŽåããããŸãã ããªãèªèº«ããªã¹ã¯ãšå©çã®åŠ¥åç¹ãèŠã€ããªããã°ãªããŸããã
ãšãªã«ã»ãµãã³ãiPhoneéçºè ã®æçæ¬
ãªãªãžãã«
ãã®ç« ããã³æ¬æžã§èª¬æããããã«ãiPhoneããã°ã©ãã³ã°ã®æãåªããéšåã®ããã€ãã¯ãå
¬éã®iPhoneãã¬ãŒã ã¯ãŒã¯ã«å«ãŸããŠããŸãããSDKã«ã¯å«ãŸããŠããŸããã ããã«é¢ããAppleã®éå
¬åŒã®ããªã·ãŒã¯æ確ã§ãïŒãããã®ã¢ã€ãã ã¯ããã°ã©ã ã§äœ¿çšã§ããŸããã䜿çšããã®ã¯èªå·±è²¬ä»»ã§è¡ãããã¡ãŒã ãŠã§ã¢ã®ãªãªãŒã¹ããšã«ã³ãŒããç Žæããå¯èœæ§ããããŸãã ãªã¹ã¯ãšå ±é
¬ã®ãã©ã³ã¹ããšãã®ã¯ããªã次第ã§ãã
å 責äºé
- ããã«ç€ºãã³ãŒãã¯ãéåžžã®iPhoneïŒ4Sãå«ãïŒããã³iPadïŒæ°ããiPadãå«ãïŒã§åäœãããžã§ã€ã«ãã¬ã€ã¯ãå¿ èŠãšããŸããã
- ãã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ã¯ãiOS 5ã§èšè¿°ããã³ãã¹ããããŠããŸãããã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ã¯ãiOS 4.3ãšã®äºææ§ããã¹ããããŠããŸãã ç¹ã«æèšããªãéããiOS 4ã§åäœããŸãã ãã®èšäºã®äž»èŠéšåã¯iOS 6ã®ãªãªãŒã¹åã«æžãããããããããã®ãœãªã¥ãŒã·ã§ã³ã¯iOS 6ãšã®äºææ§ã«ã€ããŠãã¹ããããŠããŸããã
- ææžåãããŠããªãAPIã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ãAppStoreã«èš±å¯ãããªãå¯èœæ§ããããŸãã ãŸãã¯å€åããã§ã¯ãªã:-)
Appleããã©ã€ããŒãAPIã®äœ¿çšãã©ã®ããã«å®çŸ©ãããã«èå³ããã人ã®ããã«ïŒ ã Appleã¯ããã©ã€ããŒãAPIã䜿çšããŠããããšãã©ã®ããã«ç¥ã£ãŠããŸããïŒã
- Appleã¯ãiOSã®æ¬¡ã®ãªãªãŒã¹ã§å®è£ ãå€æŽããå¯èœæ§ããããã³ãŒãã§äœããå£ããŸãã ãã ããããã¯è§£æ±ºå¯èœã§ãããææžåãããAPIã®äžäœäºææ§ã®å®è£ ãšåºæ¬çã«ã¯ç°ãªããŸããã 以äžã§ã¯ããã®åé¡ãããã«è©³ãã調ã¹ãŸããã
- ç§ãèŠã€ããAPIã«å¯äœçšããªãããšãä¿èšŒããããšã¯ã§ããŸããã ãèªèº«ã®è²¬ä»»ã§äœ¿çšããŠãã ããã
- Apple Developer Programã©ã€ã»ã³ã¹å¥çŽã¯ãiOSã®ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ãçŠæ¢ããŠããŸãã
- èšäºã¯å®æäžã§ãã 建èšçãªæ¹å€ã¯å€§æè¿ã§ãïŒ
SDKã®ã¯ã€ãã¯æ€çŽ¢ã¬ã€ã
å ¬åŒææžã®ç¯å²ãè¶ ããäœããããå¿ èŠããããšããŸãããã ããšãã°ãããã¯ã©ã€ãã¬ãã«ãå€æŽããŸãïŒiOS 5ããåã¯ãããã¯SDKã®ææžåãããéšåã«ãããŸããã§ããïŒã Appleããã°ã©ããŒã¯éåžžãé¢æ°ãšå€æ°ã«æå³ã®ããè¡šçŸåè±ããªååãä»ããããšãç¥ãããŠããŸããããã¯SDKã®æ€çŽ¢ã«äœ¿çšããŸãã ãããè¡ãã«ã¯ããããã¯ã«é¢é£ããããã€ãã®åèªïŒæãããã¬ãã«ãç»é¢ãªã©ïŒãéžæããŸãã ã¹ã¯ãªããLookSDKForSymbol.shïŒããã¯
nm
ã©ãããŒã§ãããã®ã¹ã¯ãªãããšäœ¿çšãããä»ã®ããŒã«ã«ã€ããŠã¯ãã ããŒã«ãã»ã¯ã·ã§ã³ã§åŸè¿°ããŸã ïŒãããŒã¯ãŒããšããŠãã©ã¡ãŒã¿ãŒãšããŠå®è¡ããŸãã ã¹ã¯ãªããã¯ããªããžã§ã¯ããã¡ã€ã«ã§èŠã€ãã£ãæåïŒã¯ã©ã¹ãé¢æ°ãå€æ°ã®ååïŒãè¿ããŸãã åé¡ã®äŸïŒ
$ LookSDKForSymbol.shã©ã€ãã¬ãã«
U _UIBacklightLevelChangedNotification
./System/Library/CoreServices/SpringBoard.app/SpringBoardã«ãããŸã
001b43c4 t-[UIApplicationããã¯ã©ã€ãã¬ãã«]
001b4360 t-[UIApplication setBacklightLevelïŒ]
0025ce54 t-[UIDevice _backlightLevel]
0025ce40 t-[UIDevice _setBacklightLevelïŒ]
...ããã«æ°åæå
ããšãã°ãã»ãšãã©ã®çµæã¯ããã«ç Žæ£ã§ããŸããããšãã°ã
-[UIApplication backlightLevel]
ã¯ããã¯ã©ã€ãå€ãè¿ããŸãããèšå®ããŸããã
æ®ãã®æ°åå以äžã®å Žåã¯ãGoogleã«ãã£ãŒããè©Šè¡ã§ããŸãã 誰ããæ¢ã«èŠã€ãã£ããã£ã©ã¯ã¿ãŒã«é¢é£ããAPIã調æ»ããŠããããã®å Žåãåé¡ã解決ãããšèããŠããŸãã ããè€éãªã±ãŒã¹ã§ã¯ããªããŒã¹ãšã³ãžãã¢ãªã³ã°ãå®è¡ããå¿ èŠããããŸããã€ãŸããèŠã€ãã£ãæ©èœãã©ã®ããã«æ©èœããããèŠã€ãã£ãã¢ã©ãŒãã䜿çšããæ¹æ³ãªã©ãèŠã€ããå¿ èŠããããŸãã
ãŠãŒãã£ãªãã£ã«ãã£ãŠçºè¡ãããæååã¯ã次ã®ã«ããŽãªã«åé¡ãããŸãã
- Objective-Cããã³C ++ã®é¢æ°ãã¯ã©ã¹ãæ§é ãªã©ã Objective-Cã«é¢é£ãããã®ã«ã¯ãã¹ãŠãè§æ¬åŒ§ïŒ[]ïŒãŸãã¯ãã«èšå·ïŒ$ïŒãå«ãŸããŠããŸãã C ++é¢æ°ã¯éåžžãããã€ãã®åå空éã«å«ãŸããŠãããããååã«ã¯åå空é解決æåã§ãã2ã€ã®ã³ãã³ïŒïŒ:)ãå«ãŸããŠããŸãã
- Objective-Cãããã¯ã ãããã®äžè¬çãªå€èŠ³ã¯æ¬¡ã®ãšããã§ãã
___{}{ }_block_invoke_{2}
äŸïŒ
___22-[AXSystemServer init]_block_invoke_0
- çŽç²ãªCé¢æ°ã
- Objective-Cã¢ã©ãŒãã
_SBMenuButtonPressedNotification
ãªã©ã®éç¥ã§çµäºããŸãã - ããŒ/å®æ°ã éåžžãkã§å§ãŸããŸãïŒäŸïŒ_
kCFUserNotificationAlternateButtonTitleKey
ã
以éã®ã¢ã¯ã·ã§ã³ã¯ãã·ã³ãã«ã®ã«ããŽãªã«ãã£ãŠç°ãªããŸãã
- ãã®ãã¬ãŒã ã¯ãŒã¯ã®ããããŒãã¡ã€ã«ãçæããŸãã
class-dump-z Foundation> $ / iOS_private_headers / Foundation.h
ã»ãšãã©ã®å ŽåãçæãããããããŒãã¡ã€ã«ã§ååã§ããã¯ã©ã¹ã®ç¶æ¿éå±€ãæ§é ãã¡ãœãããªã©ã¯ååã«èª¬æããå¿ èŠããããŸãããã®ãããå°ãæéãå²ããŠAPIãææ¡ããææ¡ã§äœ¿çšã§ããŸãã
æ®å¿µãªãããããããŒãã¡ã€ã«ã«å«ãŸããæ å ±ã§ã¯ã³ãŒããæ©èœãããã®ã«ååã§ãªãå Žåããããotoolã§çæãããã¢ã»ã³ãã©ã³ãŒããåæããå¿ èŠããããŸãã
Objective-Cã³ãŒããéã¢ã»ã³ãã«ããããã®ãã³ãïŒã»ãŒç¢ºå®ã«ãobjc_msgSendïŒãªããžã§ã¯ããžã®ã¡ãã»ãŒãžã®éä¿¡ïŒãªã©ã®é¢æ°åŒã³åºããçºçããŸãã æåã®ãã©ã¡ãŒã¿ãŒã¯åžžã«ãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒã§ããã2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯ã»ã¬ã¯ã¿ãŒãžã®ãã€ã³ã¿ãŒã§ãã ã¡ãœããã®ååã§ããæååãžã®ãã€ã³ã¿ïŒãéåžžã®ãåŒæ°ã®æ®ãã¯3çªç®ã4çªç®ãªã©ã®åŒæ°ã§ãïŒã ãã®å Žåã«éä¿¡ãããã¡ãã»ãŒãžã®hexdump
ãå€æããã«ã¯ãhexdump
ã圹ç«ã¡ãŸãã
- ããã«å¿ããããšãã§ããŸãã ãããã¯ã¯ïŒéåžžïŒããŒã«ã«ã§ãããã³ãŒãããåŒã³åºãããšã¯ã§ããŸããã
- æãé£ãããªãã·ã§ã³ã æãåçŽãªã±ãŒã¹ã§ã¯ãé¢æ°ã®ã·ã°ããã£ãéžæã§ããŸããããã以å€ã®å Žåã¯éã¢ã»ã³ããªã®ã¿ã§ãã ãã®è©³çŽ°ã«ã€ããŠã¯ã ãäžæãªé¢æ°ã®ã·ã°ããã£ãèŠã€ããæ¹æ³ãã»ã¯ã·ã§ã³ãã芧ãã ããã
- 3ã€ã®äž»èŠãªã¢ã©ãŒãã»ã³ã¿ãŒïŒLocalãDarwinãããã³CoreTelephonyïŒã®ããããã§ã¢ã©ãŒãããã£ããããããšããããšããå§ããŸãããã ãã®ã¿ã€ãã®ã¢ã©ãŒããå±ããªãå Žåã次ã®2ã€ã®ããããããããŸãã
-ãã®ã¿ã€ãã®ã¢ã©ãŒãã¯ãå¥ã®ç¹å¥ãªã¢ã©ãŒãã»ã³ã¿ãŒã«éãããŸãã èŠã€ãã£ãã¢ã©ãŒããå±ããåããã¬ãŒã ã¯ãŒã¯ã§ããã®ãããªéç¥ã»ã³ã¿ãŒã®ãã¬ãŒã¹ãæ€çŽ¢ããå¿ èŠããããŸãã
-ã¢ã©ãŒãé ä¿¡ã¯ç¡å¹ã§ãã ãã®ã¿ã€ãã®ã¢ã©ãŒãã®é ä¿¡ãæå¹ã«ããã¡ã«ããºã ãèŠã€ããŠãã ããã
- ãã®å Žåãã»ãšãã©ã®å Žåããã®å®æ°ããã©ã¡ãŒã¿ãŒãšããŠåãå
¥ããé¢æ°ããŸãã¯ãã®å®æ°ãããŒãšããèŸæžããããŸãã ãããã«ããŠããååãåãåèªã§å§ãŸãé¢æ°ãŸãã¯ã¡ãœãããæ¢ãå¿
èŠããããŸãïŒäŸïŒconstant
kLockdownDeviceColorKey
> functionlockdown_copy_value(...)
;
æªç¥ã®é¢æ°ã®ã·ã°ããã£ãèŠã€ããæ¹æ³ã¯ïŒ
1.ã€ã³ã¿ãŒãããäžã§æ€çŽ¢ããŸããããã¯äžè¬çã§ã¯ãããŸããã ç§ã¯éåžžã«é »ç¹ã«äžåœã®ãµã€ãã«åºããããŸãããéåžžã«æçšãªæ å ±ãæã€éåœèªãšæ¥æ¬èªã®ãµã€ãããããŸããã éåžžãã³ãŒãèªäœã¯ãäœãèµ·ãã£ãŠããã®ãããã®é¢æ°ããã®ã¯ã©ã¹ãªã©ãã©ã®ããã«äœ¿çšãããã®ããç解ããã®ã«ååã§ãã Objective-Cã®åé·æ§ãšè¡šçŸåã«æè¬ããŸãïŒ
2.å€ãã®åçŽãªé¢æ°ã§ã¯ã眲åãæšæž¬ããããšãã§ããŸãã 泚æ ãããã¯éåžžã«å±éºã§ãã
GSEventSetBackLightLevelãªã©ã®ããã€ãã®åçŽãªé¢æ°ã®äœ¿çšã¯èªæã§ãã
void GSEventSetBackLightLevelïŒfloatã¬ãã«ïŒ;
ä»ã®å€ãã®å Žåã次ã®ããªãã¯ã䜿çšããŸããïŒSBGetRingerSwitchStateé¢æ°ã®äŸã䜿çšïŒã
SInt32 ret = 5, out1 = 1, out2 = 2, out3 = 3, out4 = 4; void *libHandle = dlopen(SPRINGBOARD_SERVICES_PATH, RTLD_LAZY); SInt32 (*SBGetRingerSwitchState)(SInt32*,SInt32*,SInt32*,SInt32*) = dlsym(libHandle, "SBGetRingerSwitchState"); ret = SBGetRingerSwitchState(&out1, &out2, &out3, &out4); NSLog(@"%x %x %x %x %x", ret, out1, out2, out3, out4);
ãã®ã³ãŒãã®çµæã次ã®ããšãå€æããŸãã
1ïŒé¢æ°ã¯ãã¹ã€ããã®å®éã®äœçœ®ã«
0x10000003
ã
0x10000003
å€ãè¿ããŸããã
2ïŒå€æ°
out2
ã¯ãã®å€ãselfã«å€æŽããŸããã æ»ãå€ãã¹ã€ããã«äŸåããŸããã
3ïŒæ®ãã®å€æ°ã¯å€ãå€æŽããŠããŸããã
1ïŒããã0x10000003ã¯MACH_SEND_INVALID_
DEST
ã·ã¹ãã ãšã©ãŒã«å¯Ÿå¿ããŠãããããé¢æ°ã¯
kern_return_t
åã®å€ãè¿ããšçµè«ä»ããŸããã ã©ãããããšã©ãŒã¯ééã£ãããŒããæããŠãã[ãã®å ŽåãããŒãã¯ãããã«ãŒãã«ïŒãããã«ãŒãã«ïŒã®æœè±¡åã§ãããããã»ã¹ã®æš©å©ãšåªå 床ãç¹åŸŽã¥ããŠããŸã]ã ååãšããŠãé¢æ°åŒã³åºãã§ããŒãçªå·ã䜿çšãããå Žåãããã¯æåã®åŒæ°ã§ãã 2ïŒããã2çªç®ã®åŒæ°ãéããŠãé¢æ°ã¯åç §ã«ãã£ãŠç¹å®ã®å€ãè¿ããŸãã
ãããã®åçŽãªã¢ã¯ã·ã§ã³ã®çµæãšããŠã次ã®çœ²åãååŸãããŸãã
kern_return_t SBGetRingerSwitchState(mach_port_t port, SInt32 *state);
ãšããã§ãgetãšããååã«getãšããåèªãå«ãŸããŠããå ŽåãObjective-Cã®åœåèŠåã«åŸã£ãŠããã®é¢æ°ã¯åç §ã«ãã£ãŠå€ãè¿ãå¿ èŠããããŸãã ããã¯äžèšã®äŸãããæããã§ãã
3.å解ã åãSBGetRingerSwitchStateã®äŸã otoolã䜿çšããŸãã
$ otool -p _SBGetRingerSwitchState -tââV -arch armv6 SpringBoardServices | å°ãªã
000038cc b5f0 push {r4ãr5ãr6ãr7ãlr}
000038ce af03 add r7ãspãïŒ12
000038d0 b092 sub spãïŒ72
000038d2 aa06 add r2ãspãïŒ24 //ã¬ãžã¹ã¿r2ã®å€ãäžæžããããŸã
000038d4 9205 str r2ã[spãïŒ20]
000038d6 ac08 add r4ãspãïŒ32 // ...ããã³ã¬ãžã¹ã¿r4
000038d8 ab0f add r3ãspãïŒ60 // ...ããã³r3
000038da 9304 str r3ã[spãïŒ16]
000038dc 9103 str r1ã[spãïŒ12] // r1ã®å€ã¯ã¹ã¿ãã¯ã«ä¿åãããŸã
000038de 4925 ldr r1ã[pcãïŒ148]ïŒ0x3974ïŒ
000038e0 6011 str r1ã[r2ãïŒ0]
000038e2 6020 str r0ã[r4ãïŒ0] // r0ã®å€ãã¹ã¿ãã¯ã«ä¿åãããŸã
...
ãã®ã³ãŒããããã¢ãŒã ã¢ã»ã³ãã©ã®è¡šé¢çãªç¥èãã䜿çšããŠãé¢æ°ãåèªåã®2ã€ã®åŒæ°ãåãå ¥ãããšä»®å®ã§ããŸãã
é¢æ°ã«ã¯2ã€ã®åŒæ°ãããããšãããããŸãã ããã«æåŸãŸã§è¡ããŸãã
...
00003964 9e04 ldr r6ã[spãïŒ16]
00003966 6836 ldr r6ã[r6ãïŒ0]
00003968 9903 ldr r1ã[spãïŒ12]
0000396a 600e str r6ã[r1ãïŒ0]
//ã»ãŒå¯Ÿå¿ããŸãïŒCèšèªã®èŠ³ç¹ããïŒïŒ* r1 = r6; ã€ãŸã r1ã«ä¿åãããŠããã¢ãã¬ã¹ã«ãr6ã®å€ãæžã蟌ãŸããŸãã
//ããã¯ãé¢æ°ãåç §ã«ãã£ãŠå€ãè¿ãããšãæå³ããŸã
0000396c 462e mov r6ãr5
0000396e 4630 mov r0ãr6
//é¢æ°ã®çµæã¯r0ã«é 眮ãããŸã
00003970 b012 SPãè¿œå ãïŒ72
00003972 bdf0 pop {r4ãr5ãr6ãr7ãpc}
...
äžçªäžã®è¡ã¯æ¬¡ã®ãšããã§ãã
int SBGetRingerSwitchState(int arg1, int* arg2);
ãã®ã¢ã»ã³ããªã³ãŒãã®åæãç¶ããåãæ確ã«ããŠæçµããŒãžã§ã³ã«å°éããŸãã
kern_return_t SBGetRingerSwitchState(mach_port_t port, SInt32 *state);
ç°ãªããã¡ãŒã ãŠã§ã¢ãšç°ãªãããã€ã¹ïŒäœãå£ããããã©ã®ããã«ä¿®æ£ãããïŒ
ææžåãããŠããªãAPIããã¹ãŠã®ããã€ã¹ã§å¿ ãããåãããã«æ©èœããããã§ã¯ãªãããšã¯æããã§ãã ç§ã®çµéšã§ã¯ãã»ãšãã©ã®å Žåäœãå€ããããAPIã¯ãã¹ãŠã®ããã€ã¹ãšãã¹ãŠã®ãã¡ãŒã ãŠã§ã¢ã§åãããã«æ©èœããŸãã ãããã£ãŠãããšãã°ã UIDevice-IOKitExtensionsæ¡åŒµæ©èœã®ãã¹ãŠã®æ©èœïŒIMEIã®å®çŸ©ãé€ãïŒã¯ããã¹ãŠã®ããã€ã¹ããã³ãã¹ãŠã®ãã¡ãŒã ãŠã§ã¢ã§åçã«æ©èœããŸãã iOSã®æŽæ°æã«ã©ã®ãããªå€æŽãçºçããŸããïŒ
以äžã«å®çšçãªãªãã·ã§ã³ã瀺ããŸãã
- å
¬åŒã«ææžåãããããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã衚瀺ãããå ŽåããããŸãããææžåãããŠããªãã€ã³ã¿ãŒãã§ã€ã¹ã¯ååãšããŠåŒãç¶ãæ©èœããŸãã äŸïŒ
void GSEventSetBacklightLevel(float level); // iOS -[UIDevice setBrightness: (CGFloat)brightness]; // iOS 5.0
- ããã°ã©ã ã€ã³ã¿ãŒãã§ã€ã¹ã¯å¥ã®ãã¬ãŒã ã¯ãŒã¯ã«è»¢éãããŸãã Appleã¯ãè€æ°ã®ãã¬ãŒã ã¯ãŒã¯ã1ã€ã«çµåãããã¬ãŒã ã¯ãŒã¯ã®ååãå€æŽãŸãã¯åé€ã§ããŸãã ããšãã°ãWiFiãæäœããããã®é¢æ°ïŒApple80211OpenãApple80211Closeãªã©ïŒã¯Aeropuerto.dylibããIPConfiguration.dylibã«è»¢éãããŸããã
- ç¹ã«è匱æ§ã«é¢é£ããå Žåã¯ãAPIãç°¡åã«åé€ã§ããŸãã
äºææ§ã®åé¡ãåé¿ããããã«ãåçŽãªã«ãŒã«ã«åŸããŸãïŒé¢æ°ïŒããšãã°
-[NSObject respondsToSelector:]
ã䜿çšïŒããã§ãã¯ããã¯ã©ã¹ïŒ
SomeClass
å Žå
SomeClass
NSClassFromString(@"SomeClass")
ã¯
nil
ãè¿ããŸãïŒãªã©ããŸããAPIãæ¬ èœããŠããå Žåã«ããã°ã©ã ãäœããã¹ãããäºåã«èããŠãã ããã ã©ã€ãã©ãªã©ã€ãã©ãªã®åçãªã³ã¯ã䜿çšããå Žåã¯ãdlsymïŒ...ïŒããã³dlopenïŒ...ïŒã®æ»ãå€ã§NULLãçãããã©ãããåžžã«ç¢ºèªããå¿ èŠããããŸãã
äŸ
äŸ1ïŒ
ãµã€ããã€ãã¬ãŒã·ã§ã³ã¹ã€ããïŒå¥åãªã³ã°/ãµã€ã¬ã³ãã¹ã€ããããã¥ãŒãã¹ã€ããïŒã®äœçœ®ã®æ±ºå®ç§ãçŽé¢ããã¿ã¹ã¯ã®1ã€ã¯ããµã€ãã¹ã€ããã®äœçœ®ã決å®ããããšã§ãããããã¯ãå ã ã¯ãªã³ã°/ãµã€ã¬ã³ãã¹ã€ãããšåŒã°ããŠããŸããã ãã®ã¹ã€ããã¯ãiPhoneããã³iPadã§ãéããã¢ãŒããšéåžž/ã倧é³éãã¢ãŒããåãæ¿ããããã«äœ¿çšãããŸãã StackOverflowãæ€çŽ¢ãããšã解決çãåŸãããŸããã
#import <AudioToolbox/AudioToolbox.h> ... /* : 0: 1: */ int switchState() { // ... // , // kAudioSessionCategoryAmbient // ... UInt32 size = sizeof(CFStringRef)); CFStringRef route; AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &route); // CFIndex len = CFStringGetLength(route); return (len > 0); // - , "" }
ãã ããããã¯iOS 5ã§ã¯æ©èœããŸãããæ°ããAPIïŒkAudioSessionProperty_AudioRouteDescriptionïŒã䜿çšããŠãããªãŒãã£ãªå ¥åããã³ãªãŒãã£ãªåºåã«é¢ããæ¡åŒµæ å ±ãæäŸããããããæ©èœããŸããã§ããã ïŒãªãŒãã£ãªã«ãŒãïŒ
StackOverflowãããã«æ€çŽ¢ããŠã ãã®æçš¿ãèŠã€ããŸããã ã©ã€ãã©ãªé¢æ°AudioServicesAddSystemSoundCompletionïŒïŒã«ã€ããŠèª¬æããŸãããã®é¢æ°ã®éæšæºçãªåäœã¯ãéçºè ã«ãã£ãŠãã°ãšèŠãªãããŠããŸããã
#import <AudioToolbox/AudioToolbox.h> ... void playSound() { AudioServicesAddSystemSoundCompletion(MySoundId, NULL, NULL, MyAudioServicesSystemSoundCompletionProc, AudioServicesPlaySystemSound(MySoundId); } void MyAudioServicesSystemSoundCompletionProc (SystemSoundID ssID, void *clientData) { // NSLog(@"Playback has been finished"); }
éæšæºã®åäœã§ã¯ãMyAudioServicesSystemSoundCompletionProcã³ãŒã«ããã¯ã¯ãéåžžã¢ãŒãã§ã®ãµãŠã³ãåçã®æåŸã«åŒã³åºãããŸãããããµã€ã¬ã³ããã¢ãŒãã§AudioServicesPlaySystemSoundãåŒã³åºããçŽåŸã«åŒã³åºãããŸãã ããã«ãããã¹ã€ããã®çŸåšã®ç¶æ ãå€æããããã®æãç©ŽãäœæãããŸãã ããšãã°ãåçãããªãŒãã£ãªãã¡ã€ã«ã®é·ãã1ç§ã®å Žåããµã€ã¬ã³ãã¢ãŒããšã©ãŠãã¢ãŒãã§MyAudioServicesSystemSoundCompletionProcïŒïŒãåŒã³åºãéã®æéå·®ã¯1ç§ã§ãã ããã«åºã¥ããŠããµã€ãã¹ã€ããã®äœçœ®ã決å®ããããã®2çªç®ã®éåæãœãªã¥ãŒã·ã§ã³ãæ§ç¯ããŸããã ããã«ãããŸãïŒ
#import <AudioToolbox/AudioToolbox.h> #import "MuteSwitchTet.h" ... enum MuteSwitchStates { kMuteSwitchUndefined = -1, kSoundless = 0, kSound = 1 }; @implementation MuteSwitchTest ... void MyAudioServicesSystemSoundCompletionProc (SystemSoundID ssID, void *clientData) { // "" MuteSwitchTest *self = (MuteSwitchTest*)clientData; [NSObject cancelPreviousPerformRequestsWithTarget:self]; self.muteSwitchState = kSoundless; } - (void) cancelSystemSoundCompletion { // "" AudioServicesRemoveSystemSoundCompletion(SoundID); self.muteSwitchState = kSound; } - (void) startPlayback { AudioServicesAddSystemSoundCompletion(SoundID, NULL, NULL, MyAudioServicesSystemSoundCompletionProc, self); AudioServicesPlaySystemSound(SoundID); [self performSelector:@selector(cancelSystemSoundCompletion) withObject:nil afterDelay:0.1]; } ... @end
ãã®æ°ãããœãªã¥ãŒã·ã§ã³ã¯æ©èœããŠããŸããããããã€ãã®çç±ã§ç§ã«ã¯åããŠããŸããã§ããã ãŸããéåæã§ãããé¡èãªé 延ïŒçŽ1/10ç§ïŒã§åäœããŸããã é 延ãæžãããšã誀æ€ç¥ãçºçããŸããã 第äºã«ãå¯äœçšããããŸãã-åçãããé³èªäœãããŠãŒã¶ãŒãæ··ä¹±ãããã»ã©å€§ããªé³ã§ããã ãã®åŸããªãŒãã£ãªãšãã£ã¿ã§äººçºçã«é³éããŒãã«å€ããŸããã 第äžã«ãããã¯ãã§ã«æ±ãããã¯ã®ããã«ããŸãã«ãå€ãã£ãããããã¯ãäŸãã°ã VSSilentSwitchã®äœæè ããœãªã¥ãŒã·ã§ã³ã販売ããããšã劚ããªãã£ãããæããã«åãå¹æã«åºã¥ããŠããã
çŽ1ãæåŸããã®åé¡ã«æ»ããŸããã nmã³ãã³ãã䜿çšããŠãªããžã§ã¯ããã¡ã€ã«å ã®æåãæ€çŽ¢ãå§ããããã«åºã¥ããŠåçŽãªã·ã§ã«ã¹ã¯ãªãããäœæããŸããããã®ãªã¹ãã¯ã以äžã®ãããŒã«ãã»ã¯ã·ã§ã³ã«ãããŸãã ã¹ã¯ãªããã¯ããããããããŒã¯ãŒããè¡šã1ã€ã2ã€ããŸãã¯3ã€ã®ãã©ã¡ãŒã¿ãŒã§å®è¡ãããŸãã
$ shã/ããã¥ã¡ã³ã/ LookSDKForSymbol.sh RingerSwitch
ïŒçµæã®äžéšãçç¥ãããŠããŸã
0000d738 S _kGSRingerSwitchCapability
./System/Library/PrivateFrameworks/GraphicsServices.framework/GraphicsServicesã«ãããŸã
000038cc T _SBGetRingerSwitchState
0000370c T _SBGetRingerSwitchState
./System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServicesã«ãããŸã
SBGetRingerSwitchState
ãšåŒã°ãã
SBGetRingerSwitchState
ã¯ææã«èŠããŸããã
ç®çã®ããŒããååŸããããã«ãé¢æ°ã䜿çšãããŸããïŒ
mach_port_t SBSSpringBoardServerPort();
åããã¬ãŒã ã¯ãŒã¯ããã
çµæã¯æ¬¡ã®ãšããã§ãã
@implementation MuteSwitchTest ... - (int) switchState { // SBSSpringBoardServerPort SBGetRingerSwitchState // MuteSwitchTest mach_port_t port = SBSSpringBoardServerPort(); SInt32 state; SBGetRingerSwitchState(port, &state); return (int)state; }
äŸ2ïŒ
IMEIå®çŸ©IMEIïŒInternational Mobile Equipment IdentityïŒ-äžæã®èå¥
åé»è©±æ©ã«å²ãåœãŠãããã³ãŒãã¯ãé»è©±æ©ã®äžçš®ã®MACã¢ãã¬ã¹ã§ãïŒãã ããé»è©±æ©ã«ã¯MACã¢ãã¬ã¹ããããŸãïŒ
Erica Sadunã®uidevice-extensionãããžã§ã¯ãããã©ã®ããã«åºãŠãããèŠããŠããŸãããããããæ±ã£ãŠãããã¡ã«ãããçš®ã®ããã°ã©ããŒã®ãéé±ãã®ããã«æããŸããã
ã«ããŽãªã®1ã€ã§ããUIDevieïŒIOKit_ExtensionsïŒã«ã¯ãIMEIãå®çŸ©ããããã®é¢æ°ãå«ãŸããŠããŸãã iOS 5.1ãæèŒããiPhone 4ãšiOS 4.3ãæèŒããiPadã§ãããã®æ©èœããã¹ãããŸãããããã¹ãŠæ©èœããä»ã®ã¿ã¹ã¯ã«ç§»ããŸããã ããããããŒã¿ãã¹ãã§ã¯ãIMEIã決å®ããæ©èœãæ°ããããã€ã¹ïŒiPad 2ãæ°ããiPadãiPhone 4SïŒã§æ©èœããªãããšãå€æããŸããã çç±ãèŠã€ããããã«ãç§ã¯StackOverflowã«è¡ããŸãããããã§ãç§ã®æžå¿µã確èªãããŸããã æ€çŽ¢ã«ãããCoreTelephonyãšåŒã°ãããã¬ãŒã ã¯ãŒã¯ã«å°ãããŸããã
$ nm -g ./CoreTelephony | grep -i imei
U _kCFAbsoluteTimeIntervalSince1970
00053b28 S _kCTMobileEquipmentInfoIMEI
00053ad4 S _kCTPostponementInfoInfoIMEI
00053ac4 S _kCTPostponementStatusErrorDefaultIMEI
$ nm -g ./CoreTelephony | grep MobileEquipment
000260e4 T __CTServerConnectionCopyMobileEquipmentInfo
00053b34 S _kCTMobileEquipmentInfo1xIMSI
00053b20 S _kCTMobileEquipmentInfoCurrentMobileId
00053b24 S _kCTMobileEquipmentInfoCurrentSubscriberId
00053b40 S _kCTMobileEquipmentInfoERIVersion
00053b2c S _kCTMobileEquipmentInfoICCID
00053b28 S _kCTMobileEquipmentInfoIMEI
00053b30 S _kCTMobileEquipmentInfoIMSI
00053b38 S _kCTMobileEquipmentInfoMEID
00053b44 S _kCTMobileEquipmentInfoMIN
00053b3c S _kCTMobileEquipmentInfoPRLVersion
é¢æ°ïŒ_CTServerConnectionCopyMobileEquipmentInfoïŒ...ïŒïŒã¯ãkCTMobileEquipmentInfo *ãšãã圢åŒã®ããŒãšããã«å¯Ÿå¿ããå€ãæã€èŸæžïŒCFDictionaryRefïŒãè¿ããšæ³å®ã§ããŸãã 幞ããªããšã«ãä»åã¯çœ²åã埩å ããå¿ èŠã¯ãããŸããã§ããã Googleã§_CTServerConnectionCopyMobileEquipmentInfoãæ€çŽ¢ãããšã ãã®ããŒãžã衚瀺ãã ãããã«IMEIã決å®ããæ©èœã®æºåãæŽããŸããã
// #include "CoreTelephony.h" ... NSString* CTGetIMEI { struct CTResult it; NSMutableDictionary *dict; CTServerConnectionRef conn; conn = _CTServerConnectionCreate(kCFAllocatorDefault, ConnectionCallback, NULL); _CTServerConnectionCopyMobileEquipmentInfo(&it, conn, &(CFMutableDictionaryRef)dict); CFRelease(conn); [dict autorelease]; return [dict objectForKey: kCTMobileEquipmentInfoIMEI]; }
ãã®IMEIæ€åºæ¹æ³ã¯ããã¹ãŠã®ããã€ã¹ã§æ©èœããŸãã
ãã®åŸãIMEIã決å®ããå¥ã®æ¹æ³ãèŠã€ããŸããïŒlockdowndçµç±ïŒã
äŸ3ïŒ
ææžåãããŠããªãã¢ã©ãŒãã®äœ¿çšïŒããªã¥ãŒã ãã¿ã³ãåœåããNotificationãã§çµããæåå®æ°ã¯ã·ã¹ãã ã¢ã©ãŒãã®ååã§ããã[NSNotificationCenter defaultCenter]ã䜿çšããŠãªãã¶ãŒããŒãç»é²ããã ãã§äœ¿çšã§ãããšåçŽã«ä¿¡ããŠããŸããã
$ shã/ããã¥ã¡ã³ã/ LookSDKForSymbol.shéç¥$ããªã¥ãŒã ã®å€æŽ
001dbe60 S _MPAVControllerVolumeDidChangeNotification
001dbe64 S _MPAVControllerVolumeMutedDidChangeNotification
001dc4f8 S _MPMusicPlayerControllerVolumeDidChangeNotification
001dc314 S _MPVolumeViewRouteButtonChangedNotification
001dc310 S _MPVolumeViewVisibilityChangedNotification
./System/Library/Frameworks/MediaPlayer.framework/MediaPlayerã«ãããŸã
000d6d24 D _AVController_EffectiveVolumeDidChangeNotification
000d6d60 D _AVController_VolumeDidChangeNotification
000d6fec D _AVSystemController_CurrentRouteHasVolumeControlDidChangeNotification
000d6ffc D _AVSystemController_EffectiveVolumeDidChangeNotification
000d6fdc D _AVSystemController_SystemVolumeDidChangeNotification
./System/Library/PrivateFrameworks/Celestial.framework/Celestialã«ãããŸã
...ãããŠãä»ã®ãã¬ãŒã ã¯ãŒã¯ããããã«åæ°å
ãã¹ãããã°ã©ã ãäœæããåŸãããªã¥ãŒã ããŒãæŒãããšãã«ã©ã®ã¢ã©ãŒããçºçãããã確èªãå§ããŸããã
ç§ãç·šéããéç¥ã®ããªã倧ããªãªã¹ãããããããã®2ã€ã ããæ¥ãŸããã
AVController_EffectiveVolumeDidChangeNotification
AVController_VolumeDidChangeNotification
ãããã®ã¢ã©ãŒãã®æ¬ ç¹ã¯ã
1ïŒ2ã€ã®ãã¿ã³ã®ã©ã¡ããæŒãããããçŽæ¥å€æããããšã¯ã§ããŸãã
2ïŒåãã¿ã³ãæŒããããšããšã
ç§ã¯ä»ã®ããŒã¯ãŒããæ¢ããŠããŸãïŒ
$ shã/ Documents / LookSDKForSymbol.shããªã¥ãŒã ãã¿ã³
001b221c t-[UIApplication setWantsVolumeButtonEventsïŒ]
003cce5c t _SBSetWantsVolumeButtonEvents $ shim
0054478c S __UIApplicationVolumeDownButtonDownNotification
00544 790 S __UIApplicationVolumeDownButtonUpNotification
00544784 S __UIApplicationVolumeUpButtonDownNotification
00544788 S __UIApplicationVolumeUpButtonUpNotification
./System/Library/Frameworks/UIKit.framework/UIKitã«ãããŸã
...ãããŠãããŸããŸãªãã¬ãŒã ã¯ãŒã¯ããããã«æ°åå
UIKitããã®4ã€ã®ã¢ã©ãŒãã¯ããã«ã¯æ©èœããŸããã§ããããããã«é¢é£ããã³ãã³ããçºè¡ããå¿ èŠããããŸããã
[[UIApplication sharedApplication] setWantsVolumeButtonEvents: YES];
ãã®åŸã察å¿ãããã¿ã³ãæŒãããšã«é¢ããéç¥ãæ¥å§ããŸããã
å¯äœçšïŒãã®é¢æ°ãåŒã³åºããšãé³éãã¿ã³ã§é³éãå¶åŸ¡ã§ããªããªããŸãããã®ããããã¿ã³ã®æäœãçµäºããããåŒã³åºãå¿ èŠããããŸãã
[[UIApplication sharedApplication] setWantsVolumeButtonEvents: NO];
äŸ4ïŒ
ææžåãããŠããªãã¢ã©ãŒãã®äœ¿çšïŒSIMã¹ããŒã¿ã¹ã®è¿œè·¡å®çžŸã®ããã¹ããŒã ã«åŸã£ãŠäœæ¥ããŸãã
$ shã/ããã¥ã¡ã³ã/ LookSDKForSymbol.sh notification $ SIM
...
00052560 S _kCTSIMSupportSIMInsertionNotification
00052564 S _kCTSIMSupportSIMStatusChangeNotification
...
000525bc S _kCTSIMSupportSIMTrayStatusNotification
...
./System/Library/Frameworks/CoreTelephony.framework/CoreTelephonyã«ãããŸã
...
./System/Library/PrivateFrameworks/FTServices.framework/FTServicesã«ãããŸã
$
æãé©åãªã¢ã©ãŒãã¯ãååã®äžã§ç§ã«æãããŸããïŒ
1ïŒkCTSIMSupportSIMInsertionNotification
2ïŒkCTSIMSupportSIMStatusChangeNotification
3ïŒkCTSIMSupportSIMTrayStatusNotification
æãç°¡åãªãã¹ãããã°ã©ã ã§ã¯ãïŒ1ïŒãšåŒã°ããã¢ã©ãŒãã¯SIMã«ãŒããæ¿å ¥ãããšãã«ã®ã¿çºçããïŒååã§ä»¥åã«æšæž¬ã§ããïŒãïŒ2ïŒå¿ èŠãªãšãã«æ£ç¢ºã«ïŒæ¿å ¥ããã³åé€ãããšãã«ïŒãéç¥ïŒ3 ïŒãŸã£ããæ¥ãŸããã§ããã ãã®åŸãã¢ã©ãŒãïŒ3ïŒãCTTelephonyCenterãšåŒã°ããç¹å¥ãªã¢ã©ãŒãã»ã³ã¿ãŒã«å±ããŠããããšãç¥ããŸããã CTTelephonyCenterã®äœ¿çšã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ã
SIMã¹ããŒã¿ã¹ã¢ã©ãŒãïŒ
#include "CoreTelephony.h" - (void) notificationCallback:(NSNotification)notification { ... } - (void) startUpdateSIMStatus { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationCallback:) name:kCTSIMSupportSIMStatusChangeNotification object:nil ]; } - (void) stopUpdateSIMStatus { [[NSNotificationCenter defaultCenter] removeObserver:self name:kCTSIMSupportSIMStatusChangeNotification object:nil]; }
1.
www.iphonedevwiki.net/index.php/AudioServices â SystemSoundID (< 30) , . , 1000 .
:
- (void) playDefaultRingTone { NSURL *defaultRingTone = [NSURL URLWithString:@"/System/Library/CoreServices/SpringBoard.app/ring.m4r"]; AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:defaultRingTone error:nil]; [player play]; }
2. UIView
, UIView (superview) (subviews). ( , ) () UIWindow. ? : , UIWindow.
____
+ [UIWindow allWindowsIncludingInternalWindows: onlyVisibleWindows:]
! (UIWindow)
1)
2) - ( â [UIApplication statusBarWindow] )
3) UIAlertView ( UIAlertView).
4) .
?
, , .
, :
â UIAlertView, , ..
â -, .
â : , , , .
, . .
@interface UIStatusBarSignalStrengthItemView : UIStatusBarItemView { @private int _signalStrengthRaw; int _signalStrengthBars; BOOL _enableRSSI; BOOL _showRSSI; } -(id)_stringForRSSI; -(float)extraRightPadding; -(void)touchesEnded:(id)ended withEvent:(id)event; -(id)contentsImageForStyle:(int)style; -(BOOL)updateForNewData:(id)newData actions:(int)actions; @end
, , UIStatusBarSignalStrengthItemView RSSI ( ) , .
, . [UIView completeDescription]:
@interface UIView (RecursiveDescription) - (void) recursiveDescription; + (void) completeDescription @end @implementation UIView (RecursiveDescription) - (void) recursiveDescription { NSLog(@"______________________________________"); NSLog(@"%@", self); NSArray *subviews_ = [self subviews]; if ([subviews_ count] > 0) { for (UIView *subview_ in subviews_) { [subview_ recursiveDescription]; } } } - (void)completeDescription { NSArray *windows = [UIWindow allWindowsIncludingInternalWindows:YES onlyVisibleWindows:NO]; for (UIView *view in windows) { [view recursiveDescription]; } } @end
3. iOS
MIG (MIG-subsystem, Mach Interface Generator) â ( «Mach kernel»). MIG-subsystem Mac OS X - : www.opensource.apple.com/source/xnu/xnu-1228.0.2/libsyscall/mach . : www.iphonedevwiki.net/index.php/MIG_subsystem .
IORegistry, I/O registry â -; , iPhone . IORegistry (. UIDevice-IOKitExtensions ).
ããŒã«
nm â UNIX-, .
nm ( ) bash-, iOS SDK.
LookSDKForSymbol.sh:
#!/bin/bash SDK=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk PrivateFrameworks=$SDK/System/Library/PrivateFrameworks Frameworks=$SDK/System/Library/Frameworks Lib=$SDK/usr/lib cd $SDK for i in $(find -f .); do test -f $i && nm $i | c++filt | grep -i "$1" | grep -i "$2" | grep -i "$3" && echo "Found in $i "; done
c++filt â ( demangling ) . ++; objective-C .
otool â .
hexdump â :-)
class-dump-z â . . , , , , , .
Google Code â .
Hex-Rays ARM Decompiler â HEX-Rays IDA, ARM . .
â , , .
,
Wiki
www.iphonedevwiki.net
wiki, jailbreak .
(iOS 3.x, iOS 4.x), .
人
1. (Jay Freeman, saurik)
www.saurik.com
2. (Erica Sadun) â «The iPhone Developer's CookBook» «The iOS 5 Developer's Cookbook: Core Concepts and Essential Recipes for iOS Programmers», . .
ericasadun.com
:
github.com/erica/iOS-5-Cookbook
github.com/erica/iphone-3.0-cookbook-
github.com/erica/uidevice-extension
3. KennyTM / networkpx â class-dump-z, StackOverflow.com , API
networkpx.blogspot.com
code.google.com/p/networkpx
github.com/kennytm
stackoverflow.com/users/224671/kennytm
github.com/kennytm/iphone-private-frameworks
(iOS 3).
æ¬
«The iPhone Developer's CookBook» ( «The iOS 5 Developer's Cookbook: Core Concepts and Essential Recipes for iOS Programmers») â iOS, iOS.
:
translated.by/you/iphone-developers-cookbook-development-native-applications-for-the-iphone/into-ru/trans