Skip to content

Latest commit

 

History

History
313 lines (184 loc) · 13.3 KB

want-chinese-xmind.md

File metadata and controls

313 lines (184 loc) · 13.3 KB

以很好用的思维导图工具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,这个可执行文件是加密加壳过的,派不上用途,需要的是砸壳过的可执行文件。

砸壳

1.在越狱手机上安装xMind,杀掉所有其他应用,单独打开xMind.

2.Terminal 执行 ssh root@ip,登录到手机.

ip为手机ip, 密码为越狱后打开SSH端口设置的密码,如果没改过,默认是"alpine".

登录成功:

3.找出xMind进程的沙盒目录Documents

(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

4.拷贝dumpdecrypted.dylib到Documents目录

进入Documents查看,拷贝成功

5.砸壳

在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

6.拷贝砸壳文件

用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程序了

重签名

虽然目前什么都没改动,仅仅是砸了壳,但是可以立刻验证一下重签名后是否可以安装.

1.证书与工具

本例用开发证书进行重签名. 将mobileprovision文件和ios_resign_from_app_to_ipa命令 拷贝到xmind_cloud_unziped同级目录下:

到keyChain找到与该mobileprovision对应的证书,我的为:iPhone Developer: JinKui Ren (MHR5XEJ2E4)

2.按需修改Bundle ID,Display Name

如果希望设备上安装一个原来的App,和另一个重签名过的App,应当修改Info.plist中的Bundle Id值:

否则因为证书冲突,需要卸载掉原来的App,才能安装相同ID的重签名App。

2.重签名

 ./ios_resign_from_app_to_ipa 解压目录名 证书名 mobileprovision路径 重新名后的ipa名

成功生成ipa:

3.安装测试

iTools 或其他工具,直接拖入安装

安装且运行成功,说明重签名没问题,接下来就是修改字符串了.

修改字符串

App的字符串要么在.strings资源文件,或者在Nib,或者在其他资源文件,或者写死在可执行程序.

1.字符串在.strings文件

这种情况是最简短的,要替换字符串,直接编辑.strings文件即可.

strings文件实际上就是plist文件,假设文件全名为:Localizable.strings,直接改为:Localizable.strings.plist即可用Xcode直接编辑.

以另一个XX APP为例,我找到国家化文件夹en.lproj:

将Localizable.strings改名为Localizable.strings.plist, 用Xcode打开:

我希望他在英文界面下,"联系人"一项显示成中文,因此做如图修改,保存,并将文件名改回Localizable.strings,重新签名,安装打开后效果:

2.字符串在.nib文件

编译过的nib文件无法直接编辑,修改方式待研究。

3.字符串在其他资源文件

"其他"二字范围甚广,如果app硬是要自己开发一套字符串加载机制,是完全可行的,或者像本例子Xmind一样,核心功能是javascript写的,用的是cordova框架,体验完全原生级别,但是不支持中文:

我将试着将其汉化, App核心逻辑在www文件夹下

经过分析与查找,发现它的字符串写死在“main.4bbfd22776.js”文件的末端:

逐一翻译替换掉:

重签名,安装,成功汉化:

4.字符串写死在程序

另一个例子, 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修改与重签名实践。