FRIDA 实用手册

FRIDA 实用手册

本文目的是作为工具类文章,收集整理了一些 FRIDA 的使用技巧和用例,方便同学们在开发使用过程中开袋即食。

frida 的基础教程可以直接参看官网说明。

Python 部分

JS 中文支持

使用 codecs.open(scriptpath, "r", "utf-8") 打开文件读取 js 即可。

获取指定 UID 设备

device = frida.get_device_manager().get_device("094fdb0a0b0df7f8")

获取远程设备

mgr = frida.get_device_manager()
device = mgr.add_remote_device("30.137.25.128:13355")

启动调试进程

pid = device.spawn([packename])
process = device.attach(pid)
script = process.create_script(jscode)
script.on('message', on_message)
script.load()
device.resume(pid)

python 与 js 交互的官方示例

from __future__ import print_function
import frida
import syssession = frida.attach("hello")
script = session.create_script("""
Interceptor.attach(ptr("%s"), {onEnter: function(args) {send(args[0].toString());var op = recv('input', function(value) {args[0] = ptr(value.payload);});op.wait();}
});
""" % int(sys.argv[1], 16))
def on_message(message, data):print(message)val = int(message['payload'], 16)script.post({'type': 'input', 'payload': str(val * 2)})
script.on('message', on_message)
script.load()
sys.stdin.read()

从 bytecode 加载脚本

# -*- coding: utf-8 -*-
from __future__ import print_functionimport fridasystem_session = frida.attach(0)
bytecode = system_session.compile_script(name="bytecode-example", source="""\
'use strict';
rpc.exports = {listThreads: function () {return Process.enumerateThreadsSync();}
};
""")session = frida.attach("Twitter")
script = session.create_script_from_bytes(bytecode)
script.load()
api = script.exports
# 这里的 list_threads 是 listThreads 驼峰命名法自动转换后的结果,由 rpc exports 功能导出给 python 调用
print("api.list_threads() =>", api.list_threads())   

JS 部分

hook Android 短信发送 SendDataMessage

function hook_sms() {var SmsManager = Java.use('android.telephony.SmsManager');SmsManager.sendDataMessage.implementation = function (destinationAddress, scAddress, destinationPort, data, sentIntent, deliveryIntent) {console.log("sendDataMessage destinationAddress: " + destinationAddress + " port: " + destinationPort);showStacks();this.sendDataMessage(destinationAddress, scAddress, destinationPort, data, sentIntent, deliveryIntent);}
}

定时执行函数

  1. setTimeout 延迟执行一次
setTimeout(funcA, 15000);
  1. setInterval 间隔循环执行
var id_ = setInterval(funcB, 15000);
clearInterval(id_);    // 终止

bin array 转字符串

function bin2String(array) {if (null == array) {return "null";}var result = "";try {var String_java = Java.use('java.lang.String');result = String_java.$new(array);}catch (e) {dmLogout("== use bin2String_2 ==");result = bin2String_2(array);}return result;
}function bin2String_2(array) {var result = "";try {var tmp = 0;for (var i = 0; i < array.length; i++) {tmp = parseInt(array[i]);if ( tmp == 0xc0|| (tmp < 32 && tmp != 10)|| tmp > 126 )  {return result;}  // 不是可见字符就返回了, 换行符除外result += String.fromCharCode(parseInt(array[i].toString(2), 2));}}catch (e) {console.log(e);}return result;
}

自己封装输出函数加入线程ID 和时间


function getFormatDate() {var date = new Date();var month = date.getMonth() + 1;var strDate = date.getDate();if (month >= 1 && month <= 9) {month = "0" + month;}if (strDate >= 0 && strDate <= 9) {strDate = "0" + strDate;}var currentDate = date.getFullYear() + "-" + month + "-" + strDate+ " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();return currentDate;
}function dmLogout(str) {var threadid = Process.getCurrentThreadId();console.log("["+threadid+"][" + getFormatDate() + "]" + str);
}

打印 Android Java 层堆栈

var showStacks = function () {Java.perform(function () {dmLogout(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));  // 打印堆栈});
}

TracerPid fgets 反调试

var anti_fgets = function () {dmLogout("anti_fgets");var fgetsPtr = Module.findExportByName("libc.so", "fgets");var fgets = new NativeFunction(fgetsPtr, 'pointer', ['pointer', 'int', 'pointer']);Interceptor.replace(fgetsPtr, new NativeCallback(function (buffer, size, fp) {var retval = fgets(buffer, size, fp);var bufstr = Memory.readUtf8String(buffer);if (bufstr.indexOf("TracerPid:") > -1) {Memory.writeUtf8String(buffer, "TracerPid:\t0");// dmLogout("tracerpid replaced: " + Memory.readUtf8String(buffer));}return retval;}, 'pointer', ['pointer', 'int', 'pointer']));
};

反调试时读取 LR 寄存器溯源

var anti_antiDebug = function() {var funcPtr = null;funcPtr = Module.findExportByName("xxxx.so", "p57F7418DCD0C22CD8909F9B22F0991D3");dmLogout("anti_antiDebug " + funcPtr);Interceptor.replace(funcPtr, new NativeCallback(function (pathPtr, flags) {dmLogout("anti ddddddddddddddebug LR: " + this.context.lr);return 0;}, 'int', ['int', 'int']));
};

hook JNI API NewStringUTF

function hook_native_newString() {var env = Java.vm.getEnv();var handlePointer = Memory.readPointer(env.handle);dmLogout("env handle: " + handlePointer);var NewStringUTFPtr = Memory.readPointer(handlePointer.add(0x29C));dmLogout("NewStringUTFPtr addr: " + NewStringUTFPtr);Interceptor.attach(NewStringUTFPtr, {onEnter: function (args) {...}});
}

hook JNI API GetStringUTFChars

function hook_native_GetStringUTFChars() {var env = Java.vm.getEnv();var handlePointer = Memory.readPointer(env.handle);dmLogout("env handle: " + handlePointer);var GetStringUTFCharsPtr = Memory.readPointer(handlePointer.add(0x2A4));dmLogout("GetStringUTFCharsPtr addr: " + GetStringUTFCharsPtr);Interceptor.attach(GetStringUTFCharsPtr, {onEnter: function (args) {var str = "";Java.perform(function () {str = Java.cast(args[1], Java.use('java.lang.String'));});dmLogout("GetStringUTFChars: " + str);if (str.indexOf("linkData:") > -1) {    // 设置过滤条件dmLogout("========== found linkData LR: " + this.context.lr + "  ==========");}}});
};

循环输出参数的值

Interceptor.attach(Module.findExportByName("libc.so", "strcat"), {onEnter: function (args) {for (var i = 0; i < args.length; i ++) {dmLogout("strcat args[" + i + "](" + ptr(args[i]) + "): " + Memory.readUtf8String(args[i]));}}
});

hook Android URI 打印堆栈

var hook_uri = function() {// coord: (7520,0,19) | addr: Ljava/net/URI;->parseURI(Ljava/lang/String;Z)V | loc: ?var uri = Java.use('java.net.URI');uri.parseURI.implementation = function (a1, a2) {a1 = a1.replace("xxxx.com", "yyyy.com");dmLogout("uri: " + a1);showStacks();return this.parseURI(a1, a2);}
}

hook KXmlSerializer 拼装内容

function hook_xml() {var xmlSerializer = Java.use('org.kxml2.io.KXmlSerializer');    // org.xmlpull.v1.XmlSerializerxmlSerializer.text.overload('java.lang.String').implementation = function (text) {dmLogout("xtext: " + text);if ("GPRS" == text) {dmLogout("======>>> found GPRS");showStacks();}return this.text(text);}
}

hook Android Log 输出

function hook_log() {dmLogout(TAG, "do hook log");var Log = Java.use('android.util.Log');Log.v.overload('java.lang.String', 'java.lang.String').implementation = function (tag, content) {dmLogout(tag + " v", content);};Log.d.overload('java.lang.String', 'java.lang.String').implementation = function (tag, content) {dmLogout(tag + " d", content);};Log.w.overload('java.lang.String', 'java.lang.String').implementation = function (tag, content) {dmLogout(tag + " w", content);};Log.i.overload('java.lang.String', 'java.lang.String').implementation = function (tag, content) {dmLogout(tag + " i", content);};Log.e.overload('java.lang.String', 'java.lang.String').implementation = function (tag, content) {dmLogout(tag + " e", content);};
}

native 主动调用

var friendlyFunctionName = new NativeFunction(friendlyFunctionPtr, 'void', ['pointer', 'pointer']);
var returnValue = Memory.alloc(sizeOfLargeObject);
friendlyFunctionName(returnValue, param1);

就先整理这么多,日后再追加。欢迎大佬们追加分享和指正错误。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习原来还可以这么学!

最近身边很多朋友在讨论人工智能&#xff0c;讨论人工智能在我们生活中的应用&#xff0c;随之而来就开始讨论深度学习技术&#xff0c;但是由于深度学习的涉及面比较广&#xff0c;对数学的要求比较高&#xff0c;所以想学也不太敢学&#xff0c;生怕认真学了却没学会。其实可…

PostgreSQL 优化器代码概览

简介 PostgreSQL 的开发源自上世纪80年代&#xff0c;它最初是 Michael Stonebraker 等人在美国国防部支持下创建的POSTGRE项目。上世纪末&#xff0c;Andrew Yu 等人在它上面搭建了第一个SQL Parser&#xff0c;这个版本称为Postgre95&#xff0c;也是加州大学伯克利分校版本…

spring-security登录和权限管理

spring security spring security 主要的两个功能是认证和授权 认证的大概流程&#xff1a; Username password AuthenticationFilter&#xff08;自定义usernamepassword拦截器&#xff09; UserDetailService &#xff08;查询用户密码的service接口&#xff09; Userdetail…

官宣!阿里Blink和Flink合并计划出炉

apache已公开合并计划&#xff0c;点击可阅读原文《Batch as a Special Case of Streaming and Alibabas contribution of Blink》&#xff0c;由AI前线进行了翻译。 **春节前一周&#xff0c;经过社区内部讨论&#xff0c;阿里巴巴大数据引擎 Blink 作为 Flink 的分支 正式开源…

第四章、项目整合管理【PMP】

文章目录1. 简介2. 项目整合管理涉及的方面3. 项目整合管理的过程包括2. 制定项目章程3. 制定项目章程&#xff1a;输入4. 制定项目管理计划5. 指导和管理项目工作6. 管理项目知识7. 监督项目工作8. 监控项目工作9. 实施整体变更控制10. 结束项目或阶段1. 简介 项目整合管理是…

龙芯新款处理器发布;Citrix 产品曝“惊天漏洞”,影响全球 8 万家公司; AMD发布年度5大里程碑 ……...

关注并标星星CSDN云计算 速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周两次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go铠侠&#xff08;东芝&#xff09;开发新型闪存&a…

开源SQL-on-Hadoop系统一览

引言 查询分析是大数据要解决的核心问题之一&#xff0c;而SQL作为查询分析中使用最简单、最广泛的的语言之一&#xff0c;必然而然的催生了许多支持在Hadoop上使用SQL的系统&#xff0c;这就是所谓的SQL-on-Hadoop系统&#xff0c;其中大众熟知的Hive就是最早的SQL-on-Hadoop…

PL/SQL中查询Oracle大数(17位以上)时显示科学计数法的解决方法

PL/SQL查询时&#xff0c;如果Number(17)以上的大数&#xff0c;会显示为科学计数法 解决方法&#xff1a; TOOLS->PREFERENCES->WINDOW TYPE->SQL WINDOW下选中Number fields to_char即可。

虎牙直播在微服务改造方面的实践和总结

相比文字和图片&#xff0c;直播提供了人与人之间更丰富的沟通形式&#xff0c;其对平台稳定性的考验很大&#xff0c;那么倡导“以技术驱动娱乐”的虎牙直播&#xff08;以下简称“虎牙”&#xff09;是如何在技术上赋能娱乐&#xff0c;本文将为您介绍虎牙在DNS、服务注册、C…

区块链人才缺口明年将达顶峰,核心开发者年入百万很正常

区块链技术一直备受争议&#xff0c;庞氏骗局、泡沫明显、去中心化无意义&#xff0c;技术无法真正建立信任、区块链技术并不能真正履行货币职能、比特币矿机耗电量大、浪费资源等等。2018年&#xff0c;加密货币市场总价值损失超过80%&#xff0c;链圈就此进入阴影。区块链技术…

阿里云移动端播放器高级功能---截图和音频波形

基本介绍 如果用户对视频播放中的某一帧画面特别感兴趣&#xff0c;可以使用截图功能将这一帧视频保存起来。另外有一种场景想知道是否有声音&#xff0c;或者想感知声音的大小震动频率等&#xff0c;可以通过显示一个声音的波形来形象的表示。如下图所示&#xff1a; 那么播放…

AES和RSA前后端加解密

先了解AES和RSA加密算法 AES算法 1、运算速度快&#xff0c;在有反馈模式、无反馈模式的软硬件中&#xff0c;Rijndael都表现出非常好的性能。 2、对内存的需求非常低,适合于受限环境。 3、Rijndael 是一个分组迭代密码&#xff0c; 分组长度和密钥长度设计灵活。 4、AES标…

PMBOK第六版最新十大大知识领域ITTO思维导图-干货!

PMBOK学习过程中&#xff0c;ITTO&#xff08;输入、工具、技术、输出&#xff09;是每年必考的内容&#xff0c;掌握ITTO的脉络&#xff0c;对学习和梳理PMP非常有帮助。知道这个过程要做什么&#xff0c;为什么做&#xff0c;做完有什么成果。也是项目经理必备的技能之一。 …

这个情人节,工程师用阿里云来试着表达不一样的爱意

年轻的时候谈的恋爱就像TCP链接&#xff0c;恋爱时三次握手即可&#xff0c;可分手时却分了四次。而常常久久的爱情&#xff0c;更像是icmp协议&#xff0c;无论对方身在何处&#xff0c;无论是否是可靠连接&#xff0c;无论你何时去ping她/他&#xff0c;她/他都默默地响应你。…

关于java的取整/和取余%

double a10; double b5; double i (a - b)/2; System.out.println(i);输出&#xff1a;2.5int a10; int b5; double i (double ) (a - b)/2; System.out.println(i);输出&#xff1a;2.5

云+X案例展 | 金融类:金山云为新网银行重塑金融服务提供云计算动力

本案例由金山云投递并参与评选&#xff0c;CSDN云计算独家全网首发&#xff1b;更多关于【云X 案例征集】的相关信息&#xff0c;点击了解详情丨挖掘展现更多优秀案例&#xff0c;为不同行业领域带来启迪&#xff0c;进而推动整个“云行业”的健康发展。作为国内第三家、中西部…

对于AES和RSA算法的结合使用以及MD5加盐注册登录时的密码加密

RSA和AES结合使用 接上篇的RSA和AES算法加密之后&#xff0c;AES对称算法对数据量大的加密比较快&#xff0c;而RSA公私钥加密的话会影响加密效率&#xff0c;但是AES的加密与解密的密钥是一致的&#xff0c;导致密钥不能外泄&#xff0c;密钥在网络传输过程中&#xff0c;很有…

Unity人物移动的几种方法

Unity人物移动的几种方法 方法一&#xff1a;transform.Translate世界坐标系移动自身移动的案例 方法二&#xff1a;CharacterController.Move&#xff08;vector dir&#xff09;按照世界坐标轴移动按照自身坐标轴移动 方法三&#xff1a;CharacterController.SimpleMove&…

可应用于实际的14个NLP突破性研究成果(四)

可应用于实际的14个NLP突破性研究成果&#xff08;一&#xff09; 可应用于实际的14个NLP突破性研究成果&#xff08;二&#xff09; 可应用于实际的14个NLP突破性研究成果&#xff08;三&#xff09; 11.对序列建模的通用卷积和递归网络的实证评估作者&#xff1a;SHAOJIE …

Java裁剪压缩PNG图片,透明背景色变黑问题解决

package com.gblfy.test;import java.awt.Graphics2D; import java.awt.Image; import java.awt.Transparency; import java.awt.image.BufferedImage; import java.io.File;import javax.imageio.ImageIO;/*** 图片工具类*/ public class ImageUtil {/*** 裁剪PNG图片工具类**…