frida源码初探
type
status
date
slug
tags
summary
category
icon
password
总览
首先是一整个frida项目可以分为这些subprojects:
- frida-clr:Frida .NET bindings
- frida-core:Frida core library intended for static linking into bindings
- frida-go:Frida Go bindings
- frida-gum:Cross-platform instrumentation and introspection library written in C
- frida-node:Frida Node.js bindings
- frida-python:Frida Python bindings
- frida-qml:Frida Qml plugin
- frida-swift:Frida Swift bindings
- frida-tools:Frida CLI tools
感觉网上许多文章都着重在看frida-core和frida-gum,那么就先看看这两部分
frida-gum
分析过程中感觉直接干看还是有点困难,这里先整理一些frida所实现的功能,对照着功能看进去
一、前置原理
1.1 inline hook
我们可以使用 Frida 的 API 在程序运行时拦截函数的调用,并且在拦截到函数调用时,通过修改函数的参数或者返回值来改变程序的行为。
这里的核心原理是:动态替换需要 Hook 的指令片段为一段经过设计的跳板指令,即 trampoline ,目标为我们设计好的一段 shellCode,这里可以看[原创]Frida inlineHook原理分析及简单设计一款AArch64 inlineHook工具-Android安全-看雪-安全社区|安全招聘|kanxue.com这篇文章对于Frida生成的shellcode进行了详细的研究,暂时没有进行复现,先纸面学习,大概需要注意的点是:
- frida寻找前后128MB的地址获取一个空闲地址,将hook的点的前16个字节(或4字节)替换掉为LDR和BR指令,并且利用x16寄存器作为trampoline跳板
- 第一段跳板跳到shellcode后mmap一段匿名内存,保存当前寄存器状态与用于写入第二段跳板指令
- 然后是onenter和onleave的编写,注入shellcode实现需求的逻辑即可(这里是简易的核心原理,后面代码会复杂很多)
1.2 inline hook 检测
恰好学习的时候搜到这篇文章,一块记录了
既然frida会生成trampoline和shellcode,那么有个很简单的方法:开一个线程,检查函数开头有没有被替换过,并且有没有被替换成类似BR到shellcode的格式
二、源码
readme描述:
Cross-platform instrumentation and introspection library written in C.
This library is consumed by frida-core through its JavaScript bindings, GumJS.
然后文档有大概给出不同部分的功能(词汇量稍微有点不够咳咳)不过直接看着稍微有点没头绪,先看看别人的分析,这篇写的不错)
偷看一下别人的阅读思路:
首先有个meson.build构建文件,其中可以先看gumtest.c这一测试运行器(根据testcase递归看进代码)
gumtest.c
前面一大段代码根据宏来判断,是用于根据平台信息做初始化的
标记一个核心对象先:
拦截器初始化
attach上函数的方法:
传入地址,调用
gum_interceptor_resolve
,这里的gum_interceptor_instrument
后面也会看跟进看这里的实现
可以进到:这部分是比较核心的生成跳转shellcode的部分,或许也可以从这部分下手来考虑对抗?(TODO+1)
创建拦截器后端以及分配器初始化
看到刚才marked的
gum_interceptor_instrument
,结合前面的代码,frida似乎会将函数建哈希表用于寻址,并且进行了拦截器后端的初始化_gum_interceptor_backend_create
以及生成跳板代码先偷一个跳板代码:
拦截器后端的初始化:这里初始化的
writer
和relocator
分别用于指令写和指令恢复。看到thunks的初始化,这里是关键函数,用来调度执行,对应进入hook和离开hook
gum_emit_arm_enter_thunk:
gum_emit_arm_leave_thunk:
拦截器激活:
核心bl处:
三、执行流程
偷一个(上面我们走的是arm的流程,函数名略有不同,但流程是一样的)
先这样~有机会再来调试
frida-core
一、前置知识
1、vala语言
介绍:Projects/Vala - GNOME Wiki!:Vala is a programming language using modern high level abstractions without imposing additional runtime requirements and without using a different ABI compared to applications and libraries written in C. Vala uses the GObject type system and has additional code generation routines that make targeting the GNOME stack simple. Vala has many other uses where native binaries are required.
vala语言是GNOME 中使用的一个高级语言,和传统高级语言不同的是 vala 代码会被编译器先编译成 C 代码,然后再编译成二进制文件,因此也可以认为 vala 语言是 C 的一个语法糖拓展。其使用使用 glib 的
GObject
类型系统来构造类和接口以实现面向对象,其语法有点类似于 C#
,支持许多现代语言的高级特性,包括但不限于接口、属性、内存管理、异常、lambda、信号等等。Vala 既可以通过 API 文件访问已有的 C 库文件,也可以从 C 中很容易调用 Vala 的方法。2、进程问题
无论在 Android 还是 iOS 或者其他平台,进程和进程直接相互是透明的,就算对 Frida 来说目标进程并非透明的,但是对目标进程来说,至少 Frida 也该是透明的。但是现实情况显然是,二者往往需要相互之间识别并交互。
二、源码分析
vala插件点不进去啊急了,看不动先鸽了×××等selinux看看再回来
上一篇
selinux初探
下一篇
pwnCollege04
Loading...