iOS逆向学习【1~32】
【chechra1n、Cydia、sshopen、vim、Cycript、adv-cmds、afc2】
《第一课、课程简介》1、学习越狱对工作有哪些好处
《第二课、学习条件》1、完美越狱http://jailbreak.25pp.com/ios2、建议至少iPhone 5S(5S开始支持arm64架构)
《第三课、越狱的优点和缺点》·优点1、Jailbreak利用iOS漏洞,获取iOS最高权限2、可安装很多插件、主题、App3、修改系统App的一些默认行为4、自由安装非App store来源App5、付费变免费1129484756、灵活管理文件系统7、给开发者提供了逆向工程的环境·缺点1、不予保修2、费电3、iOS固件出来不能及时更新每个新版本都会修复上个版本的漏洞需要等新的版本支持越狱才能更新4、不再受iOS安全保护,容易受攻击,不要乱装东西5、如果安装了不稳定插件,容易出现不稳定、变慢,甚至白苹果
《第四课、完美越狱和不完美越狱》1、完美:越狱之后可以正常开关机2、不完美:一旦关机后再开机,出现白苹果;开机后已安装的破解软件无法正常使用,需要将设备与PC连接,使用软件引导才能使用3、不完美先发布,完美才发布4、越狱方法推荐a、PP助手b、爱思助手5、判断越狱成功a、桌面是否有Cydiab、PP助手显示已越狱
《第五课、Cydia》1、可认为是越狱后的App store2、作者:Jay Freeman(saurik)3、安装软件步骤:a、添加软件源b、进入软件源找到软件,开始安装c、搜索会在已添加的软件源里搜索4、重启SpringBoard(iOS桌面)
《第六课、必备软件安装》1、Apple File Conduit “2”在Mac上可访问整个iOS设备文件系统Mac iPhone Box2、AppSync Unified可以绕过系统验证,随意安装、运行破解的ipa安装包3、iFile在iPhone上可访问整个iOS文件系统4、PP助手自由安装App5、Cydia安装包是deb格式(插件),结合软件包管理工具apt6、PP助手安装的是IPA格式(应用)7、安装失败先在网上下载deb(搜索ifile deb),然后将deb拖到/var/root/Media/Cydia/AutoInstall,重启手机,会自动安装8、【iPhone安装afc2插件,电脑安装爱思助手,就可以访问所有文件了】
《第七课、怎么判断设备是否已经越狱》1、使用代码,判断设备是否已经安装Cydia 搜索iOS代码判断越狱 if ([[NSFileManager default] fileExistsAtPath:@"/Applications/Cydia.app"])
《第八课、提高工作效率的工具》1、Alfred:便捷搜索、工作流【good】 自定义快捷键打开指定App2、XtraFinder:增强型Finder【shit】3、iTerm2:完爆Terminal的命令行工具4、Go2Shell:从Finder快速定位到命令行工具 点击Finder的笑脸,直接进入终端对应位置【good】
《第九课、SSH01-简介》1、Mac远程登录到iPhone,使用命令行操作iPhone、Mac与iPhone建立远程连接2、SSH Secure Shell 安全外壳协议 可以为远程登陆提供安全保障的协议 SSH可以把所有传输的数据进行加密,“中间人”攻击方式不可能实现,防止DNS欺骗和ID欺骗3、OpenSSH SSH协议的免费开源实现 可以通过OpenSSH的方式让Mac远程登录到iPhone
《第十课、SSH02-Mac远程登录到IP》1、在iPhone上通过Cydia安装OpenSSH工具2、SSH是通过TCP协议通信,要确保Mac和iPhone在同一局域网,比如链接同一个WiFi3、在Mac终端输入 ssh 账户名@域名主机地址 【ssh root@10.1.1.192】【yes】【默认密码alpine】【cd /】【ls -l】4、登陆成功后,就可以使用终端命令操作iPhone5、退出命令exit
《第十一课、SSH03-root、mobile》1、iOS下两个常用账户: root:最高权限账户 /var/root【#】 mobile:普通权限账户,只能操作一些普通文件,不能操作系统级别文件 /var/mobile 【$】2、修改账户密码 登录root账户之后 passwd、passwd mobile
《第十二课、SSL和SSH》 SSL:Secure Sockets Layer 是为网络通信提供安全及数据完整性的一种安全协议,再传输层对网络链接进行加密 OpenSSL:SSL的开源实现,绝大数HTTPS请求等价于:HTTP+OpenSSL,OpenSSH的加密就是通过OpenSSL完成的
《第十三课、SSH05-安全连接》1、SSH版本:SSH-1、SSH-22、SSH-2使用较多,客户端和服务器版本要一致才能通信3、查看SSH版本(查看配置文件的Protocol字段)
客户端ssh_config 服务端sshd_config4、SSH通信过程三大主要阶段 a、建立安全连接:服务器提供身份证明、公钥私钥 b、客户端验证 c、数据传输
《第十四课、服务器公钥的保存和更变》1、修改公钥信息 ~/.ssh/known_hosts vim known_hosts 找到对应的公钥,删除,保存退出,重新登录2、ssh-keygem -R 10.1.1.193 即可删除服务器公钥信息
《第十五课、SSH-07客户端认证》1、基于账号密码的认证2、基于密钥的认证(默认方式)3、客户端生成公钥私钥,将公钥内容追加到服务器的授权文件尾部,然后登陆验证(cat ~/.ssh/authorized_keys)4、【ssh-keygen】【回车回车回车】生成id_rsa、id_rsa.pub5、【ssh-copy-id root@10.1.1.193】会自动操作行不通,换成【ssh-copy-id ~/id_rsa.pub root@192.168.1.102】即可6、【ssh root@10.1.1.193】回车后不用输密码会自动登录(注意只是root生效,如果mobile也要生效,同理)
《第十六课、SSH-08远程拷贝-文件权限》1、scp是基于SSH登陆进行安全的远程文件拷贝命令,可将一个文件拷贝到远程另一台主机上【scp ~/.ssh/id_rsa.pub root@10.1.1.193:~/.ssh】【登录服务器,进入~/.ssh】【cat id_rsa.pub >> authorized_keys】【重新登录试试】2、给文件或文件夹配置权限【chmod 755 ~】【chmod 755 ~/.ssh】【chmod 644 ~/.ssh/authorized_keys】
《第十七课、SSH-09端口》1、端口【0~65535 2^16】2、21端口:提供FTP服务3、80端口:HTTP服务4、22端口:SSH服务(/etc/ssh/sshd_config的Port字段)(TCP协议)
《第十八课、SSH-10 USB连接》1、速度会更快2、usbmuxd (默认开机自动开启)可以将Mac数据通过USB传给iPhone3、Mac先ssh登录到自己的本地端口10010,(非预留端口即可)再使用usbmuxd进行端口数据传输10010->22
《第十九课、SSH-11 usbmuxd01使用》1、下载usbmuxd,只留下python的脚本tcprelay.py2、将iPhone的22端口映射到Mac本地的10010端口【python tcprelay.py 22:10010】(卡住即代表OK,可另起一个终端操作其他)(-t 可支持多个)3、Mac登录本地10010端口【ssh root@localhost -p 10010】(127.0.0.1 虚拟网卡ip地址)
《第二十课、SSH-12 usbmuxd01总结》1、拷贝数据【scp ~/.ssh/id_rsa.pub root@localhost:~ -P 10010】
《第二十一课、SSH-13 sh脚本》1、将经常使用的命令行放到shell脚本2、执行脚本【sh usb.sh】【bash usb.sh】shell会启动一个子进程来执行,完成后回到父进程环境【source usb.sh】(可以用 . 来表示)在当前进程执行shell
《第二十二课、SSH-14 iPhone终端中文输入》1、iPhone默认不支持中文2、直接新建一个文件~/.inputrc不再将中文转义序列【set convert-meta off】允许终端输出中文【set output-meta on】允许终端输入中文【set meta-flag on】【set input-meta on】3、默认iPhone是没有安装vim的,需要使用Cydia安装vim
《第二十三课、Cycipt-01 基本使用》1、Object-C++、EX6(JavScript)、Java等语法的混合物2、可以用来探索、修改、调试正在运行的Mac/iOS App3、使用Cydia安装Cycript(安装失败的话,重装new curses再试,即可)4、开启和关闭【cycript -p 进程ID】、【cycript -p 进程名称】进入【ctrl + D】退出【ctrl + C】取消输入5、ps命令(process status)使用Cydia安装adv-cmds【ps -A】查看所有进程【ps -A | grep 关键词】关键词搜索6、常用cycript语法(等价于)UIApp [UIApplication sharedApplication]7、定义变量var app = UIApp.keyWindowsvar redView = [[UIView alloc] initWithFrame:CGRectMake(0,0,100,100)] // 报错8、用内存地址获取对象【#内存地址】
《第二十四课、Cycipt-02 常用语法》1、【ObjectiveC.classes】查看当前App使用到的所有类2、【*对象】查看对象的所有成员对象3、【UIApp.keyWindow.recursiveDescription().toString()】递归打印view的子控件(跟LLDB一样,控制台)4、【choose(类名)】筛选出类名相关的对象
《第二十五课、Cycipt-03 定位登录方法》1、基于Cycript封装的工具库MJTool.js【scp -P 10010 ~/MJTool.js root@localhost:/usr/lib/cycript0.9/MJTool.cy】2、进入cy环境后,导入库【@import MJTool】3、使用案例【MJTopVc()】 获取最前面的控制器【MJInstanceMethodName(对象)】打印出某个对象的所有对象方法名【MJInstanceMethodName(对象, /login/)】筛选出带login的方法名【MJClassMethodName(对象)】打印出某个对象的所有类方法名
《第二十六课、Cycipt-04 定位文本输入框》1、【MJSubview(视图对象)】递归打印该视图的所有子视图2、cycript环境下的汉字都以unicode形式显示,可以利用python得到汉字的unicode【python】终端输入即可进入python环境【unicode('登录', 'UTF-8')】获取“登录”的unicode值
《第二十七课、Cycipt-05 小结》1、去广告so esay
《第二十八课、Cycipt-06 封装cy头文件》1、新建文件tool.cy,使用编辑器编辑【(funtion(exports) {
// 在这里编写内容(注意写法)export.sum = funtion(a,b) {return a+b;};
})(exports);】2、将tool.cy拷贝到iPhone【scp -P 10010 ~/tool.cy root@localhost:/usr/lib/cycripy0.9】3、在cycript环境中使用tool.cy(需要重启App)【@import tool】导入【tool.sum(1,2)】4、exports参数名固定,用于向外提供接口
《第二十九课、Cycipt-07 exports》1、简化【kAppId = exports.appid = [NSBundle mainBundle].bundleIdentifier;】可直接使用kAppId2、tool.cy文件里的内容只会执行一遍,对于某些可变的属性,尽量不要在此处定义,可以使用方法的形式// RootVCkRootVC = exports.RootVC = function() {return UIApp.keyWindow.rootViewController;};3、属性的调用直接写就好,但是方法的调用,尾部记得加()【kRootVC】错误【kRootVC()】正确4、沙盒路径
《第三十课、Cycipt-08 全局函数》1、直接赋值,即为全局的【kRootVC = function() {return UIApp.keyWindow.rootViewController;};】2、为了避免与其他作者的库冲突,可以使用多层文件夹的形式存放我们的cy库文件【/usr/lib/cycript0.9/com/cyc666/CTool.cy】3、导入库【@import com.cyc666.CTool】4、使用【CTool.appid】5、还是放在cycript0.9目录吧,比较方便
《第三十一课、Cycipt-09 Cycript库》1、https://github.com/CoderMJLee/mjcript2、【MJLoabFrameWork("库名")】将非UIKit库加载到内存里3、cmd+R,清空cycript终端信息4、【MJChildVcs(控制器对象)】查看控制器的结构5、【MJSubclasses("对象类名")】查看类的所有子类
《第三十二课、Cycipt-10 微信练习》1、修改金额
哈哈
iOS逆向学习【33~60】
【chechra1n、Cydia、sshopen、vim、Cycript、adv-cmds、afc2】【Reveal、class-dump、Hopper、Clutch、dumpdecrypted】
《33、Reveal》1、Mac快够快速调试正在运行App的UI2、Mac下载:https://revealapp.com/download/4版本起才支持USB调试3、iPhone通过Cydia安装Reveal Loader源:http://apt.so/codermjlee4、重启桌面:【killall SpringBoard】5、重启手机:【reboot】6、找到Mac的Reveal中的RevealServer文件,Reveal-help-show Reveal Librery - iOS Library7、覆盖iPhone中/Library/RHRevealLoader/RevealSServer文件(一般没有这个目录,自己创建)8、手机设置-Reveal-Enabled Applications-打开想要调试的APP9、【killall SpringBoard】重启桌面【reboot】或者重启手机(可能需要重新越狱)10、如果上面的方法行不通,可参考https://www.jianshu.com/p/6cac1052879da、Mac 安装Reveal ,成功之后打开下图对应的文件夹,点击 RevealServer.framework ,把 RevealServer.framework 目录下的 RevealServer 改名为 libReveal.dylib 拷贝到手机上的 /Library/RHRevealLoader(一般没有这个目录,自己创建:我是这样创建的在Mac创建RHRevealLoader,把libReveal.dylib加到其中,然后整个RHRevealLoader文件夹copy到iOS 手机上的 /Library 目录下) 目录中即可。b、把电脑上的RevealServer.framework 拷贝到手机上的/System/Library/Frameworks 目录下
《34、ipa的安装》1、【项目编译、链接、签名】 -> app(Mach-O可执行文件、资源文件) -> 【zip压缩】-> IPA2、所有代码都在Mach-O文件里
《35、逆向App的思路》1、界面分析:Cycript、Reveal2、代码分析:对Mach-O文件的静态分析,MachOView、class-dump、Hopper Disassembler、ida等3、动态调试:对运行中的APP进行代码调试,debugserver、LLDB4、代码编写:注入代码到App,重签名,打包ipa
《36、class-dump01 基本使用》1、作用:把Mach-O文件的class信息导出来,生成.h头文件2、官方地址:http://stevenygard.com/projects/class-dump/(官网下载的不支持混编)第三方:https://github.com/AloneMonkey/MonkeyDev/blob/master/bin/class-dump(需要修改权限)3、将class-dump文件移动到:/usr/local/bin,这样终端就能识别4、使用方法【class-dump -H Mach-O文件路径 -o 头文件存放目录】
《37、class-dump 细节》1、可用subline、Xcode等工具去查阅头文件
《38、代码编译的过程》1、OC语言 -> 【编译(不可逆)】 -> 汇编预语言 -> 【编译(可逆,反编译)】-> Mach-O文件(16进制的机器语言)2、在同一种架构平台下,每一条汇编指令都有与之对应的唯一机器指令3、让断点进入到汇编代码【Xcode - Debug - Debug Workflow - Always ShowDisassembly】4、不同的OC代码,编译出来的汇编代码可能是一样的
《39、Hopper01 使用》1、汇编不能反编译出源代码,但是可以使用反编译出个大概2、作用:将Mach-O文件的机器代码反编译出汇编代码、OC代码或swift代码(伪代码)
《40、Hopper02 UIKit伪代码分析》1、查找UIKit框架生成的Macoh-O文件【a、在Mac查找xcode系统库的位置查找】【b、cycript使用MJLookFramework('UIKit')】
《41、遗留问题解决》1、【./itnl --iport 22 lport 10010】另一个连接端口的工具2、链接动态库【MJLoadFramework("Photos")】【var asset = [[PHAssets alloc] init]】3、遇到问题a、认真看视频、PPTb、尝试几次,搜索c、群里交流d、私信交流
《42、dec01 简介》1、动态库共享缓存(dyld shared cache),节省内存/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX2、X代表ARM处理器指令集,向下兼容armv6、armv7、armv7s、armv643、ida、Hopper可以识别
《43、dec02 优点》1、共享缓存
《44、dec03 dyld》1、App运行中加载动态库,使用了/usr/lib/dyld程序来加载动态库2、dynamic link editor 动态链接编辑器3、dyld源码https://opensource.apple.com/tarballs/dyld/
《45、dec04 dec_extractor》1、编译dec_extractor.cpp文件【clang++ -o dec_extractor dec_extractor.cpp】2、使用dec_ectractor从共享缓存中抽取动态库文件【./dec_extractor dyld_shares_cache_armv7s armv7s】
《46、Mach-object01 文件类型》1、Mach-O是Mach object的缩写,是Mac/iOS上用于储存程序、库的标准格式2、Mac系统内核xnu源码,可以查看到Mach-O格式的定义https://opensource.apple.com.tarballs/xnu/3、常见Mach-O文件类型a、MH_OBJECT:编译完成的目标文件.o,静态库文件.ab、MH_EXECUTE:可执行文件c、MH_DYLIB:动态库文件.dylib,.framework/xxd、MH_DYLINKER:动态链接编辑器/usr/lib/dylde、MH_DSYM:存储二进制文件符号信息的文件.dSYM/Contents/Resources/dwarf/xx(常用语分析App的崩溃信息)4、查看文件类型【file test.o】5、查找文件【find . -name "*.a"】
《47、Mach-object03 Universal Binary》1、Universal Binary 通用二进制文件2、Fat Binary 胖二进制文件3、【lipo -info Test】查看二进制文件信息4、【lipo Test -thin armv7 -output Test_armv7】瘦身,抽取出只有armv75、【lipo -create Test_arm64 Test_armv7 -output Test2】合并两种架构
《48、Mach-O的基本结构01》1、Header 文件类型、目标架构类型等2、Load commands 描述文件在虚拟内存中的逻辑结构、布局3、Ram segment data 原始数据
《50、Mach-O object05基本结构02》1、otool 使用命令行模式查看Mach-O文件信息
《51、Mach-O object06 基本结构03》1、MachOView 可视化的显示Mach-O文件 https://github.com/gdbinit/MachOView2、下载后打开Xcode工程,修改SDK版本,运行3、open打开Mach-O文件
《52、Mach-O object07 基本结构04》1、使用Mach-OView查看Mach-O文件是最好的
《53、Mach-O object08 dyld和Mach-O的关系》1、dyld用于加载以下类型的Mach-O文件 MH_EXECUTE、MH_DYLIB、MH_BUNDLE2、App的可执行文件和动态库都是由dyld加载的
《54、疑难解答》1、
《55、初识加壳》1、可以使用ps -A 查看应用可执行文件的路径2、App Store会对可执行文件进行加壳操作3、加壳之后的可执行文件是解释不了的,class-dump、Hopper无法操作4、PP助手下载的ipa都是已经解密过了
《56、加壳原理》1、利用特殊的算法,对可执行文件进行改变(压缩、加密),以达到保护程序的代码的目的2、加壳前:可执行文件---【执行】---内存(可执行文件)3、加壳后:壳程序(可执行文件(已加密))---【执行】---内存(壳程序(可执行文件(已加密)))---【解密】---内存(壳程序(可执行文件))
《57、脱壳》1、将未加密的可执行文件还原出来(也叫“砸壳”)2、两种脱壳方法:硬脱壳:将硬盘上的可执行文件,执行解密算法动态脱壳:将运行在内存中的解密的可执行文件,从内存中导出到硬盘上3、iOS中采取硬脱壳的方式a、Clutch:https://github.com/KJCracks/Clutchb、dumpdecrypted:https://github.com/stefanesser/dumpdecrypted/
《58、LC_ENCYPTION_INFO》1、使用Mach-O打开可执行文件,查看Load commands中的LC_ENCYPTION_INFO,Crypt_ID 表示加密方式,非0则加过密2、【otool -l xxx | grep crypt】 查看可执行文件的加密方式
《59、脱壳工具 01 Clutch》1、下载Clutch之后,传到手机上去【/usr/bin/Clutch】2、如果权限不足,可修改权限【chmod +x /usr/bin/Clutch】3、【Clutch -i】罗列出所有被加壳的app4、【Clutch -d 序号/ID】将某个加密的App解密,并生成ipa,导出到文件夹【/private/var/mobile/Documents/....ipa】/private是引用替身的意思
《60、脱壳工具 02 dumpdecrypted》1、将源代码编译成动态库2、执行Makefile,需要在当前文件夹3、将动态库文件dylib,拷贝到iPhone 【/var/root】4、终端进入dylib文件夹5、使用环境变量DYLD_INSERT_LIBRARIES将dylib注入到需要脱壳的可执行文件【DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib ipa路径】可用【ps -A】找到ipa可执行文件的路径6、会生成.decrypted文件,这个是脱壳成功后的文件。可以将后缀名去掉,是可执行文件7、砸壳报错dyld: warning: could not load inserted library 'dumpdecrypted.dylib' into hardened process because no suitable image found.解决方案:使用命令【ldid -S dumpdecrypted.dylib】进行签名,再执行砸壳命令
哈哈
iOS逆向学习【61~】
【Reveal、ldid、Theos】
《61、喜马拉雅FM逆向实战01 明确需求》1、hook 修改方法实现2、theos
《62、Theos 安装》1、下载地址 https://github.com/theos.git2、编写代码 => deb安装包/插件 => 装到手机上3、安装签名工具ldid【brew install ldid】4、下载Theos,最好是git clone, 建议安装到~/theos【git clone --recursive https://github.com/theos.git~/theos】递归下载,所有依赖都下载5、修改环境配置【vim .bash_profile】export THEOS=~/theos6、之后就可以使用下面的方式【git clone --recursive https://github.com/theos.git$THEOS】
《63、Theos 配置PATH》1、将~/theos/bin添加到PATH【vim .bash_profile】export PATH=$THEOS/bin:$PATH :添加以前的路径2、打印环境变量【echo $PATH】3、生效【source .bash_profile】
《64、source 命令》1、使环境变量生效【source .bash_profile】
《65、tweak 代码编写》1、创建项目【nic.pl】 【11】iphone/tweak 【名称】 【包名】 【需要hook的ipa的包名(使用CCAppId获取)】注意:工程id不能与对象ipa的id一致2、使用subline打开工程3、修改Makefile文件 【export THEOS_DEVICE_IP=127.0.0.1】【export THEOS_DEVICE_PORT=10010】4、编写Tweak.xm文件修改类名重写需要修改的方法5、进入项目目录【make】【make package】生成deb插件【make install】安装deb插件6、重新运行App,即可看到效果7、make package如果error,可参考https://www.cnblogs.com/ZhangShengjie/p/10705854.html修改打包方式为zgip8、插件卸载,删除对应的.dylib和.plist/Library/MobileSubstrate/DynamicLibrarys
《66、总结步骤》1、安装签名工具ldid2、修改环境变量3、下载theos4、新建项目5、配置项目6、编写代码7、make 8、make package9、make install
《67、课程安排》1、
《68、Tweak练习 SpringBoard01 分析》1、桌面是哪个应用?SpringBoard2、找到SpringBoard对应的安装目录,找到可执行文件,查看是否加壳,无加密3、使用Reveal并不能显示SpringBoard。使用cycript4、凭经验找到红点view
《69、SpringBoard 02》1、可以将这两个配置到当前用户的配置文件中~/.bash_profile【export THEOS_DEVICE_IP=127.0.0.1】 【export THEOS_DEVICE_PORT=10010】 2、可将指令拼接在一起,执行完第一个才执行第二个,错1就断 make && make package && make install3、可将make指令写到脚本中执行添加make clean &&
《71、微信练习 Tweak 常量》1、%orig 表示实现本来的方法,类似于super,不建议带参数2、[self numberOfSection:section]3、id类型尽量使用方法的方式调用
《72、返回cell》1、不记得的方法,可以使用Xcode,然后拷贝
《73、页面调整和退出》1、exit(0);会卡顿一下再退出2、abort();立即退出
《74、数据存储》1、支持宏定义2、NSUserDefault3、可以使用Xcode查看设备信息和终端输出信息4、%hook - %end 之间的方法默认是复写原对象里面的方法,如果需要使用新的方法,可以在方法的上一行使用%new修饰5、为了防止与对象原来的方法重复,可以添加前缀
《75、加载图片资源》1、imageName 在main bundle查找图片资源2、contentOfFile 需要指定全路径3、theos规定,加载图片需要在项目中添加layout文件夹,然后图片放到layout中,才会跟随插件打包。layout相当于手机根目录4、建议: a、layout添加文件夹/preferenceLoader/preference b、为了避免重名,再新建一个项目名称的文件夹5、图片最终的访问/Library/preferenceLoader/preference/MJWeChat/haha.png
《76、宏定义资源路径》1、#define MJFile(path) @"Library/preferenceLoader/preference/MJWeChat/" #path#jjj.png会自动转成"jjj.png"
《77、Tweak原理 01》1、make 编译生成dylib动态库2、make package 打包生成deb安装包/插件3、make install 远程登录手机,将deb传给手机,cydia会自动将deb包中的dylib动态库和plist安装到Library/MobileSuntrate/CynamicLibraries4、其实是由cydia subtrate插件操作的,cydia自带
《78、Tweak原理 02》1、当点击app启动,cydia substrate会检测plist中的ID是否跟app一致,若是一致便会加载对应的dylib动态库,会将运行中的app放在内存中的代码做改变2、本质:只是修改了内存中的东西,并没有对原本的可执行文件做修改3、打开Xcode,设备信息里,可以看到手机终端的打印信息。MS开头的便是Cydia substrate做的事情
《79、一些疑问》1、能不能使用Tweak破解游戏? 游戏很多都是使用C、C++编写的,得学习怎么hook它们写的方法。另一方面,函数名可能做过混淆,比如beginGame,class-dump出来可能变成了begin1000等,增加了破解难度
《80、复习总结》1、Mac: Tweak.xm【make】dylib、plist【make package】deb2、SSH: deb【make install】3、iPhone: 【cydia】/Library/MobileSubstrate/DynamicLibraries4、卸载: a、在cydia中删除插件 b、直接在目录中删除
《81、从汇编层面分析》1、hook之后,只会调用hook中的方法,原来的方法不执行
《82、图片资源》1、layout/Library/PreferenceLoader/Preferences/MJWeChat/kkk.png2layout/Library/Caches/MJWeChat/kkk.png
《83、多文件开发01》1、Makefile需要指定Tweak.xm的位置2、#import 只能导入Tweak.xm所在目录的文件,多层级则需要#import "/src/MJPerson.h"3、可以导入.h .m文件,但是.m文件必须跟Tweak.xm一样指定路径,用空格连接多个路径
《84、release版本》1、Tweak的版本可以在Makefile中修改,但是build 是自动打包生成的,删掉历史的deb,会重置build2、产出release版本,包相对小一些【make package debug=0】
《86、内涵段子 获取appid》1、cycript 【MjAppId】2、clutch 【clutch -i】只能获取到加密的app3、MJAppTools a、下载地址【https://github.com/CoderMJLee/MJAppTools】 b、进入工程文件夹【make】生成release/MJAppTools c、将MJAppTools拷贝到iPhone /usr/bin/ d、修改权限【chmod +x /usr/bin/MJAppTools】
《87、去除首页广告》1、直接将cell返回nil,可能会导致程序崩溃2、可以判断数据模型,如果是广告模型,则不添加到数据源3、在reveal中拿到tableView的内存地址4、进入cycript,查看tableView的dataSource5、#tableView->_listModel->_dataList 使用->访问成员变量6、找到广告对应的model类型,在初始化方法里返回nil
《88、去除评论广告》1、使用reveal查找到广告cell,检查cell是否有数据源模型2、查找tableView,使用内存地址访问到数据源dataSource3、查看dataSource类的数据,查看是否有广告模型4、查找广告模型的初始化方法,如果没有,则找模型的父类5、尝试对父类的初始化方法进行hook,发现其他评论也没了,改成对广告模型类的父类方法进行hook
《89、其他思路》1、判断是否是广告cell,是的话cell高度返回02、找到数据源,hook返回单元格个数的代理方法3、获取到原来的数据list,然后遍历将广告model去掉4、Tweak中找不到的方法,使用[]也访问不了的属性,声明一下就可以了,类名随意@interface MJMethodSet- (id)listModel;@end然后在Tweak中就能使用[self listModel]5、找不到类名,声明一下对应类6、找不到方法,那么类要写继承7、%c(MJModel) 相当于 NSClassFromString(@"MJModel")8、用strong数组指向数据源list,修改数据及代表修改数据源list9、如果只是属性,应该是用set方法设置的,可以hook set方法
《90、去掉new标签和刷新按钮》1、找到new标签的类,发现并没有初始化方法,可以考虑在他的父控件入手2、重写父控件new标签的set方法3、刷新按钮并不是自定义的view,我们又不能对UiView下手,猜想它的控制器里面是否有它这个成员变量,继而hook控制器对应属性的set方法4、崩了,说明该属性还被用在其他地方,比如添加到数组等
5、换成hook控制器即将显示的方法,将视图从父视图移除,也将属性设置成nil
哈哈