1. apk来自52pojie

链接:https://pan.baidu.com/s/1vKC1SevvHfeI7f0d2c6IqQ 密码:u1an

2.apktool反编译apk,拿到so文件

java -jar ../apktool_2.2.4.jar d app-debug.apk

3. 用jadx 打开apk文件,观察到apk调用了一个native方法com.jwxdxnx06.myJNI.sayHello

4. ida 打开so文件,在导出函数表中可以看到这个对应的静态注册的函数

jstring __fastcall Java_com_jwxdxnx06_myJNI_sayHello(JNIEnv *env)
{
return (*env)->NewStringUTF(env, "hello 52pojie!");
}

5. 编写frida脚本,主动调用这个函数

function main() {
Java.perform(function () { var libJniTest_addr = Module.findBaseAddress("libJniTest.so")
console.log("libJniTest 地址:", libJniTest_addr); if (libJniTest_addr) {
var func_sayHello_addr = Module.findExportByName("libJniTest.so", "Java_com_jwxdxnx06_myJNI_sayHello");
console.log("Java_com_jwxdxnx06_myJNI_sayHello 地址:", func_sayHello_addr); // 主动调用
//创建新函数,参数1:函数地址,参数2:返回值类型,参数3:函数参数类型
var func = new NativeFunction(func_sayHello_addr, 'pointer', ['pointer'])
// 通过Java.vm获得env
var retVal = func(Java.vm.getEnv())
var ret = Java.vm.getEnv().getStringUtfChars(retVal, null).readCString();
console.log(ret) }
}) } setTimeout(main)

5. 尝试hook函数,改变函数的输出

function main() {
Java.perform(function () { var libJniTest_addr = Module.findBaseAddress("libJniTest.so")
console.log("libJniTest 地址:", libJniTest_addr); if (libJniTest_addr) {
var func_sayHello_addr = Module.findExportByName("libJniTest.so", "Java_com_jwxdxnx06_myJNI_sayHello");
console.log("Java_com_jwxdxnx06_myJNI_sayHello 地址:", func_sayHello_addr);
//hook
Interceptor.attach(func_sayHello_addr, {
onEnter: function(args) {
var env = args[0];
console.log("=== env: " + env)
},
onLeave: function(retVal) {
console.log("=== retVal: " + retVal)
var j_str = Java.vm.getEnv().newStringUtf("helloworld123")
retVal.replace(ptr(j_str))
}
}) // 主动调用
//创建新函数,参数1:函数地址,参数2:返回值类型,参数3:函数参数类型
var func = new NativeFunction(func_sayHello_addr, 'pointer', ['pointer'])
var retVal = func(Java.vm.getEnv())
var ret = Java.vm.getEnv().getStringUtfChars(retVal, null).readCString();
console.log(ret)
} }) } setTimeout(main)

6. 执行命令

frida -UF com.jwxdxnx06 -l lesson04.js --no-pause

日志

libJniTest 地址: 0xc73c3000
Java_com_jwxdxnx06_myJNI_sayHello 地址: 0xc73c3c5d
=== env: 0xdc411c40
=== retVal: 0x9
helloworld123

【Android逆向】frida hook so 函数的更多相关文章

  1. Android逆向进阶(7)——揭开Hook的神秘面纱

    本文作者:i春秋作家——HAI_ 0×00 前言 HAI_逆向使用手册(想尝试一下新的写法) 其他 Android逆向进阶 系列课程 <<<<<<< 人物说明 ...

  2. Android逆向之旅---Native层的Hook神器Cydia Substrate使用详解

    一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...

  3. 史上最全面 Android逆向培训之__实战(hook微信)

    我的CSDN博客:https://blog.csdn.net/gfg156196   by--qihao 书接上文,上回说到了xposed,接下来就用一下,体验一下商业项目的赶脚…… 上一篇:史上最全 ...

  4. Android 安全研究 hook 神器frida学习(一)

    在进行安卓安全研究时,hook技术是不可或缺的,常用的有Xposed:Java层的HOOK框架,由于要修改Zgote进程,需要Root,体验过Xposed,整个过程还是很繁琐的,并且无法hook,na ...

  5. android免root hook框架legend

    一.前言 Android中hook框架已经非常多了,最优秀的当属Xposed和Substrate了,这两个框架我在之前的文章都详细介绍过了,不了解的同学,可以转战这里:http://www.wjdia ...

  6. Frida用法之函数操作

    Frida接口功能介绍   Frida是个so级别的hook框架,它可以帮助开发.安全人员对指定的进程的so模块进行分析.它主要提供了功能简单的Python接口和功能丰富的JS接口,使得hook函数和 ...

  7. Android逆向之旅---Android应用的汉化功能(修改SO中的字符串内容)

    一.前言 今天我们继续来讲述逆向的知识,今天我们来讲什么呢?我们在前一篇文章中介绍了关于SO文件的格式,今天我们继续这个话题来看看如何修改SO文件中的内容,看一下我们研究的主题: 需求:想汉化一个Ap ...

  8. 2021年正确的Android逆向开发学习之路

    2021年正确的Android逆向开发学习之路 说明 文章首发于HURUWO的博客小站,本平台做同步备份发布.如有浏览或访问异常或者相关疑问可前往原博客下评论浏览. 原文链接 2021年正确的Andr ...

  9. [转]Android逆向之动态调试总结

    一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆 ...

  10. android逆向学习小结--CrackMe_1

    断断续续的总算的把android开发和逆向的这两本书看完了,虽然没有java,和android开发的基础,但总体感觉起来还是比较能接收的,毕竟都是触类旁通的.当然要深入的话还需要对这门语言的细节特性和 ...

随机推荐

  1. [转帖]TIKV扩容之刨坑填坑​

    01 背景 某tidb集群收到告警,TIKV 节点磁盘使用率85%以上,联系业务无法快速删除数据,于是想到扩容TIKV 节点,原先TIKV 节点机器都是6TB的硬盘,目前只有3TB的机器可扩,也担心r ...

  2. 关于信创CPU测试的一些想法和思路

    关于信创CPU测试的一些想法和思路 背景 最近荷兰政府颁布了关于半导体设备出口管制的最新条例. 好像45nm以下的工艺的设备都可能收到限制. 对中国的相关厂商比如长鑫还有华虹的影响应该都比较大. 认为 ...

  3. [转帖]Kdump调试机理详细总结(一)

    https://blog.csdn.net/luckiers/category_11796393.html 一.简介 本文主要讲解Kdump的运行机理,后续两个章节会详细介绍kdump的使用和如何分析 ...

  4. Redis scan等命令的学习与研究

    Redis scan等命令的学习与研究 摘要 背景跟前几天说的一个问题类似. 为了验证自己的设想, 所以晚上继续写脚本进行了一轮次的验证. 不过上次讨论时,打击好像都没听懂我说的 所以这次准备从基础开 ...

  5. CoreDNS的配置文件修改

    CoreDNS的配置文件修改 今天浪费了4个小时来调整coredns 这里简单记录一下 注意修改点: 1 kubernetes cluster.local. 需要增加集群内的配置 2 forward ...

  6. 【发现一个问题】macos m2 下无法使用 x86_64-linux-musl-gcc 链接含有 avx512 指令的 c 代码

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 一开始是使用 golang 中的 cgo 来编译: env ...

  7. [洛谷]P1967-最小生成树-好题推荐

    [NOIP2013 提高组] 货车运输 题目背景 NOIP2013 提高组 D1T3 题目描述 A 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\),城市之间有 \(m\) 条双向道路.每 ...

  8. 解决VS选择运行“在证书存储区中找不到清单签名证书”

     转:https://www.cnblogs.com/190196539/archive/2011/12/03/2272861.html 解决"在证书存储区中找不到清单签名证书" ...

  9. PXE+Kickstart 自动化部署系统

    PXE 预启动执行环境是由Intel开发的技术,可以让计算机通过网络来启动操作系统(前提是计算机上安装的网卡支持PXE技术),主要用于在无人值守安装系统中引导客户端主机安装Linux操作系统. Kic ...

  10. conditional_t和enable_if_t的实现

      conditional_t和enable_if_t是元编程里面很相似却有有着一定区别的模板.形如conditional_t<_Cond, _If, _Else>是指如果_Cond表达式 ...