参考书籍:iOS应用逆向工程第二版
调试其他应用界面,很详细的教程
本文是在调试其他应用界面上补充
通过前几章节的学习我们已经能够通过Reveal查看自己开发程序界面信息,但是从Xcode6开始苹果已经将Reveal查看自己开发程序界面信息的功能集成到了Xcode中, 只需要在程序运行起来之后点击Debug View hierarch按钮即可。

2.iOS设备越狱完成后,需要使用Cydia
安装两个软件:**OpenSSH
和CydiaSubstrate
**
安装OpenSSH,打开越狱后的设备上的Cydia程序,点击搜索输入OpenSSH,然后点击安装。(下面的配图是已经安装成功后搜索的显示画面)


MobileSubstrate是一个公共库,可以用来动态替换内存中的代码、数据等。基本上越狱机下比较有用的系统工具都需要这个库,是Cydia同一个作者维护的,可以放心装。
3.将libReveal.dylib上传到越狱后的设备的/Library/MobileSubstrate/DinamicLibraries
下检查工作:测试OpenSSH和Cydia Substrate是否安装成功
》上传libReveal.dylib文件必须使用到上面安装的OpenSSH工具。如果想要使用OpenSSH工具,那么就必须将Reveal软件所在的mac设备与越狱后的iOS设备置于同一个局域网内。
》首先来测试OpenSSH是否安装成功。获取越狱后的设备的局域网内的IP地址,打开“设置”->“WLAN”,连上局域网,然后再点击连接上的局域网查看iOS设备的IP地址。


》接下来会提示你输入root用户的密码,iOS设备root用户的默认密码是alpine,在终端中输入密码时,终端不会显示你输入的字符,所以只需要输入alpine字符后回车就可以请求连接iOS设备了。(这一步请保证你的iOS设备屏幕已经解锁,不然不会出现输入密码的提示!)


提示那就说明Cydia Substrate安装**不成功**,不成功请重新进入iOS设备上下载安装Cydia Substrate软件。
非也,有可能是安装成功的
cd: /Library/MobileSubstrate/DynamicLibraries: No such file or directory 并不一定就是没安装好Cydia Substrate软件,使用ls -l /Library命令查看里面是否有RHRevealLoader
shujinokinakenkou:~ root# ls -l /Library
total 24
drwxrwxr-x 6 root admin 204 Feb 26 2015 Application Support
drwxrwxr-x 5 root admin 170 Feb 26 2015 Audio
drwxrwxrwt 2 root admin 68 Nov 8 2014 Caches
drwxrwxr-x 2 root admin 68 Nov 8 2014 Filesystems
drwxr-xr-x 3 root admin 102 Jul 2 01:21 Frameworks
drwxrwxr-x 2 root admin 68 Nov 8 2014 Internet Plug-Ins
lrwxr-xr-x 1 root admin 24 Feb 26 2015 Keychains -> ../private/var/Keychains
drwxr-xr-x 2 root wheel 68 Nov 8 2014 LaunchAgents
drwxr-xr-x 2 root wheel 9350 Jul 2 16:00 LaunchDaemons
lrwxr-xr-x 1 root admin 19 Feb 26 2015 Logs -> ../private/var/logs
drwxrwxr-x 2 root admin 102 Nov 8 2014 Managed Preferences
lrwxr-xr-x 1 root admin 27 Feb 26 2015 MobileDevice -> ../private/var/MobileDevice
drwxr-xr-x 3 root wheel 136 Jul 2 18:00 MobileSubstrate
drwxr-xr-x 4 root admin 170 Sep 17 2015 MusicUISupport
drwxr-xr-x 2 root wheel 68 Oct 16 2015 PreferenceBundles
drwxr-xr-x 3 root wheel 102 Jul 2 16:00 PreferenceLoader
lrwxr-xr-x 1 root admin 26 Feb 26 2015 Preferences -> ../private/var/preferences
drwxrwxr-x 2 root admin 68 Nov 8 2014 Printers
drwxr-xr-x 2 root admin 102 Jul 2 16:00 RHRevealLoader
lrwxr-xr-x 1 root admin 29 Jul 1 21:05 Ringtones -> /var/stash/_.3W5Eov/Ringtones
drwxrwxr-x 2 root admin 68 Nov 8 2014 Updates
有RHRevealLoader说明安装是正确的,再使用root# ls -l /Library/RHRevealLoader ,里面有libReveal.dylib
shujinokinakenkou:~ root# ls -l /Library/RHRevealLoader
total 4284
-rw-r--r-- 1 root admin 4384608 Jul 2 16:00 libReveal.dylib
shujinokinakenkou:~ root#
3.1)下一步配置Reveal(三步,很简单)

3.2) 效果图分别为淘宝和appstore的(淘宝的轮播是UIScrollView做的,背景view是大大的collectionView)


4.上传libReveal.dylib。如果上一个步骤的检查工作全部完成:OpenSSH和Cydia Substrate成功安装。
重新打开mac上的终端工具(Terminal),使用如下命令进入Reveal软件的动态库所在目录:cd /Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries


5.编写并上传一份libReveal.plist
到iOS设备的/Library/MobileSubstrate/DynamicLibraries
目录中。这个文件的作用是:在Reveal中监控指定的App,不上传这个文件也是可以的,那么Reveal就会监控所有的App,只是这样速度会慢一点点。编写libReveal.plist文件,最简单的方法就是新建一个plist文件,它的内容是
{ Filter = { Bundles = ( "你要查看的app的bundle Id1","你要查看的app的bundle Id2" ); }; }
xcode下打开这个libReveal.plist文件可以看到它的结构示例(笔者已经添加了两个Bundle ID):



6.上传libReveal.plist
到iOS设备的/Library/MobileSubstrate/DynamicLibraries
目录中。打开终端进入libReveal.plist所在的目录,使用如下命令上传:scp libReveal.plist root@iOS设备的IP地址:/Library/MobileSubstrate/DynamicLibraries/
,请替换@之后的“iOS设备的IP地址”为你的iOS设备的真实地址,回车执行命令后会让你输入iOS设备的root的密码,默认是alpine,上传成功后会显示%100字样。



提示:如果此时在mac上的Reveal左上方没有出现你想要调试的程序,这里给出几个检查的建议:
1.手机连接的wifi是否与mac处于同一局域网(如果你在执行步骤7时是在正确执行步骤5和6之后,那就忽略这个检查,这里是针对手机重启了或者是切换了手机网络等情况)。
2.查看你编写的libReveal.plist文件中写的BundleID是否与你在iOS设备上打开的应用是否匹配。甚至,请检查你的pist文件结构是否正确!
3.iOS设备上想要观察的App应用必须处于前台,进入后台即使打开了,在Reveal的左上角“选择连接的应用”框中也不会显示。
成为iOS顶尖高手,你必须来这里(这里有最好的开源项目和文章)
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上