Cycript是一個理解Objective-C語法的javascript解釋器,這意味著我們能夠在一個命令中用Objective-C或者javascript,甚至2者兼用。它能夠掛鉤正在運行的進程,能夠在運行時修改應用的很多東西。
使用Cycript有如下好處:
Cycript的官網在http://www.cycript.org/,最新版本是 0.9.501。
在iOS越獄設備上,默認就有這個工具(參見這裡 和 這裡),在iOS的命令行輸入
<code class=" hljs ">cycript </code>
即可。如果你遇到問題,可以在Cydia中把模式切換成開發者,然後搜索Cycript,從Cydia中安裝一下。
當然,你直接從網站上下載到Mac上,然後在上傳到iOS設備上也行。
下面我們介紹Cycript的用法: 首先用命令
<code class=" hljs ">ps aux </code>
找到要分析的應用的pid,然後用命令:
<code class=" hljs ">cycript -pid xxx </code>
如下圖所示:
然後你可以輸入ObjectiveC的語法,比如:
<code class=" hljs json"> [UIApplication sharedApplication] </code>
在Cycrit下:
<code class=" hljs css"><span class="hljs-tag">UIApp</span> 和 <span class="hljs-attr_selector">[UIApplication sharedApplication]</span> 等效 </code>
你甚至可以改提示數字了。此時按Home,讓應用切到後台,然後輸入如下的命令:
<code class=" hljs ">UIApp.applicationIconBadgeNumber=100 </code>
效果如圖:
<code class=" hljs ">UIApp.applicationIconBadgeNumber=200 </code>
效果如圖:
首先,請確保你的iOS設備設置了鎖屏密碼,然後請鎖屏待機。
然後在你的Mac上ssh進你的iOS設備,
<code class=" hljs ruby">ssh root<span class="hljs-variable">@your_ios_device_ip</span> </code>
然後執行如下命令:
<code class=" hljs ">cycript -p SpringBoard </code>
然後輸入:
<code class=" hljs ">SBAwayController.sharedAwayController </code>
如下所示:
<code class=" hljs bash">Tedteki-iPad:~ root<span class="hljs-comment"># cycript -p SpringBoard</span> cy<span class="hljs-comment"># SBAwayController.sharedAwayController</span> <span class="hljs-comment">#"<SBAwayController: 0x1d99aaa0> <SBActivationContext: 0x1d99adf0> activate: deactivate: "</span> </code>
我們向要打印一個類的所有方法,可以使用Cycript Tricks中的printMethods。
繼續輸入:
<code class=" hljs javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">printMethods</span><span class="hljs-params">(className)</span> {</span> <span class="hljs-keyword">var</span> count = <span class="hljs-keyword">new</span> <span class="hljs-keyword">new</span> Type(<span class="hljs-string">"I"</span>); <span class="hljs-keyword">var</span> methods = class_copyMethodList(objc_getClass(className), count); <span class="hljs-keyword">var</span> methodsArray = []; <span class="hljs-keyword">for</span>(<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < *count; i++) { <span class="hljs-keyword">var</span> method = methods[i]; methodsArray.push({selector:method_getName(method), implementation:method_getImplementation(method)}); } free(methods); free(count); <span class="hljs-keyword">return</span> methodsArray; } </code>
然後在命令行中執行:
<code class=" hljs ">printMethods(SBAwayController) </code>
可以得到如下圖所示的信息:
從圖中可以發現這個方法:
<code class=" hljs css"><span class="hljs-rules">{<span class="hljs-rule"><span class="hljs-attribute">selector</span>:<span class="hljs-value">@<span class="hljs-function">selector(unlockWithSound:bypassPinLock:)</span>,implementation:<span class="hljs-number">0</span>x10d6e9</span></span></span>} </code>
即方法:
<code class=" hljs objectivec">-(<span class="hljs-keyword">void</span>)unlockWithSound:(<span class="hljs-built_in">BOOL</span>)arg1 bypassPinLock:(<span class="hljs-built_in">BOOL</span>)arg2; </code>
如下圖:
在cycript中的輸入:
<code class=" hljs json">[SBAwayController.sharedAwayController unlockWithSound:<span class="hljs-number">1</span> bypassPinLock:<span class="hljs-number">1</span>] </code>
你的iOS設備就實現了無密碼解鎖。
Cycript功能非常強大,能夠在運行時對iOS應用做修改,我們會在後面的章節詳細介紹更多用法。