Frida Hook Native

Frida Hook Java Jni

demo:

function hook_java() {

    Java.perform(function () {

        const myapp = Java.use('com.gdufs.xman.MyApp');
myapp.m.value = 1;
console.log('m=', myapp.m.value);
myapp.saveSN.implementation = function (s) {
let result = this.saveSN(s);
console.log('myapp.saveSN:', s, result);
return result;
}
}) }

获取模块基址,Hook导出函数

demo:

function hook_native() {

    // 获取模块基址
const my_jni = Module.findBaseAddress('libmyjni.so'); if (!my_jni) return; // 查找 so 文件的 导出函数 地址
const addr_n2 = Module.findExportByName('libmyjni.so', 'n2');
console.log('my_jni: ', my_jni, 'addr_n2:', addr_n2);
// 对函数地址进行Hook
Interceptor.attach(addr_n2, {
onEnter: function (arg) {
console.log('addr_n2 onEnter :', arg[0], ptr(arg[1]).readCString(), ptr(arg[2]).readCString())
},
onLeave: function (retval) { }
}) }

枚举模块的符号 Hook libart的一些函数

demo:

function hook_art() {

    // 查找模块
const lib_art = Process.findModuleByName('libart.so'); // 枚举模块的符号
const symbols = lib_art.enumerateSymbols(); for (let symbol of symbols) { var name = symbol.name; if (name.indexOf("art") >= 0) {
if ((name.indexOf("CheckJNI") == -1) && (name.indexOf("JNI") >= 0)) {
if (name.indexOf("GetStringUTFChars") >= 0) {
console.log('开始 HOOK libart ', symbol.name);
Interceptor.attach(symbol.address, {
onEnter: function (arg) {
// 打印调用栈
// console.log('GetStringUTFChars called from:\n' + Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n') + '\n');
},
onLeave: function (retval) {
console.log('onLeave GetStringUTFChars:', ptr(retval).readCString())
}
})
} else if (name.indexOf("FindClass") >= 0) {
console.log('开始 HOOK libart ', symbol.name);
Interceptor.attach(symbol.address, {
onEnter: function (arg) {
console.log('onEnter FindClass:', ptr(arg[1]).readCString())
},
onLeave: function (retval) {
// console.log('onLeave FindClass:', ptr(retval).readCString())
} })
} else if (name.indexOf("GetStaticFieldID") >= 0) {
console.log('开始 HOOK libart ', symbol.name);
Interceptor.attach(symbol.address, {
onEnter: function (arg) {
console.log('onEnter GetStaticFieldID:', ptr(arg[2]).readCString(), ptr(arg[3]).readCString())
},
onLeave: function (retval) {
// console.log('onLeave GetStaticFieldID:', ptr(retval).readCString())
}
})
} else if (name.indexOf("SetStaticIntField") >= 0) {
console.log('开始 HOOK libart ', symbol.name);
Interceptor.attach(symbol.address, {
onEnter: function (arg) {
console.log('onEnter SetStaticIntField:', arg[3])
},
onLeave: function (retval) {
// console.log('onLeave SetStaticIntField:', ptr(retval).readCString())
}
})
} }
} } }

打印调用栈


console.log('GetStringUTFChars called from:\n' + Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n') + '\n');

Hook libc的函数

demo:

function hook_libc() {

    const strcmp = Module.findExportByName('libc.so', 'strcmp');
console.log('strcmp: ', strcmp);
Interceptor.attach(strcmp, {
onEnter: function (arg) {
let str2 = ptr(arg[1]).readCString();
if (str2 === 'EoPAoY62@ElRD') {
console.log('strcmp:', ptr(arg[0]).readCString(), str2);
} },
onLeave: function (retval) {
}
}) }

Frida 的 File api 写文件

function write_data() {
const file = new File('/sdcard/reg.dat', 'w');
file.write('EoPAoY62@ElRD');
file.flush();
file.close() }

把C函数定义为NativaFunction来写文件

demo:

// hook libc.so 的方式来写文件
function write_data_native() {
// 读取lic的导出函数地址
const addr_fopen = Module.findExportByName('libc.so', 'fopen');
const addr_fputs = Module.findExportByName('libc.so', 'fputs');
const addr_fclose = Module.findExportByName('libc.so', 'fclose'); console.log('fopen:', addr_fopen, 'fputs', addr_fputs, 'fclose', addr_fclose);
// 构建函数
const fopen = new NativeFunction(addr_fopen, 'pointer', ['pointer', 'pointer']);
const fputs = new NativeFunction(addr_fputs, 'int', ['pointer', 'pointer']);
const fclose = new NativeFunction(addr_fclose, 'int', ['pointer']); // 申请内存空间
let file_name = Memory.allocUtf8String('/sdcard/reg.dat');
let model = Memory.allocUtf8String('w+');
let data = Memory.allocUtf8String('EoPAoY62@ElRD');
let file = fopen(file_name, model);
let ret = fputs(data, file);
console.log('fputs ret: ', ret);
fclose(file); }

Frida高级逆向-Hook Native(Java So)的更多相关文章

  1. Frida高级逆向-Hook Native(Java So)2

    Frida Hook So 一些操作说明 Native方法第一个参数是 JNIEnv *env 如何在Frida中获取 JNIEnv 对象呢? Java.vm.getEnv(); 如何将string类 ...

  2. Frida高级逆向-Hook Java

    Frida Hook Java 层 Frida两种启动方式的区别 span 模式:frida 重新打开一个进程 frida -U -f 包名 -l js路径 --no-pause attch 模式: ...

  3. 基于frida框架Hook native中的函数(1)

    作者:H01mes撰写的这篇关于frida框架hook native函数的文章很不错,值得推荐和学习,也感谢原作者. 0x01 前言 关于android的hook以前一直用的xposed来hook j ...

  4. 使用Cydia Substrate 从Native Hook Android Java世界

    这里介绍了如何使用Cydia Substrate Hook安卓Java世界.这篇文章介绍如何从Native中Hook 安卓Java世界. 手机端配置见之前文章. 一.建立工程 建立一个Android工 ...

  5. [转]Native Java Bytecode Debugging without Source Code

    link from:http://www.crowdstrike.com/blog/native-java-bytecode-debugging-without-source-code/index.h ...

  6. frida的用法--Hook Java代码篇

    frida是一款方便并且易用的跨平台Hook工具,使用它不仅可以Hook Java写的应用程序,而且还可以Hook原生的应用程序. 1. 准备 frida分客户端环境和服务端环境.在客户端我们可以编写 ...

  7. Frida Android hook native层__system_property_get的最终方案

    记录这个问题的起因是,在hook时遇到了修改内容长度,超过原长度时,会出现显示不全的问题. 比如把nexus 5改成nexus 100,只会显示nexus 1. 所以去读了下源码 int __syst ...

  8. 利用Xposed Hook打印Java函数调用堆栈信息的几种方法

    本文博客链接:http://blog.csdn.net/QQ1084283172/article/details/79378374 在进行Android逆向分析的时候,经常需要进行动态调试栈回溯,查看 ...

  9. mongodb高级操作及在Java企业级开发中的应用

    Java连接mongoDB Java连接MongoDB需要驱动包,个人所用包为mongo-2.10.0.jar.可以在网上下载最新版本. package org.dennisit.mongodb.st ...

随机推荐

  1. shell 字符串判空

    2021-09-01 1. 字符串判空主要用到两个参数 -z 判断字符串为空否 -n 判断字符串不为空 2. 实例 #!/bin/bash PID=`date` if [ -z "$PID& ...

  2. Linux常用命令(二)之权限管理、文件搜索、帮助、压缩命令及管道

    在(一)中提到过rwx的含义,但是我们还需深入理解,明白其真正的含义和权限,对于文件和目录,rwx权限是不同的,尤其是目录的权限往往是被忽略的: 对于目录,其权限和对应的操作: r-ls w-touc ...

  3. Markdown Sublime flowchart.js 流程图

    先亮出来一个 flowchart.js 的 Sample 给 Sublime 安装 MarkdownPreview,这个不必多说了 Sublime Text -> Preferences -&g ...

  4. 通俗易懂讲解Word2vec的本质

    本文首发于微信公众号「对白的算法屋」,来一起学AI叭 一.Word2vec CBOW(Continuous Bag-of-Words):每个词的含义都由相邻词决定. Skip-gram:依据分布的相似 ...

  5. Spring AOP 事务配置(实现转账事务)

    1. 事务特性 事务特性:ACID 原子性:整体 [原子性是指事务包含的所有操作要么全部成功,要么全部失败] 一致性:数据 [一个事务执行之前和执行之后都必须处于一致性状态] 隔离性:并发 [对于任意 ...

  6. IKEv2协议关键知识点总结整理

    文章目录 @[toc] 1. IKEv2基本原理 2. IKEv2协议重点注意事项 2.1 情景一:==IKEv2协商密钥逻辑== ①密钥协商流程 ②函数调用关系 ③流程简述 2.2 情景二:==使用 ...

  7. Nginx:常用基本命令与异常处理

    Nginx日志 - ./nginx-1.6.0-ems/logs/nginx.pid Nginx启动时应该使用cmd等命令行工具启动,双击启动同样会产生进程但会造成异常,判断条件是 ./nginx-1 ...

  8. SQL Server Management Studio --- SSMS语言更换

    问题描述 在安装了En版后,想更换为中文版,但换了中文安装源还是英文. 解决方法 运行 SQL Server Management Studio 通过菜单选择你想要使用的语言: 中文版:"工 ...

  9. git tag标签

    列出标签 # 默认按字母排序显示 $ git tag # 模糊匹配查找标签 $ git tag -l "v2.8.5*" 创建标签 # 创建附注标签 $ git tag -a v1 ...

  10. php curl发送数据和文件

    function mycurl($file, $url, $aid) { // 如果文件名是中文名,将中文字符编码转换一下 $file=iconv("UTF-8","gb ...