安全攻防下 (31)

简介: 名称混淆

名称混淆


  1. 混淆要求: 业务开发 -> 没有问题


  1. 但是业务上线 -> 名称混淆


  1. 逆向分析-> 入口 ->  从方法名/类名分析 -> 怎么隐藏?
  2. 用宏定义隐藏 -> .pch文件


  1. 建立pch文件, 如果项目中没有的话
  2. build setting -> prefix header -> 设置pch

微信图片_20220510050016.jpg

image.png


       d.这样写的好处, 代码完全不用变

       e.这时给断点, 查看函数栈


微信图片_20220510050023.jpg
image.png


       f.这时如果别人逆向你, 恢复符号跟没恢复一样, 让人头大


  1. 有关Swift -> 就比较好, 自带混淆, 因为有类前缀


     g.pch的好处 -> 轻量级, 对项目的污染度低(针对OC)


  1. 只能干掉自定义的方法名/函数
  2. 建议核心的类名 和 方法名可以使用
  3. 扩展: 写个脚本, 或者写一个算法, 让每次编译都不一样


扩展


可能导致上不了线的操作


  1. 大量的流程的混淆


  1. LLVM -> 会把冗余的代码干掉
  2. 混淆有可能产生大量的冗余代码


字符串常量的隐藏


  1. EncryptionTools -> 一个简单的加密工具
  2. 这时候破解者只要断你的CCCrypt函数就能拿到你的Key
  3. 查看汇编


  1. adrp -> 在某页取数据


  1. 如果说本地一定要有字符串常量怎么隐藏?


  1. 全局函数 -> 没有符号

微信图片_20220510050027.jpg

image.png


       c.目的 -> 在静态分析的时候找不到我们的Key字符串

       d.但是这样如果找到函数地址, 字符串还是很明显

微信图片_20220510050031.jpg
image.png


       e.这时候可以来一个简单的疑惑算法来隐藏

微信图片_20220510050043.jpg
image.png


       f.上面的简单算法生成的字符串, 不会进入常量区, 别人看汇编也就看不到这个字符串.


ptrace防护fashhook


  1. 打符号断点, 拿到ptrace所属的库



微信图片_20220510050047.jpg

image.png


  1. 拿到库路径


  1. image list


       b.

微信图片_20220510050052.jpg

image.png


  1. #import <dlfcn.h>

微信图片_20220510050056.jpg

image.png


  1. 这种通过dlopen懒加载的, 我们fishhook写的hook代码就失效了(通过间接符号表的hook)


  1. 再用fishhook来hook -> ptrace之前, 已经查看懒加载符号表, 看里面有没有ptrace的符号, 如果没有则肯定hook失败
  2. 这里有点坑啊, dlopen的写法, 好像过不了审吧 (要查资料验证一下)


  1. 但是通过hopper查看macho -> 全局搜ptrace还是能很快定位
  2. 这时候我们上面讲的字符串隐藏就可以起到作用隐藏ptrace字符串
  3. 此时, 工程用hopper打开, 全局搜ptrace也搜不到


怎么破解上面的防护呢?


  1. 符号断点, 确实能断到ptrace, 但是就是找不到, 这时候就考虑别人有可能做了防护
  2. 这时候看符号断点, 通过函数调用栈找到调用者
    1.

微信图片_20220510050101.jpg
image.png


  1. 1028f5e34


  1. image list -> 拿到首地址
  2. 相减 -> 5E34
  3. 用这个地址去hopper打开的文件中搜就能找到关键函数

        d.

微信图片_20220510050105.jpg
image.png



  1. 修改汇编源码比如把 cbz改为b -> 就不会走5E34的汇编代码, 就绕过了ptrace


再套娃, 如何防护


  1. 打开strip, 脱去所有不必要的符号
  2. 这样别人就不好找了
  3. 其实只是增加了别人找的难度, 这里的重点是怎么隐藏符号断点让别人断不到


隐藏符号断点


  1. #import <sys/syscall.h>
  2. syscall(26,31,0.0) -> 这个方法等同于ptrace
  3. 自己查下该函数
  4. 这里是隐藏了其他的符号断点,  但是syscall的符号断点又暴露了, 感觉是个套娃
  5. 怎么办, 这里给个建议, 可以写汇编代码来代替syscall
  6. 当然也可以写ptrace的汇编
  7. 平时的防护检测后, 用的exit(0)的汇编
  8. 这里注意32位和64位
  9. 这种其实叫软中断, 怎么破解 -> 全局搜svc




目录
相关文章
|
Java
java.lang.NoClassDefFoundError: org/springframework/beans/factory/config/YamlProcessor$StrictMapAppe
java.lang.NoClassDefFoundError: org/springframework/beans/factory/config/YamlProcessor$StrictMapAppe
422 0
|
9月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
294 3
ThreeJs控制模型的隐藏与显示
这篇文章讲解了如何在Three.js中通过代码控制3D模型的显示与隐藏状态。
198 3
ThreeJs控制模型的隐藏与显示
|
监控 Linux
性能分析之 Linux 系统中 ps&top 中 CPU 百分比不一致?
【8月更文挑战第18天】性能分析之 Linux 系统中 ps&top 中 CPU 百分比不一致?
493 5
|
安全 算法 5G
|
XML 数据格式
XML Schema 复杂元素类型详解:定义及示例解析
在XML Schema(XSD)中,复杂元素包含其他元素和/或属性,分为4类:空元素、仅含元素、仅含文本和既含元素也含文本。定义复杂元素可通过直接声明或引用预定义的复杂类型。复杂空元素仅含属性,而仅含元素的类型则只包含其他子元素。XSD提供了`&lt;xs:sequence&gt;`、`&lt;xs:all&gt;`、`&lt;xs:choice&gt;`等指示器来规定元素顺序和出现次数,以及`&lt;xs:attributeGroup&gt;`和`&lt;xs:group&gt;`来组织元素和属性。
370 7
|
JavaScript
typeScript基础(6)_数组类型
本文介绍了TypeScript中数组的类型表示方法,包括直接使用类型加`[]`定义数组类型,以及使用数组泛型`Array<类型>`定义数组。同时,还展示了如何定义包含多种数据类型的数组。
161 1
|
运维 Kubernetes Docker
Kubernetes 1.24 1.25 集群使用docker作为容器
在新版本Kubernetes环境(1.24以及以上版本)下官方不在支持docker作为容器运行时了,若要继续使用docker 需要对docker进行配置一番。需要安装cri-docker作为Kubernetes容器
2778 2
|
弹性计算 人工智能 Cloud Native
这是你的云-云起实验室
简述什么是云起实验室,有哪些实验场景,有哪些收获
这是你的云-云起实验室
【Vue3 第十三章】动态组件 & 递归组件 & 组件别名
【Vue3 第十三章】动态组件 & 递归组件 & 组件别名
365 0