在学习编程的过程中,我习惯用OD去调试我写的程序,在印象中跟Delphi源码做对照,可以说,这个法子锻炼了我读汇编的能力。编程越学到后面,原先在破解方面不理解的东西就一下子明白为什么了,再到最后,我用C++,最后,也就是现在,我习惯了Delphi和C++的联合编程。编程技术还ok的时候,我拿到一个程序,用用它的功能,看看它的反汇编,便比较容易理出一个思路:他的功能可以用哪几种方法来实现。既然你可以猜出它的实现思路,那么去破解他不就很容易了?无非就是试你的思路。当然,这并不包括所有的程序,总结来说,你写的东西越多,你的思路就越开阔,正反思维就越活跃,到了这种地步的话,剩下的就是体力活,关键看你愿意不愿意干了...
来自天草的一段话, 10年前
题目大纲
前置知识, OC, Logs, JavaScript.
工具: Xcode , Frida, Theos .
OC源码, JS源码, 和实现过程
分为2个部分, Theos编写hook插件, Frida 调试入门
原实现:
控制器UIAlertController的ActionSheet方式
- (IBAction)showAlert:(id)sender
{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"温馨提示" message:@"天气变冷,注意防寒⚠️" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *ok = [UIAlertAction actionWithTitle:@"要得" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog (@"点击了OK");
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"呀不不得呀呀呀" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
NSLog (@"点击了不要");
}];
[alert addAction:ok];
[alert addAction:cancel];
[self presentViewController:alert animated:YES completion:nil];
}
替代的实现:
UIAlertController的ActionSheet方式
- (IBAction)showActionSheet:(id)sender
{
UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:@"shezhitouxiang" message:@"xuanzefangshi" preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *one = [UIAlertAction actionWithTitle:@"xiangce" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
UIAlertAction *two = [UIAlertAction actionWithTitle:@"paizhao" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
}];
UIAlertAction *three = [UIAlertAction actionWithTitle:@"quxiao" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}];
[actionSheet addAction:one];
[actionSheet addAction:two];
[actionSheet addAction:three];
[self presentViewController:actionSheet animated:YES completion:nil];
}
上面的两段 OC代码化简 为:
类:
ViewController:这是一个Objective-C类,通过 @interface ViewController 和 @implementation ViewController 声明和实现的。它表示一个视图控制器类,通常用于管理视图和处理用户交互。
方法:
- (IBAction)showAlert:(id)sender;:这是一个名为 showAlert: 的方法,是一个IBAction(Interface Builder Action)。它表示当用户执行与该方法关联的动作时要执行的操作。在这里,showAlert: 方法可能用于显示一个警告框。
- (IBAction)showActionSheet:(id)sender;:这是另一个名为 showActionSheet: 的方法,也是一个IBAction。它表示当用户执行与该方法关联的动作时要执行的操作。在这里,showActionSheet: 方法用于显示一个操作表。
关系:
ViewController 类中包含两个方法:showAlert: 和 showActionSheet:。这些方法是 ViewController 类的成员方法,可以被这个类的实例调用。这两个方法都可以通过用户界面元素的事件触发,因为它们都被声明为IBAction,这意味着它们可以与用户界面元素(如按钮)关联,以响应用户的交互操作。
总之,这段代码包括一个名为 ViewController 的类和两个方法 showAlert: 和 showActionSheet:。这些方法可以用于处理用户界面的事件,例如显示警告框或操作表。
Fria 探测 要求的 Demo
// ---------------筛选符合要求的类
if (ObjC.available) { // Use ObjC.available to check at runtime
for (var className in ObjC.classes) { /* for-in 循环: 用于遍历对象的属性。
在代码中,使用 for (var className in ObjC.classes) 来遍历 ObjC.classes 对象的属性,
其中 className 是每个属性的名称。*/
if (className.toLowerCase().indexOf('jail') != -1) {/*
indexOf() 方法用于查找一个字符串在另一个字符串中的位置,找到了则返回匹配,否则-1.
className.toLowerCase():将 className 字符串转换为小写(确保不区分大小写地搜索)
.indexOf('jail'):在转换后的字符串中查找子串 "jail" 位置。如果找到了 "jail",则返回它在字符串中的起始位置的索引;如果找不到,就返回 -1。
*/
console.log("[#]ClassName-----> " + className); //是将一个带有类名的文本消息打印到控制台
// ---------------获取要求类的所有方法,
var methods = eval('ObjC.classes.' + className + '.$methods');// 使用 eval() 函数来获取 Objective-C 类的方法列表
/*"代码行1": "for (var i = 0; i < methods.length; i++) { ... }: 这是一个for循环,用于遍历'methods'数组的所有元素。每个元素代表类的一个方法。",
"代码行2-3": "try { ... } catch (err) { ... }: 这是一个try-catch语句,用于捕获并处理可能出现的错误。在这种情况下,如果尝试访问的方法名包含字符串'jail',则将其打印到控制台。",
"代码行4": "if (methods[i].toLowerCase().indexOf('jail') != -1): 这行代码将方法名转换为小写,并检查它是否包含字符串'jail'。如果包含,则执行下一行代码。",
"代码行5": "console.log("[-] " + methods[i]): 这行代码将方法名打印到控制台,前面带有前缀'[-] '。",
"代码行7": "console.log("[!] Exception: " + err.message): 如果在尝试访问方法时发生错误,这行代码将错误信息打印到控制台,前面带有前缀'[!] Exception: '。"}*/
for (var i = 0; i < methods.length; i++) {
try {
if (methods[i].toLowerCase().indexOf('jail') != -1)
console.log("[-] " + methods[i]);
} catch (err) {
console.log("[!] Exception: " + err.message);
}
}
}
}
}
// 总结: Frida框架中使用的,用于在运行时检查Objective-C环境中的类和方法
// 一个for-in循环,用于遍历所有可用的Objective-C类。
// 一个for循环,用于遍历当前类的所有方法。
最后修改下 自己需要的的
Frida 探测指令: 筛选, 符合要求的 类和方法, 以上
js 脚本地址: /Users/exp/Documents/iOS-Crake-PIaoYun-2023-01-15/Chapter5/5.5.3~5.5.4/WeChat.js
通过 frida/frida-trace , Attach的模式调试目标(附加模式)
-p pid
-n executableFilename(Binary file)
-N com.apple.Preferences
-F (最前台的App)
目标地址:
$ frida-ps -U -a # 连接到 USB 设备查看正在运行的 APP
exp@callengdeMac-mini Documents % frida-ps -Ua
PID Name Identifier
4 ------------------------------ ---------------------
8169 15.3_UIAlertController's_Usage tomcat.for2022
frida -U -N tomcat.for2022 -l /Users/exp/Documents/iOS-Crake-PIaoYun-2023-01-15/Chapter5/5.5.3~5.5.4/WeChat.js