《iOS底层原理文章汇总》
上一篇文章《iOS-逆向22-砸壳》介绍了砸壳,本文介绍Theos。
1.越狱环境中使用Cycript
I.在Cydia中安装adv-cmds,里面的终端命令比较全,可更好的使用终端,在Cydia中安装Cycript
II.ps -a |grep WeChat查询当前运行的WeChat的进程id
III.使用cycript,cycript -p 6892(进程id或App名称)
2.Cycript引入自己的文件,放置到唯一路径下
I.拷贝hank.cy文件到越狱设备的/usr/lib/cycript0.9目录下
scp -P 12345 ./hank.cy root@localhost:/usr/lib/cycript0.9/
II.执行导入的hank.cy文件中的函数先导入@import hank,执行HKRootvc()
III.将hank.cy文件移动到新建的com.cloud目录中mv hank.cy ./com/cloud/,确保唯一性
com.saurik.substrate目录下存在MS.cy文件,连接cycript导入时@com.aurik.substrate.MS
导入时@import com.cloud.hank
3.安装theos,在安装Monkey时已经配置过,见官网,,Mac上面安装ldid brew install ldid
环境变量配置在~/.zshrc文件中,能全局输入nic.pl即配置成功
4.动态分析支付宝登录密码(仅限于学习知识,不用做任何商业用途)
I.连接手机,进入
cycript -p AlipayWallet
引入插入的python文件@import com.cloud.hank
找到当前控制器HKCurrentVC()
查看当前控制前中的所有子视图
#0x11de2d690.view.recursiveDescription().toString()
由上图得知:密码框属于aluTextField
II.寻找登录按钮,发现中文找不到,转换为unicode编码后查找
AUButton: 0x14ad9b620
获取按钮的所有响应者 #0x14ad9b620.allTargets
响应者两个:AUButton和ALUAccuratePWDView
[NSSet setWithArray:@[#">",#">"]]]
ALUAccuratePWDView
获取按钮的点击事件,对应为64
#0x14ad9b620.allControlEvents
III.获取按钮的相应方法@["onNext"],AUButton(0x14ad9b620)按钮的向下点击事件会调用ALUAccuratePWDView(0x145c2d0f0)对象的什么方法
[#0x14ad9b620 actionsForTarget: #0x145c2d0f0 forControlEvent: 64]
[ALUAccuratePWDView onNext]
IV.dump砸壳后的支付宝ipa包
V.dump头文件
class-dump -H AlipayWallet -o headers/
在ALUAccuratePWDView类中找到登录按钮点击事件方法onNext
VI.动态分析ALUAccuratePWDView类中有aluLoginBox *_loginBox,_loginBox中有aluInputBox *_passwordInputBox,_passwordInputBox中有aluTextField *_textField;
#0x145c2d0f0->_loginBox->_passwordInputBox->_textField
#"; layer = >"
由上面动态分析写出hook代码
%hook ALUAccuratePWDView
-(void)onNext{
//密码
self->_loginBox->_passwordInputBox->_textField
}
%end
5.Theos
I.创建Cydia中的插件,生成alipaypwddemo插件工程
Choose a Template (required): 15
Project Name (required): AlipayPwdDemo
Package Name [com.yourcompany.alipaypwddemo]: com.cloud.alipaypwddemo
Author/Maintainer Name [Cloud]:
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.alipay.iphoneclient
//不写默认杀掉SpringBoard,写了的话杀掉当前的AlipayWallet
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: AlipayWallet
II.采用USB登录,也可IP地址登录
export THEOS_DEVICE_IP=localhost
export THEOS_DEVICE_PORT=12345
TARGET := iphone:clang:latest:7.0
INSTALL_TARGET_PROCESSES = AlipayWallet
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = AlipayPwdDemo
AlipayPwdDemo_FILES = Tweak.x
AlipayPwdDemo_CFLAGS = -fobjc-arc
include $(THEOS_MAKE_PATH)/tweak.mk
III.Hook代码,进行make编译,不能有中文路径,会报错
make[3]: *** No rule to make target `/Users/cloud/Documents/iOS/iOS逆向班/023--Theos/自己的代�', needed by `/Users/cloud/Documents/iOS/iOS逆向班/023--Theos/自己的代码/alipaypwddemo/.theos/obj/debug/armv7/AlipayPwdDemo.dylib'. Stop. make[2]: *** [/Users/cloud/Documents/iOS/iOS逆向班/023--Theos/自己的代码/alipaypwddemo/.theos/obj/debug/armv7/AlipayPwdDemo.dylib] Error 2 make[1]: *** [internal-library-all_] Error 2 make: *** [AlipayPwdDemo.all.tweak.variables] Error 2
没有安装ldid会报错bash: ldid: command not found,解决办法是brew install ldid
bash: ldid: command not found
make[2]: *** [/Users/cloud/Desktop/alipaypwddemo/.theos/obj/debug/AlipayPwdDemo.dylib] Error 127
rm /Users/cloud/Desktop/alipaypwddemo/.theos/obj/debug/AlipayPwdDemo.dylib.47ba6b93.unsigned
make[1]: *** [internal-library-all_] Error 2
make: *** [AlipayPwdDemo.all.tweak.variables] Error 2
没有引入
Hook登录按钮点击事件代码如下
#import
%hook ALUAccuratePWDView
-(void)onNext{
NSLog(@"\n\n\n\n\n\n\n\n\n\n\n\n");
}
%end
IV.打包make package、安装make install,在支付宝中点击登录按钮,通过Xcode控制台可以看到打印,插件安装成功后,手机Cydia中能看到
V.Hook并打印出登录密码,将Tweak.x改为Tweak.xm否则会编译报错
#import
%hook ALUAccuratePWDView
-(void)onNext{
UIView *v1 = MSHookIvar (self,"_loginBox");
UIView *v2 = MSHookIvar (v1,"_passwordInputBox");
UITextField *pwdTextField = MSHookIvar (v2,"_textField");
NSLog(@"密码是:%@",pwdTextField.text);
}
%end
make clean,make package;make install
在Xcode控制台中能看到打印出的密码
注意点:theos中的包名称要小写
6.Reveal Loader
I.在Big Boss源中安装Reveal Loader
安装后在设置页面多了一个Reveal
II.在Reveal中悬着要分析的App(支付宝)
III.安装Reveal软件,打开Reveal->Help->Show Reveal Library in Finder iOS Library中有一个RevealServer可执行文件拷贝到手机中Library下新建的RHRealLoader目录下
正确路径
scp -P 12345 RevealServer root@localhost:/Library/RHRevealLoader/libReveal.dylib
错误路径
scp -P 12345 RevealServer root@localhost:/var/root/Library/RHRevealLoader/libReveal.dylib
!!!有坑,这儿有两个Library路径,一个是/var/root/Library路径,一个是/Library,这儿的路径一定是后者越狱手机下的根目录下的Library文件夹,否则运行Reveal加载不出来,卡了半天原来拷贝路径错了,文件夹的名称一定对上必须是RHRevealLoader
修改钱包余额,不会卡住主线程,可修改后实时刷新,修改的是内存中的值
7.如何在越狱环境中启用LLDB?
I.查看当前运行WeChat的进程Id,Xcode中有Debug->Attach to Process找到WeChat进程Id进行附加
II.进度条变成Running之后,可执行lldb调试语句,pviews,View Debugger
注意点!若遇到pviews报错如下
Traceback (most recent call last):
File "", line 1, in
NameError: name 'lldb' is not defined
error: module importing failed: Traceback (most recent call last):
File "", line 1, in
File "/usr/local/opt/chisel/libexec/fbchisellldb.py", line 12, in
import lldb
ModuleNotFoundError: No module named 'lldb'
则执行#注意,我是用brew安装的(brew install chisel),所以chisel所在的路径是/usr/local/Cellar/chisel/1.8.1,如果你的此路径下面没文件,请改成你自己chisel所在的路径 cd ~/Downloads && git clone https://github.com/chenjiangchuan/chisel.git && cd chisel &&cp -f -R -v libexec /usr/local/Cellar/chisel/1.8.1
详询此篇博文《LLDB 调试工具Chisel兼容Xcode11》,修改了源码兼容了python3
III.LLDB附加原理,Xcode通过iPhone中的dubuggerServer与App进行通信
本地的Xcode里面对应的系统路径/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/9.0里面有一个DeveloperDiskImage.dmg双击,usr/bin目录下有dubugserver,Xcode第一次连接手机,会把对应系统的dubuggerserver装进手机
手机中的debugger路径/Developer/usr/bin
两个debugger是不是同一个文件呢?通过Md5值查看,相等为同一个文件
8.手动启用debuggerserver
Xcode给iPhone中的debuggerserver发送指令必定要与之通信,通过主机地址端口号
./debugserver localhost:12346 -a 4382
配置本地12346端口和远程12346端口对应
process connect connect://localhost:12346,连接成功,可执行lldb指令,pvc,pviews,c继续执行
使用process interrupt暂停,相当于Xcode中的断点
以上为越狱环境的动态调试,Xcode附加需要越狱机器,非越狱机器只能附加自己跑上去的工程,只是没有Xcode中的View Debugger。