前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >frida学习笔记

frida学习笔记

作者头像
用户2135432
发布于 2023-10-21 03:06:15
发布于 2023-10-21 03:06:15
81900
代码可运行
举报
文章被收录于专栏:猛牛哥的博客猛牛哥的博客
运行总次数:0
代码可运行

说明

因为想学习怎么hook安卓程序,网上搜了一些资料,有xposed和frida两种。 xposed不便于调试,frida方便调试。所以先从学习frida入手。 以下过程是本菜鸡参考网络教程实践的坎坷路程,记录下来以备以后自己重复时参考。

电脑端安装frida

第一步查资料安装,需要先安装python,直接到python官网(https://www.python.org/downloads/ )下载windows版本安装。

下载后打开,一路next完成。

踩坑:我尝试过在windows store内安装python,装好后不带pip。手动安装pip后再安装frida,安装完成后无法运行frida命令。然后卸载后又手动安装的官网版python。

然后就是按照网上教程,打开命令行窗口,运行:

特别注意:一定要在安装完python后打开一个新的命令行窗口。因为安装python时自动添加的path变量不能在以前打开的命令行窗口生效。这是windows自己的问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install frida
pip install frida-tools

安装完成后运行frida --version测试是否成功,并记住版本号。后面安装frida-server时要选择一致的版本。

安卓端安装frida-server

安装ADB

安装frida-server需要通过adb连接安卓。我以前没有装过,所以需要先安装ADB。 ADB下载地址:https://dl.google.com/android/repository/platform-tools-latest-windows.zip 解压保存。然后把保存路径添加到环境变量PATH。记得添加PATH新路径后再重新打开一个命令行窗口,以使新添加的路径生效。 安卓模拟器打开USB调试,用下面命令查看设备是否已连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
adb devices

运行adb shell input keyevent 4测试按下返回键有没有反应,模拟器内有反应,说明ADB连接成功。

如果提示adb.exe: more than one device/emulator错误,并且运行adb devices显示有多个设备,多余的设备为offline状态,可以尝试运行adb kill-server命令解决,如果没用,再运行taskkill /f /im adb.exe 如果确实有多个设备,可以用-s参数指定连接哪个设备。例如:adb -s emulator-5554 shell

安装frida-server

运行下面命令查看安卓CPU架构,下载frida-server时需要用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
adb shell getprop ro.product.cpu.abi

我用的安卓虚拟机,所以该命令输出了x86,如果是手机,应该是arm之类的。 frida-server下载地址:https://github.com/frida/frida/releases 打开后点Show all 247 assets查看所有的下载链接(里面247数字可能有变化)。 我选择下载对应的frida-server-16.0.9-android-x86.xz,因为我刚才安装的电脑端frida版本是16.0.9,安卓模拟器CPU架构是x86。 下载的是 .xz结尾的文件,应该是一种压缩格式。我用7zip解压的。 然后把解压后的文件发送到安卓。这个文件要保存在命令行窗口的当前文件夹下,我自己尝试使用绝对路径不行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
adb root
adb push frida-server-16.0.9-android-x86 /data/local/tmp
运行frida-server

命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
adb shell
su
cd /data/local/tmp
chmod 777 frida-server-14.2.18-android-arm
./frida-server-14.2.18-android-arm

运行完以上命令,命令行窗口会进入阻断状态,无法再输入新的命令。如果要结束frida-server,按CTRL+C

端口映射

这步需要新开一个命令行窗口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043

运行下面命令查看安卓内进程,有输出列表说明一切正常:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
frida-ps -U
frida-ps

frida-ps用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查看所有进程(不显包名)
frida-ps -U

# 查看正在运行的进程List running applications(显包名,好像是只显示有图形界面的程序)
$ frida-ps -Ua

# 查看安装了的app List installed applications
$ frida-ps -Uai

HOOK测试

模式

frida hook有两种模式,如下

1. attach模式

attach到已经存在的进程,核心原理是ptrace修改进程内存。如果此时进程已经处于调试状态(比如做了反调试),则会attach失败。

2. spawn模式

启动一个新的进程并挂起,在启动的同时注入frida代码,适用于在进程启动前的一些hook,比如hook RegisterNative函数,注入完成后再调用resume恢复进程。

未完待续

收集的可能有用的代码

显示进程所有模块信息(Python)

用法:保存为文件,例如getmodule.py,然后运行python getmodule.py "进程名"。该代码只能获取已经在运行的进程模块信息。 这是网上找来的,我做了部分修改:原来是固定进程名,我改为可以传参设置进程名;显示模块大小;显示非系统自带(/system/lib下)模块的路径。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import frida
import sys

def on_message(message, data):
    print("[{}] => {}".format(message, data))

def main(target_process):
    session = process = frida.get_usb_device().attach(target_process)

    script = session.create_script("""
        Process.enumerateModules({
        onMatch: function(module){
            var reg=RegExp(/system/);
            if(module.path.toString().match(reg)){
              console.log('Module name: ' + module.name + " - " + "Base Address: " + module.base.toString() + " size:" + module.size/1024 + "k");
            }else{
              console.log('Module name: ' + module.name + " - " + "Base Address: " + module.base.toString() + " size:" + module.size/1024 + "k path:" + module.path);
            }

        }, 
        onComplete: function(){}
    });
    """)
    script.on("message", on_message)
    script.load()
    print("[!] Ctrl+D or Ctrl+Z to detach from instrumented program.\n\n")
    sys.stdin.read()
    session.detach()

if __name__ == "__main__":
    main(sys.argv[1])

本文参考资料: https://juejin.cn/post/6970941426930548767 https://blog.csdn.net/weixin_38819889/article/details/119845994 https://blog.csdn.net/cyjmosthandsome/article/details/120906998 HOOK详细一点的教程:https://www.jianshu.com/p/d4a44f803f33 python传参:https://blog.csdn.net/helloasimo/article/details/124210144 ADB错误:https://blog.csdn.net/gaojinshan/article/details/9455193 Frida获取所有模块名:https://www.jianshu.com/p/2524571eed86

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
3. SQL 与 MySQL 基础
我们平时所说的CRUD其实就是增删改查(Create/Retrieve/Update/Delete)
浪漫主义狗
2023/04/22
1.9K0
Java补充之MySQL入门必备知识
mysql5.5 mysql5.6 mysqI5.7(稳定) mysql8 更高版本
timerring
2023/05/24
1.5K0
Java补充之MySQL入门必备知识
【MySQL学习】基础指令全解:构建你的数据库技能
下面的操作都是在windows 的操作,此时MySQL在Windows下不区分大小写,但在Linux下默认是区分大小写的。 SQL通用语法:
IsLand1314
2024/10/15
1820
【MySQL学习】基础指令全解:构建你的数据库技能
数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)
执行SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer 我们会得到如下表
风骨散人Chiam
2020/10/28
8460
MySQL 数据库基础知识(系统化一篇入门)[通俗易懂]
简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据。更简单的形象理解,数据库和我们生活中存放杂物的仓库性质一样,区别只是存放的东西不同。
全栈程序员站长
2022/09/13
5.2K0
MySQL基础 — 常用命令
使用select对列进行查询时,不仅可以直接以列的原始值作为结果,而且还可以将列值进行计算后所得值作为查询结果,即select子句可以查询表达式的值,表达式可由列名、常量及算术运算符组成。 查询结果计算列显示“无列名”,一般要给计算列加列标题。 其中:表达式中可以使用的运算符有:加+、减-、乘*、除/、取余%
全栈程序员站长
2022/07/02
2K0
MySQL基础 — 常用命令
MySql笔记
又很久没有写博客了 这篇笔记是边学边记的 当时比较仓促 所以有的地方可能会比较乱 但是大概的方法写的还是比较清楚了 等有时间回头再好好整理一下这篇文章。
用户2700375
2022/06/09
6500
MySql笔记
数据库学习笔记(一)
创建基本表(以及其他数据库对象),如果没有指定模式,系统会根据搜索对象来确定该对象所属的模式
赤蓝紫
2023/01/02
1.3K0
『数据库』震惊,某博主为吸引眼球拿出压箱底SQL总结,如果你没看那就吃亏了!(超级详细的SQL基础,你还不会的话就别学数据库了)
这里还有数据库相关的优质文章:快戳我,快戳我? 前言: 使用SQL语言时,要注意SQL语言对大小写并不敏感,一般使用大写。所有符号一定是西文标点符号(虽然是常识,但我还是提一嘴) 文章有点长,大家要
风骨散人Chiam
2020/10/28
7470
【随笔小记】MySQL基础学习
数据分析无法离开SQL这一重要的工具,经过十天时间的学习,并完全以MySQL工具对上一节的数据分析岗位数据进行了分析,加强了操作训练,对这一工具使用有了基本的经验。本着以输出为手段检验学习效果,以温故而知新,把MySQL基础知识系统梳理。
Balliol Chen
2022/04/24
8210
【随笔小记】MySQL基础学习
mysql汇总
下载地址:https://dev.mysql.com/downloads/mysql/
JokerDJ
2023/11/27
2850
mysql汇总
AI解锁MySQL学习新姿势:一文掌握MySQL基础
Hello,我是方才,近期我一直在思考:在AI时代,技术博主应如何输出才能提供价值? 毕竟现在遇到问题,直接问AI,反而是更加高效的一种学习方式。冥思苦想一周,最后我总结为以下三点:
方才编程_公众号同名
2025/01/14
1500
AI解锁MySQL学习新姿势:一文掌握MySQL基础
数据库常用sql语句总结「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说数据库常用sql语句总结「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/07/06
22.8K0
数据库常用sql语句总结「建议收藏」
收藏|我的Mysql学习笔记
SQL是一个存活近半个世纪的语言,如今仍有大量人在使用。它语法简单,对培养数据整理和提取的思维有很大帮助。我将我过去的笔记分享给大家,希望能为大家的学习提供参考,更希望有人因此能迈出学习SQL的第一步~
刘早起
2020/05/13
1.2K0
收藏|我的Mysql学习笔记
SQL知识点总结
我觉得对于SQL语句,清楚知道它执行的顺序,对于写sql语句非常重要                
用户2192970
2019/02/21
2.3K0
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
在 SQL Server 中,标识符(例如表名、列名、数据库名等)默认是不区分大小写的,但是字符串常量是区分大小写的【仅支持英文版双引号("")】。
SarPro
2024/03/16
3420
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
定了!MySQL基础这样学
    人和人交流需要语言,人和数据库交流也需要语言,而这个专门特定为程序员和数据库打交道的语言就是 SQL 语言。
上分如喝水
2021/08/16
2.2K0
定了!MySQL基础这样学
数据库原理复习笔记(实用)
这是大三上学期复习数据库时自己整理的,有些地方可能有误,大家可以参考参考,欢迎讨论哦~
全栈程序员站长
2022/11/03
1.2K0
mysql入门
定义:操作一组数据(多行记录)返回一个结果,也叫分组函数 大多用于统计 例如:统计各部门中雇员的人数。统计各部门中最高和最低薪资
崔笑颜
2020/06/08
1.1K0
Python | Python学习之mysql交互详解
最近在学习scrapy redis,在复习redis的同时打算把mysql和mongodb也复习一下,本篇为mysql篇,实例比较简单,学习sql还是要动手实操记的比较牢。
咸鱼学Python
2019/10/09
1.3K0
Python | Python学习之mysql交互详解
推荐阅读
相关推荐
3. SQL 与 MySQL 基础
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档