iOS安全攻防(二十二):static和被裁的符号表

Frida Hook线程拦截与SO文件加固:移动安全攻防实战 在移动应用安全领域,Hook技术作为动态分析的核心手段,通过拦截和修改程序运行时行为,为安全研究和漏洞挖掘提供了强大支持。其底层原理依赖于进程注入和函数拦截,能够实时操作内存与执行流,在逆向工程、动态调试等场景中具有极高技术价值。Frida作为主流动态插桩框架,凭借其灵活的JavaScript脚本能力,成为实现高级Hook的利器。本文聚焦于Hook技术的关键应用场景——线程级拦截,深入探讨如何利用Frida监控线程创建、挂起关键线程以及对抗反调试机制,并自然延伸到SO文件加固策略,涵盖代码混淆、完整性校验和 阅读详情

原文地址:http://blog.youkuaiyun.com/yiyaaixuexi/article/details/21469769


为了不让攻击者理清自己程序的敏感业务逻辑,于是我们想方设法提高逆向门槛。
本文就介绍一个防御技巧————利用static关键字裁掉函数符号。


原理


如果函数属性为 static ,那么编译时该函数符号就会被解析为local符号。
在发布release程序时(用Xcode打包编译二进制)默认会strip裁掉这些函数符号,无疑给逆向者加大了工作难度。



验证


写个demo验证一下上述理论,以一段创建Button的代码为例,对应补充一个static版本。

  1. id createBtn()  
  2. {  
  3.     UIButton *btn = [[UIButton alloc]initWithFrame:CGRectZero];  
  4.     [btn setFrame:CGRectMake(200, 100, 100, 100)];  
  5.     [btn setBackgroundColor:[UIColor redColor]];  
  6.     btn.layer.cornerRadius = 7.0f;  
  7.     btn.layer.masksToBounds = YES;  
  8.     return btn;  
  9. }  
  10.   
  11. static id static_createBtn()  
  12. {  
  13.     UIButton *btn = [[UIButton alloc]initWithFrame:CGRectZero];  
  14.     [btn setFrame:CGRectMake(50, 100, 100, 100)];  
  15.     [btn setBackgroundColor:[UIColor blueColor]];  
  16.     btn.layer.cornerRadius = 7.0f;  
  17.     btn.layer.masksToBounds = YES;  
  18.     return btn;  
  19. }  


再来看一下反编的结果,对于createBtn()方法,我们可以得到它的伪代码:





函数名虽然面目全非,但是基本操作还是清晰的。

对于static_createBtn()方法呢,我们已经无法看到它任何直观的有价值信息了。




局限


当然这种方法也有局限性。正如你所知道的,static函数,只在本文件可见。




打破局限


怎么让别的文件也能调到本文件的static方法呢?
在本文件建造一个结构体,结构体里包含函数指针。把static函数的函数指针都赋在这个结构体里,再把这个结构体抛出去。
这样做的好处是,既隐藏了函数代码也丰富了调用方式。
Flutter金融级应用安全加固实战:从代码混淆到运行时防护 在移动应用开发领域,应用安全加固是构建可信软件的核心环节,尤其对于金融、支付等高敏感场景。其基本原理在于通过多层次技术手段,增加攻击者分析、篡改和窃取数据的难度,实现纵深防御。这项技术的核心价值在于将安全能力内嵌至开发流程,从源头保障用户资产与隐私安全,满足合规要求并建立品牌信任。典型的应用场景包括移动银行、数字钱包、证券交易及政务应用等,这些场景对防逆向、防篡改、数据保密性有着严苛需求。本文聚焦于Flutter框架,深入探讨如何通过代码混淆、传输加密、安全存储及环境检测等组合策略,系统性提升应用的安全水位 阅读详情

相关推荐

(4.3)符号表和符号解析

符号表和符号解析符号和符号表符号解析全局符号的强弱性 符号和符号表 连接器需要使用符号表进行符号解析然后生成可执行文件,目标文件中通常有一个符号表,表中包含了在该文件中定义的所有符号的信息。C 文件包含以下 3 种符号: 全局符号: 包括非静态的函数名和非静态的全局变量。 外部符号: 包括在其他模块定义的外部函数名和外部变量名。 本地符号: 包括带 static 的函数名和全局变量名。 static 属性的本地变量在 .data 和 .bss 中分配空间。如果要链接的两个可重定位文件中包含了同名的 st

ikun的博仔的博客 2926

C++基础-static关键字

静态变量在程序运行时只被初始化一次,且只能在函数内部访问。除了上述场景,static 还有其他一些使用场景,例如用于全局变量和函数(在函数名前加上 static 关键字)。静态成员函数只能访问静态成员变量和其他静态成员函数,不能访问非静态成员变量和非静态成员函数。静态成员变量属于类,而不是类的实例,因此只存在一份,被所有类的实例所共享。静态成员变量在编译时被分配内存,因此其初始值只能是编译时常量。静态成员函数既可以通过类名来访问,也可以通过类的实例来访问。静态成员变量可以通过类名或类的实例来访问。

qq_43335313的博客 260

从PLT/GOT Hook到Frida:深入理解动态分析与Hook技术原理与实践

在软件安全与逆向工程领域,动态分析技术是理解程序运行时行为、进行漏洞挖掘与安全评估的核心手段。其基本原理是在不修改源码的情况下,通过拦截函数调用、监控内存与数据流,实现对目标程序行为的实时观察与控制。Hook技术作为动态分析的关键实现方式,具有极高的技术价值,广泛应用于恶意软件分析、协议逆向、移动应用安全测试等场景。本文以ELF文件格式与动态链接机制为切入点,深入解析PLT/GOT Hook的实现原理,并自然过渡到对Frida、Xposed等现代化Hook框架的探讨,涵盖从基础概念到工程实践的全链路,为安全

weixin_29323365的博客 306

8、iOS strip 与 dead strip

strip在iOS中的作用是 剥掉目标文件中一些符号信息和调试信息,使文件变小。 dead code strip : 死代码剥离、然后再去链接。 那么strip在哪些地方不能起作用呢? 动态库 不能strip全局符号、因为全局符号要作为导出符号。 App中 间接符号表中的符号不能strip;那么App中 本地符号、全局符号都可以strip。 静态库 = .o文件合集,存在重定位符号表,这个表中的数据也是不能strip的。所以 .o文件中能strip的是调试符号。 因此我们在Build S..

Holothurian 2006

static和被裁的符号表

为了不让攻击者理清自己程序的敏感业务逻辑,于是我们想方设法提高逆向门槛。 本文就介绍一个防御技巧————利用static关键字裁掉函数符号。

ios-app-strip

:rocket: 火箭骑飞行员应用程序 Rocket Rides Pilot App是一个示例iOS应用程序,它演示了使用进行结帐的流程。 Rocket Rides Pilot应用程序的功能: 自动重新连接到最后连接的阅读器(如果该阅读器可用) 在应用程序标头中异步显示读取器连接状态 使用两个标签实现强大的阅读器用户界面:一个显示阅读器状态,另一个显示给客户的说明。 从头到尾管理付款流程,使操作员能够在部分付款失败时重试付款。 防止用户遇到SDK错误,例如在收取款项时断开阅读器的连接或一次运行多个相同的操作。 探索代码 RRTerminalDelegate.swift是Stripe Terminal iOS SDK和应用程序UI之间的主要链接。 该单例管理发现状态,连接状态和付款状态,并实现DiscoveryDelegate和TerminalDelegate协议。 RRTerminalDel

12、HOOK原理下

如何防护他人Hook:需要保留自己的HOOK方法;如果要使用fishhook做防护,那么需要在framework里边去实现;因为framework里边的load加载会比主工程的代码更快.注入的HOOK代码在framework代码之后,主工程之前.所以要切入这个时机点去做防护

Holothurian 1544

fastjson1.2.83反序列化漏洞

【代码】fastjson1.2.83反序列化漏洞。

Coder的博客 1万+

iOS开发之strip处理framework的调试符号

iOS安全,符号表中有些符号是必须的,但是很多符号都是可以去掉的,符号表中可以看到很多暴露的类名、函数名,让攻击者可以看到有哪些关键的逻辑,所以要剥去、除去不必要的符号表,这样也可以将framework包进行瘦身,删除framework中的调试符号,首先 cd 到framework文件夹下,然后执行:strip -S -X (包名) ...

hbblzjy的博客 2933

Linux下自动化解析q7签名文件的有效期与时间戳

本文详细介绍了在Linux环境下自动化解析q7签名文件有效期与时间戳的方法。通过编写高效脚本,开发者可以批量提取签名时间信息,验证签名有效性,并集成到CI/CD流程中。文章提供了完整的脚本实现,包括错误处理、批量处理功能,并解决了常见环境问题,特别适用于国产操作系统如UOS的开发场景。

weixin_30872499的博客 518

嘉立创EDA vs Altium Designer:新手如何选择?从界面到实战全对比

本文全面对比了嘉立创EDA与Altium Designer(AD)两大PCB设计工具,从设计哲学、界面交互、封装库管理、设计规则引擎、协作功能到成本生态六大维度进行深入分析。嘉立创EDA以极简设计和云端协作为特色,适合学生和创客快速上手;而AD则凭借专业级精准控制,成为高端电子设计的行业标准。通过实战案例和详细对比表格,帮助新手根据项目需求选择合适的EDA工具。

weixin_30296405的博客 720

ios 静态方法是否能被重写_iOS安全攻防:static和被裁的符号表,Objective-C代码混淆,敏感逻辑的保护方案(1)...

本文是《iOS安全攻防》的22、23、24小结内容。此前内容可参看:《iOS安全攻防》iOS安全攻防(二十二):static和被裁的符号表为了不让攻击者理清自己程序的敏感业务逻辑,于是我们想方设法提高逆向门槛。本文就介绍一个防御技巧————利用static关键字裁掉函数符号。原理如果函数属性为 static ,那么编译时该函数符号就会被解析为local符号。在发布release程序时(用Xcode...

weixin_36342477的博客 352

UMI刷盘机器人代码实战:从SLAM到Diffusion Policy的完整部署流程

本文详细解析了UMI(Universal Manipulation Interface)刷盘机器人从数据准备到真实部署的完整实战流程。通过SLAM处理视频数据生成三维轨迹,并训练Diffusion Policy模型,最终将策略部署到UR5机械臂与WSG50夹爪上,实现从模仿学习到物理执行的闭环。

weixin_29042035的博客 460

关于头文件中的 static inline函数

加了static的关键字,不同c文件中同名函数,不会报重定义。 关于头文件中的 static inline函数 头文件中常见static inline函数,于是思考有可能遇到的问题,如头文件经常会被包含会不会产生很多副本?网上说法不一。于是自己验证。 经过arm-none-eabi-gcc下测试后得出结论。 inline 关键字实际上仅是 建议内联并不强制内联,gcc中O0优化时是不内联的,即使是O2以上,如果该函数被作为函数指针赋值,那么他也不会内联,也必须产生函数实体,以获得该函数地...

biao2488890051的博客 1680

VINS-Mono 代码详细解读——IMU预积分的残差、Jacobian和协方差 processIMU()+intergrationBase类+imu_factor.h

IMU离散中值预积分 1.1、IMU模型 测量值:加速度计a^、陀螺仪w^, 加上了bias游走和随机白噪声。 真实值:加速度计a、陀螺仪w。 实际情况下,可以获得测量值a^和w^,需要反推真实值。一般忽略随机游走高斯噪声n w=w^-bg; a=qwb(a^-ba)-gw; 1.2、连续时间IMU运动模型,积分 PVQ(两帧之间) 将第k帧和第k+1帧所有的IMU进行积...

try_again_later的博客 9266

从零到一:基于Rocky Linux 9的Kubernetes高可用集群部署实战

本文提供了一份基于Rocky Linux 9操作系统,从零开始部署Kubernetes高可用集群的完整实战指南。详细讲解了包括系统初始化、容器运行时配置、使用kubeadm工具进行集群初始化、节点加入以及Calico网络插件安装在内的核心步骤,并针对国内网络环境提供了镜像加速等优化方案,旨在帮助读者构建一个稳定可靠的生产级K8s环境。

weixin_29197835的博客 134

C/C++函数与变量前面的标识符的作用

​ 作者:良知犹存 转载授权以及围观->欢迎添加Wx:Allen-Iverson-me-LYN 缅怀逝者,向英雄致敬。 愿山河无恙,国泰民安。 在用C/C++写代码的时候我们经常会使用一些标识符,置于函数或者变量之前,这些标识符有些是限制函数或者变量的使用,有些是提高函数的执行效率,有些则是特殊函数的标志,下面我们来进行介绍。标识符有很多,此处仅介绍常用的标识符,很多知...

良知犹存的博客 2032

第 1 章 Prometheus 监控 | Prometheus 入门

了解 Prometheus 监控系统,学会安装及了解页面功能。

甘蓝的专栏 485

nm命令学习-看不到static的函数符号表原因分析

https://blog.youkuaiyun.com/lgfun/article/details/103600880?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task 问题: nm -A -l a.out出现如下信息: 0000000020 r func...

u013431396的博客 1667

FPGA实现CAN接口(SJA1000)

学无止境,善于积累,每天积累一点点,成功就在眼前,加油! 1 CAN总线简介 CAN(Controller Area Network,控制器局域网 )总线是一个多主机异步串行总线,也是国际上应用最广泛的现场总线之一。在现场总线中,它是惟一被ISO国际标准化组织批准的现场总线。由于其成本低、容错能力强、支持分布式控制、通信速率高等优点在汽车、工业控制、航天等领域得到广泛应用。特别是由于CAN总线具有...

m0_46498597的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

别踩static的地雷

  只要做过项目的朋友对关键字static应该都有一些了解,但未见了解很全面的。在C语言中,关键字static有以下明显的作用:1.static变量分配到静态内存中,这一点和全局非静态变量相同。2.在函数体,static变量只要不进行修改操作,在被调用过程中其值将保持不变。3.在模块内,全局static变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量,具有私有特

嵌入式软件 1258

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C语言修饰符static,c++ static修饰符浅析

c++ static修饰符浅析下面一段是引用自effective c++ 中的一句话:所谓的static对象,其寿命是从构造出来到程序结束为止(以下文章不再赘诉)。因此stack和heap-base对象都被排除。这种对象包括global对象,定义于namespace作用域内的对象,在classes内,在函数内,以及在file作用域内被声明为static的对象。所以static在c++中可以存在在一...

weixin_34754795的博客 209

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

iOS-符号表恢复&逆向支付宝

前言符号表历来是逆向工程中的“必争之地”,而iOS应用在上线前都会裁去符号表,以避免被逆向分析。本文会介绍一个自己写的工具,用于恢复iOS应用的符号表。直接看效果,支付宝恢复符号表后的样子:文章有点长,请耐心看到最后,亮点在最后。为什么要恢复符号表逆向工程中,调试器的动态分析是必不可少的,而 Xcode + lldb 确实是非常好的调试利器, 比如我们在Xcode里可以很方便的查看调用堆栈,如上面...

MinggeQingchun的博客 1205
上一篇: iOS安全攻防(二十一):废除应用程序的ASLR特性
下一篇: iOS安全攻防(二十三):Objective-C代码混淆
直隶码农
博客等级 码龄19年 95粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值