首页 > 其他分享 >【Android逆向】frida hook so 函数

【Android逆向】frida hook so 函数

时间:2023-02-18 15:57:27浏览次数:76  
标签:Java addr var hook sayHello so func libJniTest frida

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

标签:Java,addr,var,hook,sayHello,so,func,libJniTest,frida
From: https://www.cnblogs.com/gradyblog/p/17132797.html

相关文章

  • 【Cesium】拿取后台geojson数据绘制图形
    cesiumDraw标绘类mars3d.Draw是实体类,标绘控制处理类,提供文字、点、线、面、立体、模型等各类entity对象的绘制。需求:拿取请求的json数据绘制区域书写基础绘制方法......
  • SpringBoot 官方文档示例(89):使用DataSourceBuilder构建数据源
    一、在application.properties中配置数据源信息app.datasource.url=jdbc:mysql://xxx.xxx.xxx.xxx/testapp.datasource.jdbcUrl=jdbc:mysql://xxx.xxx.xxx.xxx/testapp.data......
  • JSON_UNESCAPED_SLASHES json 不转义反斜杠
    JSON_UNESCAPED_SLASHESJSON_UNESCAPED_UNICODE的意思不要转移汉字,我们在学习使用的时候经常使用这个选项。而JSON_UNESCAPED_SLASHES是用于不要转义反斜杠,在这里选择这......
  • vue2 - 插槽solt,默认插槽,具体名插槽,作用域插槽
    1.默认插槽作用:会把父组件human中的内容全部解析到子组件中的slot中父组件:<template><divid="App"><!--子组件--><human><!--解析到子组件中的内......
  • 自定义比较 PersonT
    classPersonT{public: PersonT(doubleD0,doubleD1,doubleD2,stringstrNUMBER,doubleDX,doubleDY,doubleDZ,doubleDTAG) { this->M_D0=D0; this->M_D1......
  • CF1037G A Game on Strings Sol
    有趣题。首先"分成若干个互不相干的子串"是子游戏的定义,可以用SG函数处理。然而接下来试着打了半个多小时的表,没有找到任何规律。但是发现SG函数的状态转移是很简单......
  • SONiC 202305 release content management
     SONiC采用完全开源的社区开发模式,而Github也提供了除了代码托管之外的很多项目管理功能。针对SONiC202305这个版本发布计划项目,在SONiC的Github托管库sonic-net/SONiC......
  • Solidity极简入门#17. 库合约
    这一讲,我们用ERC721的引用的库合约String为例介绍solidity中的库合约(library),并总结了常用的库函数。库函数库函数是一种特殊的合约,为了提升solidity代码的复用性和减少gas而......
  • Microsoft office 2013官方正版免费完整版腾讯微云下载分享
    Office2013与Office365究竟有什么区别呢?其实Office2013、更老的Office2007、Office2010等版本是安装在微软正版操作系统上的免费套餐,而Office365也包括了office系列所......
  • S2 - Lesson 34 - Quick work
    Words station most    Content QuickworkDanRobinsonhasbeenworriedallweek.LastTuesdayhereceivedaletterfromthelocalpolice.Inth......