1. 程式人生 > >iOS攻防:Cycript攻·防

iOS攻防:Cycript攻·防

簡介

Cycript允許開發人員探討和修改iOS和Mac OS X上執行的應用程式。
Cycript是一個理解Objective-C語法的javascript直譯器,它能夠掛鉤正在執行的程序,能夠在> 執行時修改應用的很多東西。

  1. 能夠掛鉤正在執行的程序,並且找出正被使用的類資訊,例如view controllers,內部和第三方庫,甚至程式的delegate的名稱。
  2. 對於一個特定的類,例如View Controller, App delegate或者任何其他的類,我們能夠得到所有被使用的方法名稱。
  3. 能夠得到所有例項變數的名稱和在程式執行的任意時刻例項變數的值。
  4. 能夠在執行時修改例項變數的值。
  5. 能夠執行Method Swizzling,例如替換一個特定方法的實現。
  6. 可以在執行時呼叫任意方法,即使這個方法目前並不在應用的實際程式碼當中。

Cycript安裝

這裡下載
這裡閱讀所有Cycript詭計

先看看怎麼用Cycript乾點壞事吧

1. 給應用彈一個莫名其妙的alert

ssh登陸你的手機(如果不會,上一篇有~)

找一個app

這裡我找的是以前做的一個app

1 ps aux|grep blackwidowhttp://ios.jobbole.com/wp-admin/post-new.php#

print

1 mobile4666.67.050841636204??Ss11:22AM0:09.65/xxxx/blackwidow

這樣知道程序號是466

hock住

1 cycript-p466

如果你看到出現了cy#,說明你可以開始編寫Cycript程式碼了

alert

Objective-C
123456 // 找到widnowvar window=[UIApplicationsharedApplication].keyWindow;// 初始化一個alertvar alert=[[UIAlertViewalloc] initWithTitle:@"hack you" message:@"hack you"window cancelButtonTitle:@"cancel" otherButtonTitles:@"yes",nil];// 彈出來吧[alert show];

blog_iOSCycript01

2. 探索一個app

Objective-C
1234567891011 function printMethods(className){var count=new new Type("I");var methods=class_copyMethodList(objc_getClass(className),count);var methodsArray=[];for(vari=0;ivar method=methods[i];methodsArray.push({selector:method_getName(method), implementation:method_getImplementation(method)});}free(methods);returnmethodsArray;}

呼叫一下:

Objective-C
1 printMethods(AppDelegate)

輸出結果:
blog_iOSCycript02

是不是覺得發生了很可怕的事情?該有的都被打印出來了。

你還可以通過試探的方式找出每一個Controller的名字,例如:

insert

Objective-C
1 var homeVC=[[[[[UIApplicationsharedApplication] keyWindow] subviews] objectAtIndex:0] nextResponder];

print

Objective-C
1 #"<HomePageTabBarViewController: 0x156cf200>"

insert

Objective-C
1 var page0VC=[homeVC.childViewControllersobjectAtIndex:3]

print

Objective-C
1 #"<BaseNavigationController: 0x156decc0>"

insert

Objective-C
1 var meVC=page0VC.topViewController

print

Objective-C
1 #"<MeViewController: 0x156de940>"

這樣,我們就找到了『我的』頁面所屬Controller。

檢視所有的方法:

Objective-C
1 printMethods(MeViewController)

blog_iOSCycript攻·防03

改個標題試試:

Objective-C
1 [meVC setCurrentTitle:@"hack you"];

效果如下:
blog_iOSCycript04

試想一下,如果MeViewController中或者LoginViewController中有一個方法叫getUserInfo,那麼通過Cycript就可以輕而易舉的拿到使用者資訊。

不過Cycript在這裡最主要的作用還是偷窺APP和除錯APP。
當然,好玩的方法還有很多。

知道了Cycript的可怕,在有重要資訊藏在程式碼中的時候,我們也得學會如何放置Cycript修改執行時。

你可以參考這篇文章

有什麼問題都可以在博文後面留言,或者微博上私信我,或者郵件我[email protected]

博主主要寫javaEE和iOS的。

希望大家一起進步。

我的微博:小魚周凌宇