1.下载地址

https://github.co/frida/frida/releases

2.另外两种安装方法

1.Install from prebuilt binaries

This is the recommended way to get started. All you need to do is:

  1. pip install frida-tools # CLI tools
  2. pip install frida # Python bindings
  3. npm install frida # Node.js bindings

You may also download pre-built binaries for various operating systems from Frida's releases page on GitHub.

2.Build your own binaries

Dependencies

For running the Frida CLI tools, i.e. frida, frida-ls-devices, frida-ps, frida-kill, frida-trace, and frida-discover, you need Python plus a few packages:

  1. pip3 install colorama prompt-toolkit pygments

Linux

  1. make

macOS and iOS

First make a trusted code-signing certificate. You can use the guide at https://sourceware.org/gdb/wiki/PermissionsDarwin in the sections "Create a certificate in the System Keychain" and "Trust the certificate for code signing". You can use the name frida-cert instead of gdb-cert if you'd like.

Next export the name of the created certificate to the environment variables MAC_CERTID and IOS_CERTID, and run make:

  1. export MAC_CERTID=frida-cert
  2. export IOS_CERTID=frida-cert
  3. make

To ensure that macOS accepts the newly created certificate, restart the taskgated daemon:

  1. sudo killall taskgated

Windows

  1. frida.sln

(Requires Visual Studio 2017.)

3.简单实用

得到android手机当前最前端Activity所在的进程

get_front_app.py

其中get_front_app.py的内容如下:

  1. import frida
  2. rdev = frida.get_remote_device()
  3. front_app = rdev.get_frontmost_application()
  4. print front_app
  5. 12341234

枚举android手机所有的进程

enum_process.py

enum_process.py内容如下:

  1. import frida
  2. rdev = frida.get_remote_device()
  3. processes = rdev.enumerate_processes()
  4. for process in processes:
  5. print process
  6. 1234512345

枚举某个进程加载的所有模块以及模块中的导出函数

  1. import frida
  2. rdev = frida.get_remote_device()
  3. session = rdev.attach("com.tencent.mm") #如果存在两个一样的进程名可以采用rdev.attach(pid)的方式
  4. modules = session.enumerate_modules()
  5. for module in modules:
  6. print module
  7. export_funcs = module.enumerate_exports()
  8. print "\tfunc_name\tRVA"
  9. for export_func in export_funcs:
  10. print "\t%s\t%s"%(export_func.name,hex(export_func.relative_address))
  11. 1234567891012345678910

hook android的native函数

  1. import frida
  2. import sys
  3. rdev = frida.get_remote_device()
  4. session = rdev.attach("com.tencent.mm")
  5. scr = """
  6. Interceptor.attach(Module.findExportByName("libc.so" , "open"), {
  7. onEnter: function(args) {
  8. send("open("+Memory.readCString(args[0])+","+args[1]+")");
  9. },
  10. onLeave:function(retval){
  11. }
  12. });
  13. """
  14. script = session.create_script(scr)
  15. def on_message(message ,data):
  16. print message
  17. script.on("message" , on_message)
  18. script.load()
  19. sys.stdin.read()
  20. 12345678910111213141516171819201234567891011121314151617181920

hook android的java层函数

如下代码为hook微信(测试版本为6.3.13,不同版本由于混淆名字的随机生成的原因或者代码改动导致类名不一样)

com.tencent.mm.sdk.platformtools.ay类的随机数生成函数,让微信猜拳随机(type=2),而摇色子总是为6点(type=5)

  1. import frida
  2. import sys
  3. rdev = frida.get_remote_device()
  4. session = rdev.attach("com.tencent.mm")
  5. scr = """
  6. Java.perform(function () {
  7. var ay = Java.use("com.tencent.mm.sdk.platformtools.ay");
  8. ay.pu.implementation = function(){
  9. var type = arguments[0];
  10. send("type="+type);
  11. if (type == 2)
  12. {
  13. return this.pu(type);
  14. }
  15. else
  16. {
  17. return 5;
  18. }
  19. };
  20. });
  21. """
  22. script = session.create_script(scr)
  23. def on_message(message ,data):
  24. print message
  25. script.on("message" , on_message)
  26. script.load()
  27. sys.stdin.read()
  28. 123456789101112131415161718192021222324252627282930123456789101112131415161718192021222324252627282930

通过frida向android进程注入dex

  1. import frida, sys, optparse, re
  2. def on_message(message, data):
  3. if message['type'] == 'send':
  4. print("[*] {0}".format(message['payload']))
  5. else:
  6. print(message)
  7. jscode = """
  8. Java.perform(function () {
  9. var currentApplication = Java.use("android.app.ActivityThread").currentApplication();
  10. var context = currentApplication.getApplicationContext();
  11. var pkgName = context.getPackageName();
  12. var dexPath = "%s";
  13. var entryClass = "%s";
  14. Java.openClassFile(dexPath).load();
  15. console.log("inject " + dexPath +" to " + pkgName + " successfully!")
  16. Java.use(entryClass).%s("%s");
  17. console.log("call entry successfully!")
  18. });
  19. """
  20. def checkRequiredArguments(opts, parser):
  21. missing_options = []
  22. for option in parser.option_list:
  23. if re.match(r'^\[REQUIRED\]', option.help) and eval('opts.' + option.dest) == None:
  24. missing_options.extend(option._long_opts)
  25. if len(missing_options) > 0:
  26. parser.error('Missing REQUIRED parameters: ' + str(missing_options))
  27. if __name__ == "__main__":
  28. usage = "usage: python %prog [options] arg\n\n" \
  29. "example: python %prog -p com.android.launcher " \
  30. "-f /data/local/tmp/test.apk " \
  31. "-e com.parker.test.DexMain/main " \
  32. "\"hello fridex!\""
  33. parser = optparse.OptionParser(usage)
  34. parser.add_option("-p", "--package", dest="pkg", type="string",
  35. help="[REQUIRED]package name of the app to be injected.")
  36. parser.add_option("-f", "--file", dest="dexPath", type="string",
  37. help="[REQUIRED]path of the dex")
  38. parser.add_option("-e", "--entry", dest="entry", type="string",
  39. help="[REQUIRED]the entry function Name.")
  40. (options, args) = parser.parse_args()
  41. checkRequiredArguments(options, parser)
  42. if len(args) == 0:
  43. arg = ""
  44. else:
  45. arg = args[0]
  46. pkgName = options.pkg
  47. dexPath = options.dexPath
  48. entry = options.entry.split("/")
  49. if len(entry) > 1:
  50. entryClass = entry[0]
  51. entryFunction = entry[1]
  52. else:
  53. entryClass = entry[0]
  54. entryFunction = "main"
  55. process = frida.get_usb_device(1).attach(pkgName)
  56. jscode = jscode%(dexPath, entryClass, entryFunction, arg)
  57. script = process.create_script(jscode)
  58. script.on('message', on_message)
  59. print('[*] Running fridex')
  60. script.load()
  61. sys.stdin.read()
  62. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666712345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

通过注入抛出异常代码实现跟踪程序调用栈

在<<Android 软件安全与逆向分析>>这本书中第八章有介绍通过重打包写入异常代码进行栈跟踪,但是这样比较麻烦,使用frida注入更方便。

hook框架frida的安装以及简单实用案例的更多相关文章

  1. redux 的简单实用案例

    redux 的简单实用案例 整体思想与结构 创建一个Action 创建一个Reducer 创建Store 在App组件开始使用 整体思想与结构 文件目录如下: 构建 action,通过创建一个函数,然 ...

  2. Selenium的安装和简单实用——PhantomJS安装

    简介 Selenium是一个用于Web应用程序测试的工具. Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Firefox,S ...

  3. Python爬虫框架--Scrapy安装以及简单实用

    scrapy框架 框架 ​ -具有很多功能且具有很强通用性的一个项目模板 环境安装: Linux: ​        pip3 install scrapy ​ ​ ​  Windows: ​     ...

  4. hook框架-frida简单使用模板以及frida相关接口

    一目录结构 ├── test.py #py脚本 └── test.js #js脚本 一.py脚本 test.py import frida import sys #连接设备app dev=frida. ...

  5. 实战ELK(3) Kibana安装与简单实用

    第一步:下载 https://artifacts.elastic.co/downloads/kibana/kibana-6.5.1-x86_64.rpm 第二步:安装 1.安装 yum install ...

  6. 日志收集框架flume的安装及简单使用

    flume介绍 Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统. Flume可以采集文件,socket数据包等各种形式源数据,又可以将采集到的数据输出到HDFS.hbase.h ...

  7. sqoop安装与简单实用

    一,sqoop安装 1.解压源码包 2.配置环境变量 3.在bin目录下的 /bin/configsqoop 注释掉check报错信息 4.配置conf目录下 /conf/sqoop-env.sh 配 ...

  8. Logstash 安装及简单实用(同步MySql数据到Elasticsearch)(Windows)

    Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的.多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件 Windows环境: 1.下载logstas ...

  9. Linux下Libevent安装和简单实用

    前言 Libevent 是一个用C语言编写的.轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相 ...

随机推荐

  1. Go安装gRPC

    grpc-go的官方安装命令 go get google.golang.org/grpc 无法正常使用. 我们可以用以下的命令替代,达到同样的效果 git clone https://github.c ...

  2. swiper选项卡还可以左右滑动,最后一个直接跳转链接

    整理分享: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf ...

  3. 通过view获取所在的viewController对象

    建议写成UIView的分类,如下: .h - (UIViewController *)viewController; .m - (UIViewController *)viewController { ...

  4. 【代码总结】PHP文件的上传和下载

    ===================== 文件上传和下载 ===================== 一.php.ini的配置信息 file_uploads = On /Off    是否允许文件上 ...

  5. 查找字符串strscan

    ;Author : Bing ;Date : 1/10/2019;Usage: modify log drictory according to actual drictory fileopen fh ...

  6. 莫烦 - Pytorch学习笔记 [ 二 ] CNN ( 1 )

    CNN原理和结构 观点提出 关于照片的三种观点引出了CNN的作用. 局部性:某一特征只出现在一张image的局部位置中. 相同性: 同一特征重复出现.例如鸟的羽毛. 不变性:subsampling下图 ...

  7. 【html&css学习】表单及表单项

    表单在网络中很常见,如百度的搜索框,各种登录框密码,贴吧的帖子等都需要用表单来完成.表单是元素form且必须要有action属性来设置表单提交的地址.使用form创建的仅仅只是空表单,还有要表单项,常 ...

  8. 学习Flutter应用开发有用的代码/库/专有技术列表

    当我开始使用Flutter开发该应用程序时,我开始担心:“最好的书写方式是什么?”以及“放置它的效果如何?”在这种情况下,您将需要学习和参考GitHub发布的代码和应用程​​序. 因此,我收集了似乎对 ...

  9. requests---requests封装请求类型

    我们在做自动化的时候,肯定是代码越简洁越好,代码重复量越少越好,这里呢,我们可以通过把requests的请求类型都封装起来,这样编写用例的时候可以直接进行请求 requests方法封装 我们通常用的最 ...

  10. Thymeleaf--起步

    Spring官方支持的服务的渲染模板中,并不包含jsp.而是Thymeleaf和Freemarker等,而Thymeleaf与SpringMVC的视图技术,及SpringBoot的自动化配置集成非常完 ...