iPhone ip address 自動更新 airplane モードをCommand lineで実行

2015年6月29日

[課題]
iPhoneのGlobal ip addressを自動更新
[方針]
1.network deviceを再起動し更新 (成功)
2.airplane modeをprivate apiを利用し on / off (成功)

[対策詳細1]
Step
1)iPhone Jail break
2)open-ssh install
3)network restartメッソドを実装
4)アプリをルートアプリに昇格

1) iPhone Jail break
- 7.1.x
- iTunesがインストールされているかを確認すること

http://tools4hack.santalab.me/how-to-ios71-ios711-untethered-jailbreak-pangu.html

2)-open-sshインストール
cydiaよりインストール

3)network refresh method
3-1)ダメな方法
[参考URL] http://www.sinfuliphone.com/showthread.php?t=2144
network commandをインストールしrefreshする方法はwifiは更新できるが
3G/4G回線は更新できなかった。
3-2)成功した方法
system(“/bin/launchctl unload -w /System/Library/LaunchDaemons/com.apple.CommCenter.plist”);
system(“/bin/launchctl load -w /System/Library/LaunchDaemons/com.apple.CommCenter.plist”);
CommCenter自体をリロードすることでネットワークの更新に成功

4)アプリをルートアプリに昇格
3)の実施にはアプリをルートアプリに昇格させる必要がある。
4-1)main.mにルート権限取得コード追加
//setuidとsetgidを実施
int main(int argc, char * argv[]) {
@autoreleasepool {
if (!(setuid(0) == 0 && setgid(0) == 0))
{
NSLog(@”Failed to gain root privileges, aborting…”);
}
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
4-2)iPhoneでアプリをルートに昇格(sample.app)

/private/var/mobile/Applications/xxxrandomstringxxxx/sample.appを
/Applications/へ移行

/Applications/sample.app/sample を
/Applications/sample.app/sample2へ名前変更

エラー回避の為のDirectory 生成
mkdir -p /var/db/launchd.db/com.apple.launchd

sydiaよりテキスト編集nanoをインストール

nanoで /Applications/sample.app/sampleを新規生成
下記ソースを追加

権限設定
chown -r root.wheel /Applications/sample.app
chmod 755 /Applications/sample.app/sample
chmod 6775 /Applications/sample.app/sample2

spring boardをリスタート
-端末を再起動するか、cydiaよりrespringアプリをインストールして実行
上記でアプリがルート権限で実行可能になる

[対策詳細2]-airplaneをプログラムでon/off
1)jail break
2)ssh install
3)private api /AppSupport.framework/RadiosPreferences.hを使用
3-1)private frameworkをxcodeへ追加.frameworkの経路は下記
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/PrivateFrameworks/AppSupport.framework
3-2)airplane mode用下記headerを作成

#import
@interface RadiosPreferences : NSObject {
int _applySkipCount;
BOOL _cachedAirplaneMode;
NSObject *_dispatchQueue;
BOOL _isCachedAirplaneModeValid;
struct __SCPreferences { } *_prefs;
BOOL notifyForExternalChangeOnly;
}

@property (nonatomic) BOOL airplaneMode;
@property (nonatomic) BOOL notifyForExternalChangeOnly;

+ (BOOL)shouldMirrorAirplaneMode;

- (BOOL)airplaneMode;
- (void)dealloc;
- (id)delegate;
- (void*)getValueForKey:(id)arg1;
- (id)init;
- (id)initWithQueue:(id)arg1;
- (void)initializeSCPrefs:(id)arg1;
- (BOOL)notifyForExternalChangeOnly;
- (void)notifyTarget:(unsigned int)arg1;
- (void)refresh;
- (oneway void)release;
- (void)setAirplaneMode:(BOOL)arg1;
- (void)setAirplaneModeWithoutMirroring:(BOOL)arg1;

- (void)setDelegate:(id)arg1;
- (void)setNotifyForExternalChangeOnly:(BOOL)arg1;
- (void)setValue:(void*)arg1 forKey:(id)arg2;
- (void)synchronize;
@end

3-3)on / off code
RadiosPreferences* pref = [[RadiosPreferences alloc] init];
pref.airplaneMode = (YES/NO);
[pref synchronize];
4)実行権限よentitlement追加
airplaneモードメッソド実行のためにバイナリーへ下記entitlementを追加
4-1)ldidインストール
署名用のldidインストール
git clone git://git.saurik.com/ldid.git
cd ldid
git submodule update –init
/*
make.sh内のXcodeのpathを修正
*/
./make.sh
cp -f ./ldid /usr/local/bin/ldid

4-2)アプリケーションを一度端末で起動
上記で端末にアプリケーションが生成される
あとは権限が適用されたバイナリに入れ替える

4-3)権限entitlement.xml


com.apple.SystemConfiguration.SCDynamicStore-write-access

com.apple.SystemConfiguration.SCPreferences-write-access

com.apple.radios.plist

4-3)権限をバイナリへ適用
cd ~/Library/Developer/Xcode/DerivedData/{sampleapp-randomsting}/Build/Products/Debug-iphoneos/sampleapp.app/
ldid -S/path/to/entitlement.xml sampleapp
注意!-Sの次に空白を入れないこと。でないとエラーが発生

4-4)バイナリsampleappをiphoneへscp移行
scp sampleapp root@iphone.local.ip:~

4-5)iPhoneのshellで
cp ~/sampleapp /private/var/mobile/Applications/{randomstring}/sampleapp.app/

4-6)respring
再起動もしくはcydiaよりrespringアプリをダウンロードしrespring

以上

Comments are closed.