入门学习逆向的个人笔记,预览(欢迎探讨)
[原创] [calleng的逆向日记] 22y11m-23y3m29d 实现macOS编辑, iOS端编译和调试C/C++
[原创] [calleng的逆向日记] 23/03/30 (C++概念构建篇01) 补充完毕
[分享] [calleng的逆向日记] 22y11m-23y6m7d Win10Arm下的 gdb调试.[数据结构/严蔚敏-之迷宫问题]
[分享] IOS软件安全工程师技能表(2017.7by非虫) (为自己学习导航) 图片不清楚下面有导图下载
[分享] Frida-Tool的一些 介绍, 和在 iOS下的一些用法 [个人笔记汇总]
[原创] [calleng的逆向日记] 弹窗的修改原理-OC篇 [源码学习和HOOK实践]23/09/24 --待续
[讨论] [calleng的逆向日记] 自学iOS逆向时候,如何自己解决问题.
[分享] [calleng逆向日记] iOS crackMe的破解 与 Frida(Objection) 的入门使用(thanks to roysue)
[分享] (iOS Hook原理,OC底层实现)Frida前置知识的(royuse)的一些知识注解(图片三次压缩失真,详情见附件)
[原创] (calleng逆向日记)Frida前置知识, ObjC runtime的"反射"-KVC-实例代码理解和分析
[分享] [calleng的逆向日记] Frida 前置知识, 类与方法的底层实现, 逻辑批注, (参考AloneMonkey的书)
[原创] (calleng逆向日记)Frida前置知识, ObjC runtime的"反射" KVC实例Demo分析第二部(Demo底部下载)
[分享] [calleng的逆向日记] iOS crackMe and Frida(Objection) Get Started (Oct,16th)
[分享] [calleng的逆向日记] Frida在iOS上内存漫游与黑盒调用 Get Started Section 4
在学习编程的过程中,我习惯用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
天草壳世界的一些感言
新手: 刚接触某样新鲜事物的人都可以叫做新手,只是针对的领域不一样而已,通俗来将,如果让我去搞销售,那么,我也是销售领域的新手,所以,是新手并不可怕,可怕的是你面对新手这个“怪圈”而无从下手。
学习:说起学习,大家并不陌生,中国乃至全世界的人都有一个惯例,或者说是算不上公约的公约,从小就要去学校上学,当然,极少的个例除外。大家应该去思考一个问题,那就是在你上学的时候,每个班都有成绩好和成绩差的,老师是同一个老师,教的内容是同一个内容,为什么有这样的差距呢?原因归结起来,从客观来讲,分用功和不用功,主观来讲,分智商的高低,但是,人一生下来,智商都是差不多的。关键在于后天开发。如果单单讲到是否用功的问题,那么,就涉及到了学习的态度和学习的方法了。这两点对学习尤为重要。记得,我上高中的时候,班主任说了一句话:习惯决定一切。现在看来虽然有失极端,但是,也能囊括一大部分,说到习惯上来,你仔细观察下身边的人,有的人做起事一定是干净、利索。有的人则是拖拖拉拉。这就是习惯,而往往是那些做事干净利索的比较讨人喜欢。最后有一个学习的兴趣,这个也是一个因素。所以,如果你对你想学的东西感兴趣,在不承认自己智商低下的情况下,你需要有一个好的学习态度和方法去学习。就像是你上学的时候写作文,字不能写得太大,不然就超出方格了,这样看起来肯定不好看,即使你的文章写得再好,分数也一定不会很高,因为你影响到了别人看你的作文的视觉感受...(省略号自己回味~)
个人经历:我的本专业是搞电子设计的,对电脑的接触很少,也是源于兴趣,胡乱碰,接触到了脱壳破解,当时那个年代,资料相当的少,更别说书和视频了,都是些凌乱的文字片段,记得当初最火的应该是二哥的教程了,他的那些教程多以文字出现,配以一个很简陋的动画过程。当时,我在学习的过程中,经常发现,他的文章和动画操作不是很相符,那就更别说我的操作是否跟他的相符了,呵呵,在这种情况下,人是容易急噪的,因为都有自己的脾气,我相信我的脾气不比你们任何人的脾气小,有时候急噪得看到这些教程就烦,或许有的人也有这样的感受,但是,我有一个性格,从不服输,烦了几天还是会再重新看,那个时候每看一次,每操作一次,都会有不同的收获,就像现在有的朋友在说看我的教程一样,时间稍微久一点,发现越来越懂了,但是,我看过之后并不仅仅就这么过了,我会按自己的理解,加上自己的心得,录上一个小的录象,方便自己日后查找,因为,自己毕竟对这个领域不熟,有很多东西还是无法理解,所以,很容易忘。现在回想起来,我每天花在这些东西上的时间有15个小时左右,而且多半是在晚上学习,因为安静,所以,到现在我养成了一个喜欢安静的习惯,遇到吵闹的地方会很容易烦躁。就是用这样的方法,我花了半年的时间,到了一个比较高的台阶,有一段时间就发现,再想进步很困难。后来是看到一位前辈在回复某个人的帖子的时候说到这样一句话:我不是很懂破解,但是,从编程的角度来讲,你的思路不对。这么一句看似很平常的话,让我茅塞顿开。我意识到了,要学编程,所以,当时,我选择了Delphi,比较好上手。在学习编程的过程中,我习惯用OD去调试我写的程序,在印象中跟Delphi源码做对照,可以说,这个法子锻炼了我读汇编的能力。编程越学到后面,原先在破解方面不理解的东西就一下子明白为什么了,再到最后,我用C++,最后,也就是现在,我习惯了Delphi和C++的联合编程。编程技术还ok的时候,我拿到一个程序,用用它的功能,看看它的反汇编,便比较容易理出一个思路:他的功能可以用哪几种方法来实现。既然你可以猜出它的实现思路,那么去破解他不就很容易了?无非就是试你的思路。当然,这并不包括所有的程序,总结来说,你写的东西越多,你的思路就越开阔,正反思维就越活跃,到了这种地步的话,剩下的就是体力活,关键看你愿意不愿意干了...
提倡:我当时在做给自己看的备忘教程的时候,会思考一个问题,怎么操作,怎么写文字描述才能让我自己日后看得明白,后来,在黑鹰,黑吧讲课的时候,就会思考,怎么讲才能让会员看明白,所以,在做教程的过程中,如果遇到一些模棱两可、记忆不是很深刻的问题的时候,我都会去验证下,这样一来,确保不讲错东西,二来就增加自己的记忆,这个过程可以使你巩固、提高。所以,我在此提议,若大家有什么心得体会或者学到新的知识,可以做成视频与大家共享,不要怕丢人,你能讲得让别人听明白,你就成功了,所以,我才专门提供了一个FTP给大家交流,走出第一步~后面就海阔天空了
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!
最后于 2023-11-8 01:09
被calleng编辑
,原因: