Frida Hook So 一些操作说明

Native方法第一个参数是 JNIEnv *env 如何在Frida中获取 JNIEnv 对象呢?

Java.vm.getEnv();

如何将string类型转换jstring类型呢?

let jstring = Java.vm.getEnv().newStringUtf(str);

如何将jstring类型转string类型呢?

aes_value = Java.vm.getEnv().getStringUtfChars(result, null).readCString()

Hook So 导出函数

let method1_addr = Module.findExportByName('libxiaowei.so', 'Java_com_example_xiaoweiso_MainActivity_method01');

Hook So 非导出函数

let so_addr = Module.findBaseAddress('libxiaowei.so');
// 需要去so中找到非导出函数的地址
let encrypt_addr = so_addr.add(0x42B0);

如何在so中定义一个字符串

let cstring = Memory.allocUtf8String("xiaoweigege");

如何将c中的字符串转成js string?

ptr(result).readCString()

将函数地址定义成一个函数能在js中进行调用

let so_addr = Module.findBaseAddress('libxiaowei.so');
let encrypt_addr = so_addr.add(0x42B0);
let encrypt_fun = new NativeFunction(encrypt_addr, 'pointer', ['pointer']);
let cstring = Memory.allocUtf8String(str);
let result = encrypt_fun(cstring);

在任意apk中加载so文件

var load_model = Module.load('/data/local/tmp/libxiaowei.so');

这样操作就可以在任意地方调用so中的方法,那么我们就可以脱离apk 比如 hook 系统中 设置 来调用我们的so文件方法,达到脱离本身APK

使用示例


var load_model = Module.load('/data/local/tmp/libxiaowei.so'); function hook_method1(str) { let method1_addr = Module.findExportByName('libxiaowei.so', 'Java_com_example_xiaoweiso_MainActivity_method01'); let method1_fun = new NativeFunction(method1_addr, 'pointer', ['pointer', 'pointer', 'pointer']);
let aes_value = null Java.perform(function () {
// Java.vm.getEnv() JNIEnv 对象获取 let jstring = Java.vm.getEnv().newStringUtf(str);
let result = method1_fun(Java.vm.getEnv(), jstring, jstring); aes_value = Java.vm.getEnv().getStringUtfChars(result, null).readCString()
})
return aes_value; } function hook_method2(str) { let method1_addr = Module.findExportByName('libxiaowei.so', 'Java_com_example_xiaoweiso_MainActivity_method02'); let method1_fun = new NativeFunction(method1_addr, 'pointer', ['pointer', 'pointer', 'pointer']);
let aes_value = null Java.perform(function () {
let jstring = Java.vm.getEnv().newStringUtf(str);
let result = method1_fun(Java.vm.getEnv(), jstring, jstring); aes_value = Java.vm.getEnv().getStringUtfChars(result, null).readCString()
})
return aes_value; } function hook_encrypt(str) {
let so_addr = Module.findBaseAddress('libxiaowei.so');
let encrypt_addr = so_addr.add(0x42B0);
let encrypt_fun = new NativeFunction(encrypt_addr, 'pointer', ['pointer']);
let cstring = Memory.allocUtf8String(str);
let result = encrypt_fun(cstring); console.log(ptr(result).readCString()) } function hook_decrypt(str) { let so_addr = Module.findBaseAddress('libxiaowei.so');
let encrypt_addr = so_addr.add(0x4538);
let encrypt_fun = new NativeFunction(encrypt_addr, 'pointer', ['pointer']);
let cstring = Memory.allocUtf8String(str);
let result = encrypt_fun(cstring); console.log(ptr(result).readCString())
} function main() {
let value = hook_method1('xiaoweigege')
hook_method2(value)
} setImmediate(main)

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

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

    Frida Hook Native Frida Hook Java Jni demo: function hook_java() { Java.perform(function () { const ...

  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. MySQL中的seconds_behind_master的理解

    通过show slave status查看到的Seconds_Behind_Master,从字面上来看,他是slave落后master的秒数,一般情况下,也确实这样,我们可以通过Seconds_Beh ...

  2. leaflet加载离线OSM(OpenStreetMap)

    本文为博主原创,如需转载需要署名出处. leaflet作为广为应用的开源地图操作的API,是非常受欢迎,轻量级的代码让使用者更容易操作. 废话不多说,下面直接给出范例. 首先在这个网站下载leafle ...

  3. K8s配置。--未完成

    配置K8s ##################################################################################### # 配置 --- ...

  4. Docker之Alpine制作jre镜像(瘦身)+自定义镜像上传阿里云

    alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBo ...

  5. Hystrix集群及监控turbine

    Hystrix集群及监控turbine 前面Dashboard演示的仅仅是单机服务监控,实际项目基本都是集群,所以这里集群监控用的是turbine. turbine是基于Dashboard的. 先搞个 ...

  6. wireshark 解密加密报文

    wireshark 解密IPSec加密后的报文 序言 wireshark作为一款非常优秀的抓包工具,支持了各种各样的网络协议,成为了网络开发中必不可少的工具之一.一般而言,对于普通的网络数据包,wir ...

  7. echo -e 命令详解

    echo在php中是输入那么在linux中是不是也是输入呢,当然echo在linux也是输入不过它的用法比php强大多了可以带参数及一些东西,下面我们来看一篇关于linux echo命令介绍及-n.- ...

  8. Mybatis简单查询

    目录 前言 一.时间区间查询 1.xml中实现 2. Mybatis Plus 方式 二.模糊查询 1.xml中实现 2. Mybatis Plus 方式 前言  好记性不如烂笔头,记录内容,方便日后 ...

  9. oracle table()函数

    PL/SQL表---table()函数用法/* PL/SQL表---table()函数用法:利用table()函数,我们可以将PL/SQL返回的结果集代替table. oracle内存表在查询和报表的 ...

  10. C++ 输入一行未知个数的整数

    C++ 输入一行未知个数的整数 代码: #include<iostream> #include<vector> using namespace std; int main() ...