首页
社区
课程
招聘
[原创]frida入门总结
发表于: 2020-3-11 16:35 16705

[原创]frida入门总结

2020-3-11 16:35
16705

    Frida是一款轻量级HOOK框架,可用于多平台上,例如android、windows、ios等。
    frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行在系统机器上。
    frida上层接口支持js、python、c等。
    Frida官方github地址为:frida官方github地址

    1 、安装python3.7并配置好环境变量(官方推荐python3以上版本至少为3.7),python安装包官方下载地址:https://www.python.org/downloads/

    2 、安装frida模块,命令为pip install frida(配置了多个python版本环境的可以使用命令python -m pip install frida防止用pip install frida命令报错)。

1.png

    3、安装frida-tools模块,命令同上,pip install frida-tools或者python -m pip install frida-tools

2.png

    4、下载运行在目标机上的frida-sever端,官方下载地址:https://github.com/frida/frida/releases,下载时要选择对应的版本下载,例如我的机器为arm32为架构,就选择frida-server-12.8.14-android-arm.xz下载。(可以在adb使用命令cat /proc/cpuinfo查询)

3.png

4.png

    5、将第四步下载好的文件解压,然后通过命令adb push 你的电脑是存放位置 /data/local/tmp将文件传输到手机中,然后通过adb shell进入手机端,给文件赋权777,并于root权限启动。

5.png

6.png

    6、做完以上几步后,新开一个命令行输入命令frida-ps -U查看手机进程,如果出现以下结果,则frida安装成功。

7.png

    1、编写一个小demo用来hook,该demo关键部分代码如下:

8.png

    2、现在我们将该apk安装好,运行看一下未Hook前的显示字符串!!!

9.png

    3、现在来编写Hook的Python脚本,脚本代码如下:

    4、现在python脚本编写完毕,我们来执行该脚本,首先手机端执行frida,然后通过命令adb forward tcp:27043 tcp:27043adb forward tcp:27042 tcp:27042来转发这两个端口,接着在手机上运行该应用程序,在命令行中执行脚本,最后点击应用的按钮,即可看到字符串已经被替换成我们要替换的了!!!

6.png

10.png

11.png

12.png

    1、还是先写一个小demo,下面贴一下关键代码(很简单c语言代码就不再解释了,至于native层函数怎么编写,由于本篇主要不是讲怎么编写so函数,就不过多叙述了,实在不会的可以看一下我的一篇博客,我觉得写得还是挺详细的,博客编写native层函数链接:https://www.cnblogs.com/aWxvdmVseXc0/p/11564809.html)和未Hook前截图:

23.png

代码:

13.png

14.png

    2、接下来我们来写python hook脚本,我们需要hook native层这个函数,达到返回值修改为0的效果。写到这里需要说明一下关于so文件当中的函数,分为导出函数和未导出函数两种,导出函数打开IDA后能够在导出表中找到的函数就是导出函数,未导出函数则在导出表中寻找不到,一般来说静态编写的native函数都能在导出表中寻找到,而动态加载的则无法在导出表中发现!!!

15.png

代码如下:(跟上面hook java层重复的代码不在注释详讲了!!!)

    3、最后在手机端执行frida-server,转发端口,开启应用,执行脚本,点击按钮,即可看到返回值已经被修改成了0,效果图如下:

16.png

17.png

    1、上面已经写了怎么Hook修改native层函数返回值为int类型的情况,使用replace()函数直接修改即可,但是返回情况为字符串则不一样,在c语言中,返回值为字符串其实是返回了一个char *(字符串指针),所以简单的替换是无法取效果的,具体怎么修改返回值,接着看下面,下面还是贴上demo的关键代码和未Hook前截图:

22.png

代码如下:

未Hook前运行截图:

18.png

    2、接下来是python Hook脚本(只解释与上面有差异的代码),Hook的函数具体函数名还是使用IDA去寻找

19.png

python代码:

    3、运行脚本后,点击按钮,我们可以看到字符串已经被替换成了tamper,如下所示:

20.png


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-3-11 16:36 被windy_ll编辑 ,原因: 添加附件
上传的附件:
收藏
免费 20
支持
分享
最新回复 (38)
雪    币: 2484
活跃值: (3152)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
稳 老哥
2020-3-11 17:06
0
雪    币: 575
活跃值: (576)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
mark学习了,顺便请教一下要Hook OnCreate的话怎么定义函数参数啊
2020-3-11 18:11
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
4
没人点赞???
2020-3-11 21:05
0
雪    币: 2914
活跃值: (4946)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
剁辣椒炒肉 mark学习了,顺便请教一下要Hook OnCreate的话怎么定义函数参数啊
MainActivity.onCreate.implementation = function () {}
2020-3-12 11:30
0
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
6
感谢分享!
2020-3-12 14:32
0
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
7
点赞收藏评论 三连支持!
2020-3-12 14:32
0
雪    币: 24
活跃值: (1353)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
Frida是个好东西,用起来非常舒服
2020-3-13 08:42
0
雪    币: 1454
活跃值: (267)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢大佬分享
2020-3-13 16:15
0
雪    币: 14865
活跃值: (6088)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
windy_ll MainActivity.onCreate.implementation = function () {}
overload(参数类型) 不需要吗?
2020-3-13 16:41
0
雪    币: 2914
活跃值: (4946)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
tDasm overload(参数类型) 不需要吗?
一般不需要
2020-3-13 17:58
0
雪    币: 2510
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
感谢分享
2020-3-13 18:03
1
雪    币: 14865
活跃值: (6088)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
请教一下2个问题:
1、一个类有2个同名方法,比如a(int)、a(string) 怎么hook?
2、一个类有有2个同名方法入口参数类型一样,但是返回值类型不一样,怎么hook?比如a(string)返回string、a(string)返回[B数组  
最后于 2020-3-16 10:18 被tDasm编辑 ,原因:
2020-3-16 10:17
0
雪    币: 4687
活跃值: (253)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
tDasm 请教一下2个问题:1、一个类有2个同名方法,比如a(int)、a(string) 怎么hook?2、一个类有有2个同名方法入口参数类型一样,但是返回值类型不一样,怎么hook?比如a(string)返 ...
多api 文档,同名的方法不同参数可以通过overlad来区分   类.方法.overload('java.lang.String','java.lang.String','boolean').implementation =function(arg1,arg2,arg3){
                
               
       }
2020-3-16 10:29
0
雪    币: 14865
活跃值: (6088)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
bjhrwzh 多api 文档,同名的方法不同参数可以通过overlad来区分 类.方法.overload('java.lang.String','java.lang.String','boolean').imp ...
谢谢指教。第2个呢?
2020-3-16 10:44
0
雪    币: 175
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
这个就很稳了
2020-3-16 10:54
0
雪    币: 445
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
Error: expected a pointer运行后报这个错误。。。。。。。。。。
2020-3-19 00:19
0
雪    币: 2914
活跃值: (4946)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
18
IMZCF Error: expected a pointer运行后报这个错误。。。。。。。。。。[em_2]
你把注释全部删除再跑一遍
2020-3-19 08:27
0
雪    币: 445
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
windy_ll 你把注释全部删除再跑一遍
不是这个问题,是因为so是延迟加载的,拦截的时候还没加载,就报空了,得在dlopen那拦截
2020-3-19 22:05
0
雪    币: 2914
活跃值: (4946)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
20
IMZCF 不是这个问题,是因为so是延迟加载的,拦截的时候还没加载,就报空了,得在dlopen那拦截
或者你多跑几遍就行了,我刚开始以为是因为注释符号写错了
2020-3-19 22:51
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
很详细了,感谢
2020-3-20 21:18
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
tDasm 请教一下2个问题:1、一个类有2个同名方法,比如a(int)、a(string) 怎么hook?2、一个类有有2个同名方法入口参数类型一样,但是返回值类型不一样,怎么hook?比如a(string)返 ...
你说的第二种不存在,先去了解下重载
2020-3-22 15:35
0
雪    币: 866
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
详细的不行,支持 
2020-3-29 18:07
0
雪    币: 6946
活跃值: (2780)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
很详细和生动,赞。
2020-3-30 14:13
0
雪    币: 1515
活跃值: (4416)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
25
Java.perform(function(){ 
        var MainActivity = Java.use('com.example.testfrida.MainActivity'); //获得MainActivity类
        MainActivity.testFrida.implementation = function(){ //Hook testFrida函数,用js自己实现
            send('Statr! Hook!'); //发送信息,用于回调python中的函数
            return 'Change String!' //劫持返回值,修改为我们想要返回的字符串
        }
    });

请问这个代码中的testFrida这个函数名如果没有源码,怎么得到这个函数名呢?
每个反汇编软件反汇编出来的函数名会一样吗?....

2020-3-31 23:20
0
游客
登录 | 注册 方可回帖
返回
//