iOS-逆向23-Theos

《iOS底层原理文章汇总》
上一篇文章《iOS-逆向22-砸壳》介绍了砸壳,本文介绍Theos。

图片.png

1.越狱环境中使用Cycript

I.在Cydia中安装adv-cmds,里面的终端命令比较全,可更好的使用终端,在Cydia中安装Cycript
II.ps -a |grep WeChat查询当前运行的WeChat的进程id


图片.png

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()

图片.png

III.将hank.cy文件移动到新建的com.cloud目录中mv hank.cy ./com/cloud/,确保唯一性
com.saurik.substrate目录下存在MS.cy文件,连接cycript导入时@com.aurik.substrate.MS
图片.png

导入时@import com.cloud.hank


图片.png

3.安装theos,在安装Monkey时已经配置过,见官网,,Mac上面安装ldid brew install ldid环境变量配置在~/.zshrc文件中,能全局输入nic.pl即配置成功

图片.png
图片.png

4.动态分析支付宝登录密码(仅限于学习知识,不用做任何商业用途)

I.连接手机,进入cycript -p AlipayWallet
引入插入的python文件@import com.cloud.hank
找到当前控制器HKCurrentVC()
查看当前控制前中的所有子视图
#0x11de2d690.view.recursiveDescription().toString()

图片.png

由上图得知:密码框属于aluTextField


图片.png

II.寻找登录按钮,发现中文找不到,转换为unicode编码后查找


图片.png
图片.png

AUButton: 0x14ad9b620
获取按钮的所有响应者 #0x14ad9b620.allTargets
响应者两个:AUButton和ALUAccuratePWDView

[NSSet setWithArray:@[#">",#">"]]]
ALUAccuratePWDView

获取按钮的点击事件,对应为64
#0x14ad9b620.allControlEvents

图片.png

III.获取按钮的相应方法@["onNext"],AUButton(0x14ad9b620)按钮的向下点击事件会调用ALUAccuratePWDView(0x145c2d0f0)对象的什么方法
[#0x14ad9b620 actionsForTarget: #0x145c2d0f0 forControlEvent: 64]
[ALUAccuratePWDView onNext]

图片.png

IV.dump砸壳后的支付宝ipa包


图片.png

V.dump头文件class-dump -H AlipayWallet -o headers/在ALUAccuratePWDView类中找到登录按钮点击事件方法onNext

5.gif

图片.png

VI.动态分析ALUAccuratePWDView类中有aluLoginBox *_loginBox,_loginBox中有aluInputBox *_passwordInputBox,_passwordInputBox中有aluTextField *_textField;
图片.png

图片.png
图片.png
#0x145c2d0f0->_loginBox->_passwordInputBox->_textField
#"; layer = >"
图片.png

由上面动态分析写出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
图片.png

图片.png

图片.png

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
图片.png

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

图片.png

没有安装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
图片.png

没有引入会报错无法识别NSLog符号
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中能看到


图片.png

图片.png

图片.png

图片.png

V.Hook并打印出登录密码,将Tweak.x改为Tweak.xm否则会编译报错


图片.png

图片.png
#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


图片.png

在Xcode控制台中能看到打印出的密码


图片.png

4.gif

注意点:theos中的包名称要小写


图片.png

6.Reveal Loader

I.在Big Boss源中安装Reveal Loader
安装后在设置页面多了一个Reveal


图片.png

图片.png

II.在Reveal中悬着要分析的App(支付宝)


图片.png

III.安装Reveal软件,打开Reveal->Help->Show Reveal Library in Finder iOS Library中有一个RevealServer可执行文件拷贝到手机中Library下新建的RHRealLoader目录下


图片.png

图片.png

正确路径
scp -P 12345 RevealServer root@localhost:/Library/RHRevealLoader/libReveal.dylib
错误路径
scp -P 12345 RevealServer root@localhost:/var/root/Library/RHRevealLoader/libReveal.dylib

图片.png

图片.png

图片.png

!!!有坑,这儿有两个Library路径,一个是/var/root/Library路径,一个是/Library,这儿的路径一定是后者越狱手机下的根目录下的Library文件夹,否则运行Reveal加载不出来,卡了半天原来拷贝路径错了,文件夹的名称一定对上必须是RHRevealLoader

修改钱包余额,不会卡住主线程,可修改后实时刷新,修改的是内存中的值


图片.png

图片.png

7.如何在越狱环境中启用LLDB?

I.查看当前运行WeChat的进程Id,Xcode中有Debug->Attach to Process找到WeChat进程Id进行附加


图片.png

图片.png

II.进度条变成Running之后,可执行lldb调试语句,pviews,View Debugger


图片.png

注意点!若遇到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进行通信


图片.png

本地的Xcode里面对应的系统路径/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/9.0里面有一个DeveloperDiskImage.dmg双击,usr/bin目录下有dubugserver,Xcode第一次连接手机,会把对应系统的dubuggerserver装进手机


图片.png

手机中的debugger路径/Developer/usr/bin
图片.png

两个debugger是不是同一个文件呢?通过Md5值查看,相等为同一个文件


图片.png

8.手动启用debuggerserver

Xcode给iPhone中的debuggerserver发送指令必定要与之通信,通过主机地址端口号
./debugserver localhost:12346 -a 4382

图片.png

配置本地12346端口和远程12346端口对应
图片.png

process connect connect://localhost:12346,连接成功,可执行lldb指令,pvc,pviews,c继续执行
图片.png

图片.png

图片.png

使用process interrupt暂停,相当于Xcode中的断点
图片.png

图片.png

图片.png

以上为越狱环境的动态调试,Xcode附加需要越狱机器,非越狱机器只能附加自己跑上去的工程,只是没有Xcode中的View Debugger。

你可能感兴趣的:(iOS-逆向23-Theos)