MacRE

前言

正文

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

>* 如何实现代码级别的包瘦身

>* 局限与个性化定制

>* 其他



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,代码混淆优化。

转载请注明: > MacRE

在操作过程或者文章有问题的话欢迎在 原文 里提问或指正。

赞赏支持

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少
最近的文章

vc

前言 什么是风险投资,相比于二级市场的投资有什么不同? VC 的起源,为什么会出现风险投资,高风险是否意味着高回报? 风险投资基金是如何管理的? 风险投资的过程,包括赚钱的方法和决策的过程 正文什么是风险投资 风险投资从资金管理的性质上讲,它是一种特殊的私募基金 不具备流动性 只投资未上市的创业公司、创业项目,通过帮助它们成功,获得很高的回报 需要对技术和市场敏锐的判断; ...…

JunWu'sGoogleMethodology继续阅读
更早的文章

TheWayOfThinking

前言 知识的获取: 亲身感知(旅行)、他人告知(学习)、逻辑推知 计算机从专用到通用背后的逻辑、为什么算盘是计算机、计算机从简单到复杂、五级工程师和职业发展、为什么要学习科学正文计算机从专用到通用背后的逻辑一个复杂的问题如果能拆成两个等价的简单问题,成功的可能性就大很多,就可以事半功倍。 香浓的思想(信息论、二进制运算的开关逻辑电路) 模块化:简单的模块 搭建出各种复杂的功能等价性:复杂的计算,《=》加减乘除运算 《=》 开关电路逻辑--- 科学家的工作就是...…

JunWu'sGoogleMethodology继续阅读
更多