frida-js注入文件

本文介绍了如何使用 Frida 进行 JS 文件注入,包括启动服务器、端口转发、查询包名以及具体注入的命令行操作。通过 adb 命令和 Frida 的参数,实现了对指定应用的动态代码注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

frida 注入命令行使用

启动server

adb shell “.//data/local/tmp/xxoo12.8.11”

端口转发

adb forward tcp:27043 tcp:27043

查询包名

adb shell pm list packages -3

注入

frida -U -l js文件 包名

setImmediate(main);
function main(){
   
    Java.perform(function(){
   
        //tongsha();
        zhixie(); 


     });
}
//获取包名类名
//定义方法
//构造方法类名和方法一样$inti	
//重载方法.overload("java.lang.String")
//构造.$init
//setImmediate防止注入超时
// 获取参数两种方式 一种给形参 第二种arguments[0]获取





//

function zhixie(){
   
 var nuo = Java.use("com.leyida.cloud.utils.RSAUtil");
    nuo.encryptByPublicKey.implementation=function(a){
   
       console.log("      ");
       console.log("      ");
       console.log("a:"+a);
       console.log("=================***自设hook开始***=================");
       var data=this.encryptByPublicKey(a);//切记修改函数名
       console.log("结果:"+data);
       console.log("=================***自设hook结束***=================");
       showStacks();
       console.log("=================***调用堆栈打印***=================");
       return data;   
       }

}


function 读取类变量(){
   
    
    Java.perform(function(){
   
        //获取java类  类.变量名.value  方法读取
        //要修改的话直接赋值l.E.value='诺诺'
        var l = Java.use("com.xiaojianbang.app.RSAHex");
        console.log(l.E.value);
        console.log(l.N.value);
    });



}

function 静态方法的主动调用(){
   
    
    Java.perform(function(){
   
        //静态方法的主动调用
        var AES = Java.use("com.xiaojianbang.app.MD5");
        var str = Java.use("java.lang.String");
        var base64 = Java.use("android.util.Base64");
        var bytes = str.$new("nuonuo").getBytes();
        console.log(str.$new(bytes))
        console.log(JSON.stringify(bytes));
        console.log(base64.encodeToString(str.$new("nuonuo").getBytes(),0))
        var rea=AES.md5_1("活活");
        console.log(rea);
    });
}


function 静态方法的主动调用例子(){
   
    Java.perform(function(){
   
        //静态方法的主动调用
        var rsa = Java.use("com.xiaojianbang.app.RSA");
        var str = Java.use("java.lang.String");
        var base64 = Java.use("android.util.Base64");
        var bytes = str.$new("xiaojianbang").getBytes();
        console.log(JSON.stringify(bytes));
        var retval = rsa.encrypt(bytes);
        var result = base64.encodeToString(retval, 0);
        console.log(result);
        //非静态方法的主动调用1 (新建一个对象去调用)
        var res = Java.use("com.xiaojianbang.app.Money").$new("日元", 300000).getInfo();
        console.log(res);
        var utils = Java.use("com.xiaojianbang.app.Utils");
        res = utils.$new().myPrint(["xiaojianbang","is very good"," ","zygx8","is very good"]);
        console.log(res);
        //非静态方法的主动调用2 (获取已有的对象调用)
        Java.choose("com.xiaojianbang.app.Money",{
   
            onMatch: function(obj){
   
                if(obj._name.value == "美元"){
   
                    res = obj.getInfo();
                    console.log(res);
                }
            },
            onComplete: function(){
   

            }
        });

    });
}



function 获取所有已加载的类(){
   
    //frida互交主动调用不用提前注入
    Java.perform(function(){
   
        //要过滤app的包名
        var baoming="com.mg.ec"
         Java.enumerateLoadedClasses({
   
             onMatch: function(name, handle){
   
                 if(name.indexOf(baoming) != -1){
   
                     console.log(name);
                 } 
             },
            onComplete: function(){
   
            }
        });
    });
}

function 获取所有已加载的类的所有方法(){
   
    Java.perform(function(){
   
        // Java.enumerateLoadedClasses({
   
        //     onMatch: function(name, handle){
   
        //         if(name.indexOf("com.xiaojianbang.app") != -1){
   
        //             console.log(name);
        //             var clazz = Java.use(name);
        //             console.log(clazz);
        //             var methods = clazz.class.getDeclaredMethods();
                    
        //             for(var i = 0; i < methods.length; i++){
   
        //                 console.log(methods[i]);
        //             }

        //         }
                
        //     },
        //     onComplete: function(){
   

        //     }
        // });


        //过滤apk包名
        var baoming="com.xiaojianbang.app"

        var classes = Java.enumerateLoadedClassesSync();
        for(var i = 0; i < classes.length; i++){
   
            if(classes[i].indexOf(baoming) != -1){
   
                console.log('');
                console.log('类名*************'+classes[i]);
                var clazz = Java.use(classes[i]);
                var methods = clazz.class.getDeclaredMethods();
                for(var j = 0; j < methods.length; j++){
   
                    console.log('方法:'+methods[j]);
                }
                console.log('');
            }
        }


    });
}


function Hook类的所有方法(){
   
    Java.perform(function(){
   
        //给一个类名
        var md5 = Java.use("com.xiaojianbang.app.MD5");
        var methods = md5.class.getDeclaredMethods();
        for(var j = 0; j < methods.length; j++){
   
            var methodName = methods[j].getName();
            console.log(methodName);

            for(var k = 0; k < md5[methodName].overloads.length; k++){
   

                md5[methodName].overloads[k].implementation = function(){
   
                    for(var i = 0; i < arguments.length; i++){
   
                        console.log(arguments[i]);
                    }
                    return this[methodName].apply(this, arguments);
                }
            }

        }

    });
}





function tuoke(){
   
    //参数2的OpenMemory参数自己把手机的libart.so pull出来.然后看看自己手机OpenMemory的对应签名函数名.
    Interceptor.attach(Module.findExportByName("libart.so", "_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_7OatFileEPS9_"), {
   
    onEnter: function (args) {
   
      
        //dex起始位置
        var begin = args[1]
        //打印magic
        console.log("magic : " + Memory.readUtf8String(begin))
        //dex fileSize 地址
        var address = parseInt(begin,16) + 0x20
        //dex 大小
        var dex_size = Memory.readInt(ptr(address))

        console.log("dex_size :" + dex_size)
        //dump dex 到/data/data/pkg/目录下
        var packageName = "com.androidapp.mibo" // 此处修改为要hook的包名
        var file = new File("/data/data/"+packageName+"/" + dex_size + ".dex", &
<think>嗯,用户让我介绍一下安装这三个Frida相关的工具:fridafrida-tools和frida-dexdump。首先,我需要确认这些包各自的用途,以及用户可能的场景。用户可能是在进行移动应用的安全分析或逆向工程,尤其是Android应用的动态分析,因为frida-dexdump用于脱壳DEX文件。 接下来,我需要回忆每个包的功能。Frida本身是动态插桩工具,允许注入JavaScript到应用中。frida-tools是命令行工具集,提供了一些实用脚本,比如frida-ps列出进程。frida-dexdump则是专门用来从内存中导出DEX文件的,这对分析加壳的应用很有帮助。 然后,安装命令是pip install加上三个包名,这应该没问题。不过需要注意Python环境是否正确,是否用了虚拟环境,或者是否需要管理员权限。常见问题可能包括pip版本过旧,或者依赖项冲突。用户可能遇到安装错误,比如编译原生扩展失败,这时候可能需要安装python-dev或者对应的构建工具。 另外,用户安装后可能需要连接设备,比如Android手机,需要确保adb devices已连接,并且Frida服务器在设备上运行。这部分用户可能不熟悉,可能需要进一步指导,但用户的问题暂时只问到安装步骤。 可能还需要提到版本兼容性问题,比如Frida的客户端和服务器版本必须匹配,否则会出现连接错误。安装时默认是最新版,但如果设备上的Frida server版本旧,可能需要指定版本号安装,比如pip install frida==15.1.17。 最后,验证安装是否成功可以通过执行frida --version或frida-ps -U等命令检查。如果用户遇到问题,可能需要引导他们检查环境变量、权限或者网络问题,比如pip源是否配置正确,是否有防火墙阻止下载。 总结回答结构应该是先介绍每个工具的作用,然后给出安装命令,接着常见问题和解决建议,最后验证安装的步骤。这样用户能够清楚安装的目的,顺利执行,并处理可能的问题。</think>好的,我将分步骤为您介绍安装 `frida`、`frida-tools` 和 `frida-dexdump` 的相关知识: --- ### **1. 工具作用说明** - **Frida** 一款动态代码插桩工具,支持在**Android/iOS/Windows/macOS/Linux**等平台运行时注入JavaScript代码,用于动态调试、逆向分析、Hook函数等。 - **frida-tools** Frida的官方命令行工具集,包含常用功能如: - `frida-ps`:列出设备进程 - `frida-trace`:动态跟踪函数调用 - `frida-discover`:自动发现可Hook的函数 - **frida-dexdump** 专门用于从内存中快速提取**Android应用的DEX文件**(尤其针对加固/加壳应用),支持脱壳分析。 --- ### **2. 安装步骤** 在终端中执行以下命令: ```bash pip install frida frida-tools frida-dexdump ``` --- ### **3. 常见问题与解决** 1. **Python环境问题** - 确保使用正确的Python版本(建议Python 3.7+) - 若系统有多个Python版本,尝试用 `pip3` 替代 `pip` 2. **权限问题** - 若提示权限不足,添加 `--user` 参数: ```bash pip install --user frida frida-tools frida-dexdump ``` 3. **依赖缺失** - Linux/macOS需安装编译工具(如`python3-dev`, `gcc`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值