《iOS应用逆向工程》各版本勘误汇总

##第1版
###P29

输入bundle filter,Theos要求我们指定tweak安装完成后需要重启的应用,仍以bundle identifier表示。

改为

输入bundle filter,Theos要求我们指定tweak安装完成后需要重启的应用,以进程名表示。

相应地,图3-14的第8行“com.apple.mobilephone”应改为“MobilePhone”


###P88
因版权争议原因,AppCrackr已被从iPhoneCake源下架,目前所有知名源均不再提供自动砸壳工具。手动砸壳请参照另一篇帖子“用dumpdecrypted给App砸壳”。

##第2版
###P33
第3行,

这里固定填写“arm7 arm64”就行了

改为

这里固定填写“armv7 arm64”就行了

###P26

  1. 定位App的可执行文件

下面

首先把class-dump的

改为

首先把class-dump的

2 个赞

加班返家已12:00+,囫囵吞枣地走读完前言至第3章节,收获颇多,此外,对已读的内容有些小小建议与 snakeninny & hancom 探讨&交流下,请勿怪:
Page 19 2.2.2 Dynamic Library中的 “Static Library 的概念很简单,在一个App启动时,系统会把App的代码和它所链接的Static Library 一股脑放进分配好的内存空间里。”

这个说法不大严谨,Static Library在编译阶段就已经被链接进App的Bin里头,在App被加载时已经区分不出代码段是由 object 文件还是由 static library产生的,static library的最大问题是消耗系统的物理内存,而dynamic library在被多个App所链接时,实际只消耗一份物理内存。

2 个赞

感谢提醒,这里我们确实不太严谨!
不过我还有一个疑问,就是虽然static library在编译时就已经链接到了executable里,但是从macho的头部可以知道这个executable链接了哪些lib(otool -L foo),而IDA也可以知道一个代码段的符号是不是imported,因此我猜测“一个代码段是由object本身还是lib产生的”是可以区分的(但是我不知道是otool提不提供类似功能),是这样吗?

反汇编中能够看到符号所属的静态库信息应该是在编译阶段加入了DEBUG选项,将符号信息添加到了Bin文件中。

不是,即使strip了symbol table,public symbol还是可以看到的。我又查了一下,在strip过的dylib上调用“nm -m stripped.dylib”,还是可以把public symbol所属的lib都显示出来,这说明“一个代码段是由object本身还是lib产生的”是可以区分的,是吧?

对于有share object依赖的Bin,ELF Load是要做特殊处理的以便在运行时加载so,对于.a静态库是在编译阶段就链入bin文件的.text段,如果没有额外加debug选项,是无法从Bin文件中拆解出.text段符号的object信息的,即便是加了debug选项,这些额外的信息也是供代码分析工具以及人肉使用,对于load本身并不关注。

小小样例,main中call .a/.so的sum操作,代码、关键的符号表以及关键的反汇编如图(BTW:论坛如果能够添加常用的程序设计语言的语法高亮就好了,支持Markdown就更棒了)

1 个赞

原来如此,学习了!我没有用过.a静态库,在iOS上碰到的全是动态库,所以实验都是做在动态库上的,看来还是学艺不精!
另:刚装了个语法高亮插件,不知道管不管用;markdown插件没有找到,回头我再搜一搜

p26的Theos的获取链接是https://github.com/DHowett/theos.git

好像很厉害的样子~

git://和https://都是可以的

在2.1.1 节 讲文件结构时 有处笔误

/private: 存放两个目录, /private/etc 和 /private/var

紧接着在下面讲 /tmp时说是一个符号链接,指到 /private/tmp
这样的话,/private下就不是两个目录了吧,应该是3个。不知道是否理解有误。:3_52:

这个应该是作者的一个笔误 。
/private: 存放两个目录, /private/etc 和 /private/var

/tmp 目录指到 /private/var/tmp

补充一下:楼主的纠正是在iphone上的情况。如果是在ipad上测试的话:

ipad上的进程是
/System/Library/CoreServices/SpringBoard.app/SpringBoard
因此填入SpringBoard在测试机是ipad的情况下是正确的

我的测试机是ipad mini,这个例子的测试已经通过。最重要的是ARCHS参数是arm64
这个参数是在ipad上安装apt-get再安装命令工具后,使用uname -a看到的,如下:
Darwin lilylee 14.0.0 Darwin Kernel Version 14.0.0: Fri Sep 27 23:08:32 PDT 2013; root:xnu-2423.3.12~1/RELEASE_ARM64_S5L8960X iPad4,4 arm64 J85AP Darwin
另外环境变量要export THEOS_DEVICE_IP=你的部署设备ip,否则make不过去
####################################

贴一下:
Makefile如下:
####################################
THEOS_DEVICE_IP = 192.168.0.10
ARCHS = arm64
TARGET = iphone

include theos/makefiles/common.mk

TWEAK_NAME = iOSRE
iOSRE_FILES = Tweak.xm
iOSRE_FRAMEWORKS = UIKit

include $(THEOS_MAKE_PATH)/tweak.mk

after-install::
install.exec “killall -9 SpringBoard”
####################################
control文件如下:
####################################
Package: com.naken.iosre
Name: iOSRE
Depends: mobilesubstrate, firmware (>= 5.0)
Version: 0.0.1
Architecture: iphoneos-arm
Description: An awesome MobileSubstrate tweak!
Maintainer: user
Author: user
Section: Tweaks
####################################
iOSRE.plist 文件如下:
{ Filter = { Bundles = ( “com.apple.springboard” ); }; }
####################################

楼主,我发现在书的第七章OPlayer Lite中找到那个广告view对应的class的时候,其实可以用cycript把进程attach上,然后把整个view hierarchy打印出来,那么就可以看到在其中只有GADBannerView而没有ADBannerView了,并且可以得到GADBannerView的instance的地址,从而直接在这个地址对应的object上调用[obj setHidden:YES]来测试效果,调用完成后那个广告栏就消失了,证明用的确实是GADBannerView.
跟您用一些hook的方法证明用的是GADBannerView是殊途同归的:smile:

你的办法确实比书上的更好!但对于这种图片来说,cycript还是不够直观,上reveal更简单粗暴:lol:

Aha ,I find a spelling mistake
Page229:
The fourth line of Tweak.xm, Initialize instead of Initialze

1 个赞

第二版
P26
“首先把带class-dump的App拷贝到OSX中”
“待”误写成“带”。

第二版印刷错误

P33.

中间部分
iOSREProject_FRAMEWORKS = UIKit ... iOSREProject_PRIVATE_FRAMEWORKS = ...

最下面写成了 iOSREProject_PRIVATE_FRAMEWORK = ....

这里应该都是 复数 吧。

P35

上面部分
iOSREProject_LDFLAGS = -lz -lsqlite3.0 -dylibl.o
最后的-dylibl.o 前少了 -l

1 个赞