frida的简单实用
一.环境
1.环境
1.手机运行服务端
2. 电脑端运行客户端
3.进行端口转发
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
2. 测试
λ frida-ps -R 成功的标志:
PID Name
---- ------------------------
717 android.process.acore
9080 cat
1301 com.android.defcontainer
882 com.android.download
557 com.android.ime
647 com.android.launcher2
941 com.android.market
597 com.android.phone
523 com.android.systemui
823 com.android.tools
二.使用
得到android手机当前最前端Activity所在的进程
λ python37 C:\Users\1003441\Desktop\get_front_app.py.py
Application(identifier="com.microvirt.launcher2", name="逍遥桌面", pid=647)
get_front_app.py.py
import frida
rdev = frida.get_remote_device()
front_app = rdev.get_frontmost_application()
print (front_app)
枚举android手机所有的进程
λ python37 C:\Users\1003441\Desktop\enum_process.py
Process(pid=1, name="init")
Process(pid=62, name="ueventd")
Process(pid=72, name="flush-8:2")
Process(pid=73, name="flush-8:3")
Process(pid=74, name="logd")
Process(pid=75, name="healthd")
Process(pid=76, name="lmkd")
Process(pid=77, name="servicemanager")
Process(pid=78, name="vold")
Process(pid=79, name="surfaceflinger")
Process(pid=80, name="flush-8:0")
Process(pid=81, name="flush-8:4")
Process(pid=82, name="netd")
Process(pid=83, name="debuggerd")
Process(pid=84, name="rild")
Process(pid=85, name="drmserver")
Process(pid=86, name="mediaserver")
Process(pid=87, name="installd")
Process(pid=88, name="keystore")
enum_process.py内容如下:
import frida
rdev = frida.get_remote_device()
processes = rdev.enumerate_processes()
for process in processes:
print (process)
枚举某个进程加载的所有模块以及模块中的导出函数
import frida
rdev = frida.get_remote_device()
session = rdev.attach("com.tencent.mm") #如果存在两个一样的进程名可以采用rdev.attach(pid)的方式
modules = session.enumerate_modules()
for module in modules:
print (module)
export_funcs = module.enumerate_exports()
print ("\tfunc_name\tRVA")
for export_func in export_funcs:
print ("\t%s\t%s"%(export_func.name,hex(export_func.relative_address)))
这边的这个版本不知道为啥调用不了enumerate_modules,所以换了js的接口
from __future__ import print_function
import frida, sys def on_message(message, data):
print(message) jscode = """
Process.enumerateModules({
onMatch:function(exp){
send(exp.name);
},
onComplete:function(){
send("stop");
}
})
""" process = frida.get_usb_device().attach('com.yinghuan.aiyou')
script = process.create_script(jscode)
script.on('message', on_message)
script.load()
sys.stdin.read()
这边更好的做法是把js代码写成一个js文件,js文件可以利用编辑器写,然后读取
from __future__ import print_function
import frida, sys def on_message(message, data):
print(message) jscode = """
Process.enumerateModules({
onMatch:function(exp){
send(exp.name);
},
onComplete:function(){
send("stop");
}
})
""" process = frida.get_usb_device().attach('com.yinghuan.aiyou')
file=open('test.js')
jscode=file.read()
script = process.create_script(jscode)
script.on('message', on_message)
script.load()
sys.stdin.read()
hook android的native函数
import frida
import sys
rdev = frida.get_remote_device()
session = rdev.attach("com.tencent.mm")
scr = """
Interceptor.attach(Module.findExportByName("libc.so" , "open"), {
onEnter: function(args) {
send("open("+Memory.readCString(args[0])+","+args[1]+")");
},
onLeave:function(retval){ }
});
"""
script = session.create_script(scr)
def on_message(message ,data):
print (message)
script.on("message" , on_message)
script.load()
sys.stdin.read()
hook android的java层函数
如下代码为hook微信(测试版本为6.3.13,不同版本由于混淆名字的随机生成的原因或者代码改动导致类名不一样)
com.tencent.mm.sdk.platformtools.ay类的随机数生成函数,让微信猜拳随机(type=2),而摇色子总是为6点(type=5)
import frida
import sys
rdev = frida.get_remote_device()
session = rdev.attach("com.tencent.mm") scr = """
Java.perform(function () {
var ay = Java.use("com.tencent.mm.sdk.platformtools.ay");
ay.pu.implementation = function(){
var type = arguments[0];
send("type="+type);
if (type == 2)
{
return this.pu(type);
}
else
{
return 5;
}
}; });
""" script = session.create_script(scr)
def on_message(message ,data):
print message
script.on("message" , on_message)
script.load()
sys.stdin.read()
通过frida向android进程注入dex
import frida, sys, optparse, re
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message) jscode = """
Java.perform(function () {
var currentApplication = Java.use("android.app.ActivityThread").currentApplication();
var context = currentApplication.getApplicationContext();
var pkgName = context.getPackageName();
var dexPath = "%s";
var entryClass = "%s";
Java.openClassFile(dexPath).load();
console.log("inject " + dexPath +" to " + pkgName + " successfully!")
Java.use(entryClass).%s("%s");
console.log("call entry successfully!")
});
""" def checkRequiredArguments(opts, parser):
missing_options = []
for option in parser.option_list:
if re.match(r'^\[REQUIRED\]', option.help) and eval('opts.' + option.dest) == None:
missing_options.extend(option._long_opts)
if len(missing_options) > 0:
parser.error('Missing REQUIRED parameters: ' + str(missing_options)) if __name__ == "__main__":
usage = "usage: python %prog [options] arg\n\n" \
"example: python %prog -p com.android.launcher " \
"-f /data/local/tmp/test.apk " \
"-e com.parker.test.DexMain/main " \
"\"hello fridex!\""
parser = optparse.OptionParser(usage)
parser.add_option("-p", "--package", dest="pkg", type="string",
help="[REQUIRED]package name of the app to be injected.")
parser.add_option("-f", "--file", dest="dexPath", type="string",
help="[REQUIRED]path of the dex")
parser.add_option("-e", "--entry", dest="entry", type="string",
help="[REQUIRED]the entry function Name.") (options, args) = parser.parse_args()
checkRequiredArguments(options, parser)
if len(args) == 0:
arg = ""
else:
arg = args[0] pkgName = options.pkg
dexPath = options.dexPath
entry = options.entry.split("/")
if len(entry) > 1:
entryClass = entry[0]
entryFunction = entry[1]
else:
entryClass = entry[0]
entryFunction = "main" process = frida.get_usb_device(1).attach(pkgName)
jscode = jscode%(dexPath, entryClass, entryFunction, arg)
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running fridex')
script.load()
sys.stdin.read()
通过注入抛出异常代码实现跟踪程序调用栈
在<<Android 软件安全与逆向分析>>这本书中第八章有介绍通过重打包写入异常代码进行栈跟踪,但是这样比较麻烦,使用frida注入更方便。
frida的相关资源
frida的简单实用的更多相关文章
- hook框架frida的安装以及简单实用案例
1.下载地址 https://github.co/frida/frida/releases 2.另外两种安装方法 1.Install from prebuilt binaries This is th ...
- jQuery的几种简单实用效果
许久未分享博客,或许已生疏. 闲来无事, 分享几个jQuery简单实用的效果案例 不喜勿喷... 1.页面常用的返回顶部 <!DOCTYPE html> <html lang=&qu ...
- 经验分享:10个简单实用的 jQuery 代码片段
尽管各种 JavaScirpt 框架和库层出不穷,jQuery 仍然是 Web 前端开发中最常用的工具库.今天,向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段. 您可能感兴趣的相 ...
- 简单实用的PHP防注入类实例
这篇文章主要介绍了简单实用的PHP防注入类实例,以两个简单的防注入类为例介绍了PHP防注入的原理与技巧,对网站安全建设来说非常具有实用价值,需要的朋友可以参考下 本文实例讲述了简单实用的PHP防注 ...
- php简单实用的操作文件工具类(创建、移动、复制、删除)
php简单实用好用的文件及文件夹复制函数和工具类(创建.移动.复制.删除) function recurse_copy($src,$dst) { // 原目录,复制到的目录 $dir = opend ...
- 基于Bootstrap简单实用的tags标签插件
http://www.htmleaf.com/jQuery/ jQuery之家 自由分享jQuery.html5和css3的插件库 基于Bootstrap简单实用的tags标签插件
- C#_简单实用的翻页
简单实用的生成翻页HTML辅助类 C# using System.Text; namespace ClassLibrary { /// <summary> /// /// </sum ...
- 简单实用的Windows命令(一)
前几天新买了一台笔记本电脑,使用了一下几个简单的查看电脑配置的命令,觉得非常的不错,在此记录一下 一:运行命令的方式有两种 1:使用快捷键WIN+R,然后在弹出的“运行”对话框中输入对应的命令 2:在 ...
- 简单实用的Windows命令(二)
昨天简单的记录了几个非常简单实用的Windows命令,不过我又想起来还有两个我在实际的工作中也是经常用到的命令——PING和IPCONFIG,不过我在工作中的使用都是非常简单的,用PING命令检测对应 ...
随机推荐
- synchronized互斥锁实例解析
目录 synchronized互斥锁实例解析 1.互斥锁基础使用:防止多个线程同时访问对象的synchronized方法. 1.1.多个线程调用同一个方法 1.2.多个线程多个锁,升级为类锁 2.线程 ...
- java基础归纳
目录 1.java的8种基本数据类型: 2.java的三大特性 3.[public.private.protected区别]-访问权限 4.重载与重写区别 5.Throwable类.Error与Exc ...
- labview的bool(布尔)按键机械属性
在学习LabVIEW(简称LV)时,布尔控件是常用的控件.布尔控件分为按钮型控件和开关型控件,LV内部并没有区分按钮型还是开关型.这两种布尔控件可以根据需要相互转换,通过配置布尔控件的机械动作属性来实 ...
- Ubuntu12.10下安装Python3
设置Python3.2为默认版本 ubuntu12.10下默认安装了Python2.7和Python3.2.3,并且设置了Python2.7为默认的版本,因此如果讨厌麻烦的话,可以直接将Python3 ...
- 如何在sublime中调试html文件
一.安装View In Browser插件 快捷键 Ctrl+Shift+P(菜单栏Tools->Command Paletter),输入 pcip选中Install Package并回车,输入 ...
- Angular2与Angular1的区别
原文地址: http://www.angularjs.cn/A2Ar 整体上来说,Angular2变得更加简洁,最核心的概念只剩下一个,那就是组件Component,其它所有的一切都是围绕着Compo ...
- zookeeper基本知识和zk作用体现
有一段时间没写博客,今天想着把自己近几个月做的笔记分享一波. 前两个月我一直在看zk的视频:https://coding.imooc.com/learn/list/201.html 从开始看这位老 ...
- echarts柱状图宽度设置(react-native)
const optionCategory = { color: ['#B5282A'], tooltip : { trigger: 'axis', axisPointer : { // 坐标轴指示器, ...
- 测试用例设计经典面试题之电梯、杯子、笔、桌子、洗衣机、椅子、ATM等
测试用例设计经典面试题之电梯.杯子.笔.桌子.洗衣机.椅子.ATM等 1.测试项目:电梯 需求测试:查看电梯使用说明书.安全说明书等 界面测试:查看电梯外观 功能测试:测试电梯能否实现正常的上升和下降 ...
- ActiveMQ此例简单介绍基于docker的activemq安装与集群搭建
ActiveMQ拓展连接 此例简单介绍基于Docker的activemq安装与集群搭建 一 :安装 1.获取activemq镜像 docker pull webcenter/activemq 2.启动 ...