前言
正文
Interface Inspector 分析app界面
frida-trace
- frida-trace -m “-[MMMainWindowController *]” WeChat
Instrumenting functions... -[MMMainWindowController onAuthFaildForInvalidCGISessionID]: Auto-generated handler at "/Users/devzkn/githubPages/zhangkn.github.io/__handlers__/__MMMainWindowController_onAuthF_-7b4925f2.js" <!-- 默认在当前目录生成头文件 -->
- frida-trace -m “-[MMViewController *]” WeChat 可以查看子类的所有方法
83768 ms -[MMChatDetailSplitViewController splitView:0x7fff33b6b094 effectiveRect:0x6040003458b0 forDrawnRect:0x0 ofDividerAtIndex:0x1] 83768 ms | -[MMChatDetailSplitViewController chatMessageViewController]
dtrace
Chrome Console: option+command+i
- 解码
decodeURIComponent("https://sign=%E6%97%A0") "https://sign=无" ps:encodeURI,可以使用tab 进行补全
see also
LLVM工程包含了一组模块化,可复用的编辑器和工具链。同其名字原意(Low Level Virtual Machine)不同的是,LLVM不是一个首字母缩写,而是工程的名字。目前LLVM包含的主要子项目包括:
LLVM Core:包含一个现在的源代码/目标设备无关的优化器,一个针对很多主流(甚至于一些非主流)的CPU的汇编代码生成支持。
Clang:一个C/C++/Objective-C编译器,致力于提供令人惊讶的快速编译,极其有用的错误和警告信息,提供一个可用于构建很棒的源代码级别的工具.
dragonegg: gcc插件,可将GCC的优化和代码生成器替换为LLVM的相应工具。
LLDB:基于LLVM提供的库和Clang构建的优秀的本地调试器。
libc++、libc++ ABI: 符合标准的,高性能的C++标准库实现,以及对C++11的完整支持。
compiler-rt:针对__fixunsdfdi和其他目标机器上没有一个核心IR(intermediate representation)对应的短原生指令序列时,提供高度调优过的底层代码生成支持。
OpenMP: Clang中对多平台并行编程的runtime支持。
vmkit:基于LLVM的Java和.NET虚拟机
polly: 支持高级别的循环和数据本地化优化支持的LLVM框架。
libclc: OpenCL标准库的实现
klee: 基于LLVM编译基础设施的符号化虚拟机
SAFECode:内存安全的C/C++编译器
lld: clang/llvm内置的链接器
1、LLVM与clang插件:
作为LLVM提供的编译器前端,clang可将用户的源代码(C/C++/Objective-C)编译成语言/目标设备无关的IR(Intermediate Representation)实现。其可提供良好的插件支持,容许用户在编译时,运行额外的自定义动作
>* 如何编写一个clang插件并集成到Xcode
>* 如何实现代码级别的包瘦身
>* 局限与个性化定制
>* 其他
- CLANG TUTORIAL PART I: INTRODUCTION
- compiler LLVM
- 第十一期Coder群周报.md
- https://naville.gitbooks.io/hikari/content/
- http://www.hellogcc.org/?cat=12 开源开发工具技术博客OPEN SOURCE DEVELOPMENT TOOLS BLOG
- LLVM混淆器Hikari
- 关于LLVM(The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.)
0、安装编译LLVM::http://releases.llvm.org/download.html,最新的LLVM只支持cmake来编译了,首先安装cmake;brew install cmake
mkdir build
cmake /path/to/llvm/source
cmake --build .
build/bin/目录下面找到生成的工具
1、LLVM架构的主要组成部分:
前端:前端用来获取源代码然后将它转变为某种中间表示,我们可以选择不同的编译器来作为LLVM的前端,如gcc,clang。
Pass(通常翻译为“流程”):Pass用来将程序的中间表示之间相互变换。一般情况下,Pass可以用来优化代码,这部分通常是我们关注的部分。
后端:后端用来生成实际的机器码。
2、优点:当编译器需要支持多种源代码和目标架构时,基于LLVM的架构,设计一门新的语言只需要去实现一个新的前端就行了,支持新的后端架构也只需要实现一个新的后端就行了
3、从源码到可执行文件的整体流程:
3.1 预处理(Preprocess,macro宏的展开,import/include头文件的导入,以及#if等处理;clang -E main.m)
3.2 词法分析 (Lexical Analysis,clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m)
3.3 语法分析 (Semantic Analysis,验证语法是否正确,并将所有节点组合成抽象语法树(AST);clang -fmodules -fsyntax-only -Xclang -ast-dump main.m)
3.4 IR代码生成 (CodeGen,CodeGen负责将语法树从顶至下遍历,翻译成LLVM IR,LLVM IR是Frontend的输出,也是LLVM Backerend的输入,桥接前后端。Pass就是LLVM系统转化和优化的工作的一个节点,每个节点做一些工作,这些工作加起来就构成了LLVM整个系统的优化和转化。clang -S -fobjc-arc -emit-llvm main.m -o main.ll)
3.5 生成字节码 (LLVM Bitcode,例如Xcode中默认生成bitcode;开启了bitcode,那么苹果后台拿到的就是这种中间代码,苹果可以对bitcode做一个进一步的优化,如果有新的后端架构,仍然可以用这份bitcode去生成。clang -emit-llvm -c main.m -o main.bc)
3.6 生成相关汇编:clang -S -fobjc-arc main.m -o main.s
3.7 生成目标文件:clang -fmodules -c main.m -o main.o
3.8 生成可执行文件:clang main.o -o main
四、可以用Clang做什么?
4.1 libclang进行语法分析:可以用于检查拼写错误,或者做<字符串加密> 达到代码混淆的目的;伪代码将被混淆
4.2 LibTooling llvm/tools/clang/tools :对语法树有完全的控制权,可遍历、访问、甚至修改语法树,可以作为一个单独的命令使用,如:clang-format
----基于它去检查命名的规范,甚至做一个代码的转换,比如实现OC转Swift。
4.3 ClangPlugin:对语法树有完全的控制权,作为插件注入到编译流程中,可以影响build和决定编译过程。目录:llvm/tools/clang/examples-------用来定义一些编码规范,比如代码风格检查,命名检查等等
五、动手写Pass:Pass就是LLVM系统转化和优化的工作的一个节点
5.1 一个简单的Pass:基于Pass, 我们可以编写自己的Pass去混淆代码,以增加他人反编译的难度。
1.创建头文件
2.创建源文件
成一份中间代码:因为Pass是作用于中间代码 clang -emit-llvm -c test.c -o test.bc
然后加载Pass优化:../build/bin/opt -load ../build/lib/LLVMSimplePass.dylib -simplepass < test.bc > after_test.bc
5.2 将Pass加入PassManager管理:将Pass加入PassManager,这样我们就可以直接通过clang的参数去加载我们的Pass
首先在llvm/lib/Transforms/IPO/PassManagerBuilder.cpp添加头文件
/Users/devzkn/Downloads/kevinsoftware/ios-Reverse_Engineering/llvm-3.9.0.src/lib/Transforms/IPO/PassManagerBuilder.cpp
六、总结
1.LLVM编译一个源文件的过程:预处理 -> 词法分析 -> Token -> 语法分析 -> AST -> 代码生成 -> LLVM IR -> 优化 -> 生成汇编代码 -> Link -> 目标文件
2.基于LLVM,我们可以做什么?:
>* 做语法树分析(libclan、LibTooling),实现语言转换OC转Swift、JS or 其它语言,字符串加密。
>* 编写ClangPlugin,命名规范,代码规范,扩展功能。
>* 编写Pass,代码混淆优化。
- get-start-with-mac-reverse
- awesome-ios-cn
- http://www.alonemonkey.com/classify/
- Coder博客群周报,目的在于分享每周看到的干货或者自己的分享
- Objective-C Runtime
在操作过程或者文章有问题的话欢迎在 原文 里提问或指正。