事件源于接入了一个第三方库导致应用出现了大量的crash记录,很奇怪的是这么多的crash居然没有收到用户的反馈信息! 在这个过程中每个崩溃栈的信息都明确的指向了是那个第三方库的某个工作线程产生的崩溃。这个问题第三方提供者一直无法复现,而且我们的RD、PM、QA同学在调试和测试过程中都没有出现过这个问题。后来再经过仔细检查分析,发现每次崩溃时的各线程的调用栈都大概是如下的情况:
每一个应用程序都会依赖很多底层库、第三方库、自己的组件库、模块库等,这些库本质上是可执行的二进制文件,而这些二进制文件是可以被操作系统写入到内存的,我们日常所说的加载库就是指的将库写入到内存中。
0x00 又到快乐节假日,有足够的时间来玩玩 htb 了。话不多说,走起! 0x01 拿到源码 开始访问页面,是一段奇怪的介绍,然后一个输入框 先随便输入个什么试试,发现输入”的时候,出现了 flask 的报错 debug 页面,看起来是存在注入的。 在仔细审计下返回的 html,又发现了奇怪的东西,感觉 htb 出题目的人都喜欢把因此的接口放在注释里。 访问下/debug,嘿,这太眼熟了,flask。这个套路和之前 rick 那个好像是一样的,于是我看了下两道题的作者,果然是同一个人。 0x02
就是freetype动态库指定的目录不存在,或许没有安装,使用brew命令安装,显示已经安装,重新卸载安装也不行 但是安装完成之后也不行,一直报错 执行命令报错:
原因:当前mysql运行需要的libssl.1.0.0.dylib不存在,或者当前版本过高
JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串。
比如 目前 openai api 的 stream 返回。 标准的请求sse是 EventSource,但是这个无法像正常post一样,携带数据或者header。若你的接口需要进行鉴权,需要携带header或者body数据,像post请求一样,那么这个EventSource就没法用了。
阅读笔者的其他文章,我们了解了编译过程中的预处理、词法分析、语法分析、编译、链接等步骤。经常和编译型语言打交道的开发者对于可执行文件的编译过程肯定不陌生。我们用 Xcode 构建一个程序的过程中,会把源文件 (.m 和 .h) 文件转换为一个可执行文件。这个可执行文件中包含的字节码将会被 CPU (iOS 设备中的 ARM 处理器或 Mac 上的 Intel 处理器) 执行。
name /usr/lib/libSystem.B.dylib (offset 24)
为了加快编译,避免多个文件使用同一个文件而导致多次引用相同文件的情况,苹果提供了预编译头的概念,也就是我们通常所使用.pch文件,在.pch里面定义、引用的文件、变量是全局的且只会编译一次,所以我们可以把常用的东西定义在里面。
在iOS系统中,几乎所有的程序都会用到动态库,而动态库在加载的时候都需要用dyld(位于/usr/lib/dyld)程序进行链接。很多系统库几乎都是每个程序都要用到的,与其在每个程序运行的时候一个一个将这些动态库都加载进来,还不如先把它们打包好,一次加载进来来的快。
源文件-预编译-编译-汇编-链接-可执行文件 - dyld加载 链接: dyld链接器 - 动静态库(加载UIkit、FOunation库、libSystem) -读到 内存(表)-加载主程序中 -link(链接主程序-链接动态库)-库的初始化- main()
https://juejin.im/post/5c7e72cd6fb9a049fc044519”
本篇文章是我在学习逆向工程时整理的逆向工程工具集 只作为记录使用 并不是详细的教程 阅读本篇教程需要你有一定逆向工程知识
上篇文章我们从开发者的角度介绍了如何建立iOS项目并且在真机上运行, 上上篇文章则介绍了Objective-C的基本概念和用法。而这一切,都是为了这次的铺垫。 今天,我们就要从攻击者的角度,尝试对黑盒iOS应用进行调试与动态跟踪(instrument)。
一个iOS App 的 main函数位于main.m中,这是我们熟知的程序入口。但对objc了解更多之后发现,程序在进入我们的main函数前已经执行了很多代码,比如熟知的+load方法等。
之前写了一篇深入浅出ELF,作为姊妹篇这次就来聊聊MacOS的可执行文件格式MachO。
关于load方法我相信大家应该有所了解。这篇文章主要目的是记录我在看 ObjC源码时对于load方法的一些新的认知,所以在这篇文章里面会粘贴部分关键的 ObjC源码。
在上篇文章应用程序的加载——dyld动态链接器的工作流程中,我们聊了动态链接器dyld,知道了dyld最终会走到objc库的初始化函数_objc_init,接下来我们就来分析一下这个函数。
在苹果opensource上提供了所有objc版本的源码,但是建议使用该地址release版本进入搜索objc即可下载正式版本.
dyld会首先读取mach-o文件的Header和load commands。 接着就知道了这个可执行文件依赖的动态库。
最近在做一些App品质提升,启动时间优化是其中很重要的一项,本文围绕启动时间做一个深入了解。
在 Java 中打印当前线程的方法栈,可以用 kill -3 命令向 JVM 发送一个 OS 信号,JVM 捕捉以后会自动 dump 出来;当然,也可以直接使用 jstack 工具完成,这些方法好几年前我在这篇性能分析的文章中介绍过。这样的需求可以说很常见,比如定位死锁,定位一个不工作的线程到底卡在哪里,或者定位为什么 CPU 居高不下等等问题。
APP从开发到安装到手机的过程1 MJRefreshExample.app中的MJRefreshExample文件是iOS中的可执行文件,文件格式是Mach-O APP从开发到安装到手机的过程2 逆向
距离上次发完年终总结已经有将近一个月的时间,这一个月来也面试了将近 40 位候选人,或多或少有了一些感想,后面会单独发篇文章跟大家聊一聊这个话题。
兵长路过胖sir座位,大吃一惊,今天胖sir居然没有打呼噜,而是在低着头聚精会神盯着一本书
全部耦合到组件内,虽然可以正常播放(包括微信和微博) 且不是单例模式,对于多音频页面,有毒
iMessage是苹果生态系统中广泛使用的安全消息应用程序和协议。出于对在其他平台上运行iMessage的好奇,我们采用了逆向工程的方法来理解iMessage是如何运行的,并研究了将其扩展到其他平台的可能性。
iOS 获取真机上所有系统库文件 系统动态库文件存放真机地址(/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64) 在Mac\i
说来惭愧,之前的很多发文一直都是用的Cooci老师弄好的源码库,作为一个爱学习的程序员(呸,臭不要脸),应当学会自己开车(是去幼儿园的那种),自己解决问题。
在正式开启对fishhook的讲解之前,我先对之前的dyld的内容(应用程序的加载——dyld动态链接器的工作流程)做个回顾。
dyld: Library not loaded: 第一种情况:带有 Swift 项目 dyld: Library not loaded: @rpath/libswiftCore.dylib Referenced from: /var/containers/Bundle/Application/CF227EE4-F36F-4161-A8A4-BB063D74B0CF/Boss.app/Boss Reason: no suitable image found. Did find: /private/va
Mach-O是Mach Object的缩写,是Mac/iOS上用于存储程序、库的标准格式
在应用开发过程中,我们不仅仅需要完成正常的业务逻辑,考虑应用性能、代码健壮相关的问题,我们有时还需要考虑到应用安全的问题。 那么应用安全的问题涉及到很多方面。比如防止静态分析的,代码混淆、逻辑混淆;防止重签名的,应用ID检测、甚至是代码的HASH检测等等。那么这篇文章我想聊聊关于代码的注入检测,因为发现随着iOS系统的更新,我们防护的手段发生了一些变化。
前言 Swagger API 文档是自动生成的,可从您的 API 的根 URL 获取。@api.doc()您可以使用装饰器配置文档。 基本配置 默认flask-restx提供 Swagger UI 文档,从 API 的根 URL 提供 from flask import Flask from flask_restx import Api, Resource, fields app = Flask(__name__) api = Api(app, version='1.0', title='Sample A
在应用开发过程中,我们不仅仅需要完成正常的业务逻辑,考虑应用性能,代码健壮相关的问题,我们有时还需要考虑到应用安全的问题。
WAF是一种用于过滤和阻止恶意网络流量的网络安全解决方案。国外网站常见的供应商包括CloudFlare、AWS、Citrix、Akamai、Radware、Microsoft Azure和Barracuda。
iblessing是一款针对iOS安全的漏洞利用&安全审计套件,该工具可以帮助广大研究人员实现针对目标设备的应用程序信息收集、静态分析以及动态分析。除此之外,我们还可以使用iblessing来进行逆向工程分析、源代码分析以及漏洞挖掘等安全任务。
在真机运行,如果出现错误“dyld: Library not loaded: @rpath/XX.framework/XX,..... Reason: image not found”
主要简单的介绍了Mach -O和虚拟内存的知识,下文在app启动的时会有很多相关的术语,不知道会懵逼。
作为iOS开发,多少都与 load 方法打过交道——在程序 main 函数调用前,类被注册加载到内存时,load 方法会被调用。也就是说每个类的 load 方法都会被调用一次。 在该方法中,我们最常用到的场景,就是使用 runtime 提供的交换函数 OBJC_EXPORT void method_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2),去改变系统方法行为并添加自定义的行为。 但若要了解 load 方法内部实现流程,还得从iOS程序启动流程开始说起。
对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制(Core Graphics)都是通过 CPU 来做的。
应用启动时间,直接影响用户对一款应用的判断和使用体验。头条主app本身就包含非常多并且复杂度高的业务模块(如新闻、视频等),也接入了很多第三方的插件,这势必会拖慢应用的启动时间,本着精益求精的态度和对用户体验的追求,我们希望在业务扩张的同时最大程度的优化启动时间。
iOS开发中,main函数是我们熟知的程序启动入口,但实际上并非真正意义上的入口,因为在我们运行程序,再到main方法被调用之间,程序已经做了许许多多的事情,比如我们熟知的runtime的初始化就发生在main函数调用前,还有程序动态库的加载链接也发生在这阶段。
HOOK中文译为“挂钩”或“钩子”。在iOS逆向中是指改变程序运行流程的一种技术。通过HOOK技术可以让别人的程序执行自己所写的代码。在逆向中经常使用这种技术。所以在学习过程中,我们重点要了解其原理,这样能够对恶意代码进行有效的防护。
多个xcode线程在跑,杀掉xcode, 杀掉xcodebuild进程 , clean
在分析越狱工具shadow之前,所有越狱工具都是对进程进行注入挂钩来实现。注入从作用范围来看,分为两类:
领取专属 10元无门槛券
手把手带您无忧上云