以很好用的思维导图工具Xmind为主例,其他几个App为辅例,试验与记录app字符串的修改与重签名,仅作学习目的,未行不轨之事。
越狱手机一部,itunes store 下载的xMind.ipa,砸壳工具(下载后编译出dumpdecrypted.dyld),重签名工具.
下载的ipa实际上是个压缩包,可以直接把扩展名改为.zip然后用解压工具解压,或者直接用uzip命令解压:
unzip xmin_cloud.ipa -d xmin_cloud_unziped
解压完成后,xmind_cloud_unziped文件夹应当如此:
进入xmind_cloud_unziped/Payload/XMind Cloud.app
目录,删除可执行文件XMind Cloud
,这个可执行文件是加密加壳过的,派不上用途,需要的是砸壳过的可执行文件。
ip为手机ip, 密码为越狱后打开SSH端口设置的密码,如果没改过,默认是"alpine".
登录成功:
(1)cyctipt方法得到Documents目录:
前提:已在手机上安装cycript命令。
执行
ps -e
命令,列出系统中所有进程,并且很容易找到Xmind进程信息:
得到Xmind的进程ID为:1429,可执行文件的路径为:
进程名就是可执行文件的名称"Xmind Cloud".
执行
cycript -p 进程名
如果注入成功,即可在该进程下执行:
[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
来得到Documents目录.
因此运行命令 cycript -p Xmind Cloud
, 实际上不会成功,因为进程名中间有空格,经过试验,就算 cycript -p "Xmind Cloud"
, cycript -p Xmind\ Cloud
.均不能成功,总是报找不到进程的错误, 而像QQ,进程名就叫QQ,中间没有任何空格,是可以成功的. 后经高手提点,cycript -p 进程ID
也是可以的,因此此例应该执行:
cycript -p 1429
成功注入到进程:
获取Documents目录:
得到Documents目录为:
/var/mobile/Containers/Data/Application/7A2AAC43-55F5-41A2-B648-43B0C2453BF2/Documents/
(2)find命令方法得到Documents目录
如果没有安装cycript,用find命令也可以找出Documents目录:
进入上一步解压出的xmind_cloud_unziped
目录,进入Payload/XMind Cloud.app
目录,用xCode或其他能识别plist文件的工具打开Info.plist文件,看到该应用的Bundld ID是:"net.xmind.sunlight"
进入所有App沙盒目录的上级目录:
cd /var/mobile/Containers/Data/Application
看到所有APP沙盒目录列表:
肉眼是无法找出Xmind对应目录的.
find:
find . -name "net.xmind.sunlight"
得到:
7A2AAC43-55F5-41A2-B648-43B0C2453BF2
就是该App的沙盒根目录,因此得到Documents目录应为:
/var/mobile/Containers/Data/Application/7A2AAC43-55F5-41A2-B648-43B0C2453BF2/Documents
进入Documents查看,拷贝成功
在Documents目录下执行
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可执行文件路径
即:
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib "/var/mobile/Containers/Bundle/Application/EE3623BB-E0C4-4A2D-9B6D-CD75EFF47BB0/XMind Cloud.app/XMind Cloud"
因可执行文件路径中含有空格,因此整个路径要用双引号括起来.其中DYLD_INSERT_LIBRARIES的作用,可参考这篇文章
执行完如下过程,说明砸壳成功:
XMind Cloud.decrypted即为砸壳后的可执行文件:
将'XMind Cloud.decrypted'重命名为XMindCloud.decrypted
,否则下一步拷贝无法成功
mv "XMind Cloud.decrypted" XMindCloud.decrypted
用scp命令将 XMindCloud.decrypted拷贝到解压包目录xmind_cloud_unziped/Payload/XMind\ Cloud.app/
里,同时去掉.decrypted后缀:
scp [email protected]:/var/mobile/Containers/Data/Application/7A2AAC43-55F5-41A2-B648-43B0C2453BF2/Documents/XMindCloud.decrypted xmind_cloud_unziped/Payload/XMind\ Cloud.app/XMindCloud
编辑Info.plist,将可执行文件名由 "XMind Cloud"改为"XMindCloud":
至此,砸壳过程完全结束,可以开始重签名,或者反汇编分析XMindCloud程序了
虽然目前什么都没改动,仅仅是砸了壳,但是可以立刻验证一下重签名后是否可以安装.
本例用开发证书进行重签名. 将mobileprovision
文件和ios_resign_from_app_to_ipa
命令 拷贝到xmind_cloud_unziped同级目录下:
到keyChain找到与该mobileprovision对应的证书,我的为:iPhone Developer: JinKui Ren (MHR5XEJ2E4)
如果希望设备上安装一个原来的App,和另一个重签名过的App,应当修改Info.plist中的Bundle Id值:
否则因为证书冲突,需要卸载掉原来的App,才能安装相同ID的重签名App。
./ios_resign_from_app_to_ipa 解压目录名 证书名 mobileprovision路径 重新名后的ipa名
成功生成ipa:
iTools 或其他工具,直接拖入安装
安装且运行成功,说明重签名没问题,接下来就是修改字符串了.
App的字符串要么在.strings资源文件,或者在Nib,或者在其他资源文件,或者写死在可执行程序.
这种情况是最简短的,要替换字符串,直接编辑.strings文件即可.
strings文件实际上就是plist文件,假设文件全名为:Localizable.strings,直接改为:Localizable.strings.plist即可用Xcode直接编辑.
以另一个XX APP为例,我找到国家化文件夹en.lproj:
将Localizable.strings改名为Localizable.strings.plist, 用Xcode打开:
我希望他在英文界面下,"联系人"一项显示成中文,因此做如图修改,保存,并将文件名改回Localizable.strings,重新签名,安装打开后效果:
编译过的nib文件无法直接编辑,修改方式待研究。
"其他"二字范围甚广,如果app硬是要自己开发一套字符串加载机制,是完全可行的,或者像本例子Xmind一样,核心功能是javascript写的,用的是cordova框架,体验完全原生级别,但是不支持中文:
我将试着将其汉化, App核心逻辑在www文件夹下
经过分析与查找,发现它的字符串写死在“main.4bbfd22776.js”文件的末端:
逐一翻译替换掉:
重签名,安装,成功汉化:
另一个例子, XX App, 启动后首页截图如下:
我想把第一个Tab的标题由"音箱"改为"设备".经过分析,发现该App没有国际化字符串文件,字符串都是写死在程序中的,所以需要分析并修改可执行程序,
将砸壳后的可执行程序拖入Hopper后,进行如下三步:
(1)定位到TabItem的标题设置
查看[AppDelegate application:didFinishLaunchingWithOptions:]
,发现其中调用了一个enterHome
方法,
猜测应该是进入主页的方法,主页是个TabBarController,那么很有可能在这个方法里初始化并设置tabBar,仔细查看果然发现了设置第一个Tab 标题的代码:
标题是个常量字符串:cfstring____1005ef520
,跳转到该字符串定义:
其中高亮选中部分为字符串实际字节,继续跳转,查看它的实际字节内容:
看到该字符串的内容字节为:'f397b17b',后面的0000
是结束标志,'f397b17b'正是"音箱"二字的Unicode编码,那么,只要以"设备"二字的Unicode编码替换掉f397b17b
,即可实现字符串更改,字符串的Unicode 编码可简单些如下两行代码得到:
NSString *s1 = @"设备";
NSData *data = [s1 dataUsingEncoding:NSUnicodeStringEncoding];
比如"设备",打印data得:
<fffebe8b 0759>
前面的fffe指示该字节序列是小端存储,和可执行程序大小端模式相同。即“设备”的Unicode编码就是be8b0759
.
开始替换:
用十六进制编辑工具打开可执行程序,找到f3 97 b1 7b
:
替换为be 8b 07 59
:
保存,重签名,安装打开:
看到“音箱”已经变为"设备",说明操作成功.
遗留问题:可执行文件中,编译期为原来"音箱"二字分配的空间有4+2共6个字节,我修改为相同字节数的“设备”二字,是没问题,可是如果要改为更长的字符串,比如"我的设备"四个字,该如何进行?
进行了最基础的ipa修改与重签名实践。