天天开心^_^

Frida Java Hook

23 09月
作者:popsky|分类:Frida相关

使用到的工具

frida:

https://github.com/frida/frida


frida函数提示脚本:

在脚本文件夹执行:npm install --save @types/frida-gum

https://npmjs.com/package/@types/frida-gum


jadx-gui

https://github.com/skylot/jadx


演示DEMO

frida_example_demo2.rar


function ke0(){
    Java.perform(function(){
        console.info("第一课=================");
        var System_Clazz = Java.use("java.lang.System");
        System_Clazz.getenv.overload('java.lang.String').implementation = function (str){
            console.info(str);
            var result = this.getenv(str);
            console.info("返回值:",result);
            result = "Imyang";
            console.info("修改返回值为:",result);
            return result;
        }
    })
}

function keInit(){
    Java.perform(function (){
        console.info("首关====================");
        var LoginActivity = Java.use("com.github.lastingyang.androiddemo.Activity.LoginActivity");
        LoginActivity.a.overload('java.lang.String','java.lang.String').implementation = function (str1,str2){ //有方法重载的静态方法
            var result = this.a(str1,str2);
            console.info("参数内容为:",str1,str2);
            result = "123123";//修改返回值直接
            console.info("返回内容为:",result);
            return result;
        }

    })
}

function ke1(){
    Java.perform(function (){
        console.info("第一关====================");
        var FridaActivity1 = Java.use("com.github.lastingyang.androiddemo.Activity.FridaActivity1");    
        FridaActivity1.a.implementation = function (b){ //没有方法重载的静态方法
            var result = this.a(b);
            result = "R4jSLLLLLLLLLLOrLE7/5B+Z6fsl65yj6BgC6YWz66gO6g2t65Pk6a+P65NK44NNROl0wNOLLLL=";
            return result;
        }

    })
}

function ke2(){
    Java.perform(function (){
        console.info("第二关====================");
        var FridaActivity2 = Java.use("com.github.lastingyang.androiddemo.Activity.FridaActivity2");
        //静态方法可以直接执行
        FridaActivity2.setStatic_bool_var();//可以直接执行
        console.info("静态方法执行成功!");  
        // 以下注释代码执行报错
        // FridaActivity2.setBool_var();
        // console.info("非静态方法执行成功!");   
       
        //非静态方法,需要通过Java.choose 方法遍历符合条件的实例类,并且进行操作,这对于那些无法直接获取到实例引用的场景非常有用。
        Java.choose("com.github.lastingyang.androiddemo.Activity.FridaActivity2",{
            onMatch : function(instance){ //对每个匹配的实例进行处理
                console.info("遍历到类!");
                instance.setBool_var();
            },
            onComplete : function(){ //在遍历结束后执行一些清理操作。
                console.info("执行完清空!");
            }
        });

    })
}

function ke3(){
    Java.perform(function (){
        console.info("第三关====================");
        var FridaActivity3 = Java.use("com.github.lastingyang.androiddemo.Activity.FridaActivity3");
        //先调用非静态方法进行打印
        Java.choose("com.github.lastingyang.androiddemo.Activity.FridaActivity3",{
            onMatch : function (instance){
                console.info("bool_var:",instance.bool_var.value);
                //注释掉的部分直接这样写不行,因为same_name_bool_var除了是变量名以外,还有一个相同名字的方法名,所以,要写成_same_name_bool_var
                //console.info("same_name_bool_var:",instance.same_name_bool_var.value);
                console.info("same_name_bool_var:",instance._same_name_bool_var.value);
                console.info("static_bool_var:",instance.static_bool_var.value);
   
                //修改静态变量
                instance.bool_var.value = true;
                //instance.same_name_bool_var.value = true;
                instance._same_name_bool_var.value = true;
                FridaActivity3.static_bool_var.value = true;
   
                console.info("bool_var:",instance.bool_var.value);
                //console.info("same_name_bool_var:",instance.same_name_bool_var.value); 
                console.info("same_name_bool_var:",instance._same_name_bool_var.value);
                console.info("static_bool_var:",instance.static_bool_var.value);          
            },
            onComplete : function (){
   
            }
        });
    })
}

function ke4(){
    Java.perform(function (){
        console.info("第四关====================");
        var FridaActivity4$InnerClasses = Java.use("com.github.lastingyang.androiddemo.Activity.FridaActivity4$InnerClasses");
        FridaActivity4$InnerClasses.check1.implementation = function (){
            return true;
        }
        FridaActivity4$InnerClasses.check2.implementation = function (){
            return true;
        }
        FridaActivity4$InnerClasses.check3.implementation = function (){
            return true;
        }
        FridaActivity4$InnerClasses.check4.implementation = function (){
            return true;
        }
        FridaActivity4$InnerClasses.check5.implementation = function (){
            return true;
        }
        FridaActivity4$InnerClasses.check6.implementation = function (){
            return true;
        }
        console.info("第四关执行完毕!");
    })
}


function ke5(){
    //核心代码
    // public void onCheck(){
    //     if (this.getDynamicDexCheck() != null) {
    //        if (this.getDynamicDexCheck().check()) {
    //           this.CheckSuccess();
    //           this.startActivity(new Intent(this, FridaActivity6.class));
    //           this.finishActivity(0);
    //        }else {
    //           super.CheckFailed();
    //        }
    //     }else {
    //        Toast.makeText(this, "onClick loaddex Failed!", 1).show();
    //     }
    //     return;
    //  }
    Java.perform(function (){
        console.info("第五关====================");
        var getDynamicDexCheckNotNull = false;
        //首先需要判断getDynamicDexCheck是否为null
        Java.choose("com.github.lastingyang.androiddemo.Activity.FridaActivity5",{
            onMatch : function (instance){
                var Object_this = instance.getDynamicDexCheck();
                if (Object_this != null){
                    getDynamicDexCheckNotNull = true;
                }
            },
            onComplete : function (){

            }          
        });
        if (getDynamicDexCheckNotNull) { //如果不为空
            console.info("getDynamicDexCheck不为空!");
            //2.this.getDynamicDexCheck().check() 查看这个方法的返回,发现check是接口:public interface abstract CheckInterface,
            //check的实现方法是在assets/DynamicPlugin.dex中,解压出来并且用工具打开反编译
           
            //遍历classLoader
            Java.enumerateClassLoaders({
                onMatch : function (loader){
                    try{
                        if (loader.findClass("com.example.androiddemo.Dynamic.DynamicCheck")){
                            console.info("已经找到了classloader");
                            Java.classFactory.loader = loader; //切换这个loader
                            console.info(loader);
                        }
                    }catch(error){

                    }
                },
                onComplete : function (){

                }
            });
            var DynamicCheck = Java.use("com.example.androiddemo.Dynamic.DynamicCheck");
            //HOOK 不区分静态方法和非静态方法
            DynamicCheck.check.implementation = function (){
                var result = this.check();
                console.info("原始返回:",result);
                result = true;
                console.info("修改后返回:",result);
                return result;
            }

        }
    })
}

function ke6(){
    Java.perform(function (){
        console.info("第六关====================");
        var Frida6Class0 = Java.use("com.github.lastingyang.androiddemo.Activity.Frida6.Frida6Class0");
        var Frida6Class1 = Java.use("com.github.lastingyang.androiddemo.Activity.Frida6.Frida6Class1");
        var Frida6Class2 = Java.use("com.github.lastingyang.androiddemo.Activity.Frida6.Frida6Class2");
        Frida6Class0.check.implementation = function (){
            return true;
        }
        Frida6Class1.check.implementation = function (){
            return true;
        }
        Frida6Class2.check.implementation = function (){
            return true;
        }
    })
}

function ke7(){
    console.info("第七关====================");
    Java.perform(function(){
        //首先在点击onCheck时候触发,也就是HOOK掉这个方法
        var FridaActivity7 = Java.use("com.github.lastingyang.androiddemo.Activity.FridaActivity7");
        FridaActivity7.$init.implementation = function (){
            this.$init();
            this.next.value = true;
            console.info("执行了构造方法!");
        }
    })
}

function ke8(){
    Java.perform(function (){
        //首先获取到局部变量的值
        var password = null;
        Java.choose("com.github.lastingyang.androiddemo.Activity.FridaActivity8",{
            onMatch : function (instance){
                password =instance.password.value;
                console.info("password:",password);
            },
            onComplete : function (){
            }          
        });
        if (password != null){
            var FridaActivity8 = Java.use("com.github.lastingyang.androiddemo.Activity.FridaActivity8");
            FridaActivity8.a.implementation = function (str){
                return password;
            }
        }
       
    })
}
function main(){
    ke0();
    keInit();
    ke1();
    ke2();
    ke3();
    ke4();
    ke5();
    ke6();
    ke7();
    ke8();
}

setImmediate(main);




浏览207 评论0
返回
目录
返回
首页
TNetHTTPClient组件使用SOCKS5代理 查看ELF文件的信息

发表评论