当前位置:   article > 正文

android逆向基础教程一_安卓逆向教程

安卓逆向教程

工具 :Jadx AndroidKiller frida

熟练使用jadx ,Androidkiller frida,了解android逆向流程分析,熟悉Smali汇编以及Frida脚本编写,通过Jadx 流程分析android 中逻辑代码。AndroidKiller修改Smali汇编方式修改执行流程重新打包绕过某些逻辑条件判断,frida hook在逆向中占有重要地位,熟练掌握 frida hook基础知识是逆向必不可少的内容。

一、loginActivity

流程分析

解题

方法一:逻辑算法计算获取密码

通过逻辑算法输入用户名计算出返回的字符串即为密码。

  1. public class Main {
  2.    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
  3.        String inputs1="PwnGuo";
  4.       String str =a(inputs1,inputs1);
  5.       System.out.println("log:"+str);
  6.   }
  7.    public static String a(String str, String str2) throws InvalidKeyException, NoSuchAlgorithmException {
  8.            SecretKeySpec secretKeySpec = new SecretKeySpec(str2.getBytes(), "HmacSHA256");
  9.            Mac instance = Mac.getInstance("HmacSHA256");
  10.            instance.init(secretKeySpec);
  11.            return a(instance.doFinal(str.getBytes())) ;
  12.   }
  13.    private static String a(byte[] bArr) {
  14.        StringBuilder sb = new StringBuilder();
  15.        int i = 0;
  16.        while (bArr != null && i < bArr.length) {
  17.            String hexString = Integer.toHexString(bArr[i] & 255);
  18.            if (hexString.length() == 1) {
  19.                sb.append('0');
  20.           }
  21.            sb.append(hexString);
  22.            i++;
  23.       }
  24.        return sb.toString().toLowerCase();
  25.   }
  26. }
  27. //log:12638599104995570fcae7895cc54a57e485d9818887ba6762c5abaaebe670dc

方法二:Smali 汇编修改绕过

1.AndroidKiller 直接硬编码修改成功跳过

2.AndroidKiller插桩方式输出计算后的密码成功完成

  用户名 :123456 密码:b8ad08a3a547e35829b821b75370301dd8c4b06bdd7771f9b541a75914068718

方法三:hook Java 层函数

通过hook a方法的返回参数获得密码

  1. function hook_java() {
  2.    Java.perform(function () {
  3.        var LoginActivity = Java.use("com.example.androiddemo.Activity.LoginActivity");
  4.        console.log(LoginActivity);
  5.        LoginActivity.a.overload('java.lang.String', 'java.lang.String').implementation = function (str, str2) {
  6.            var result = this.a(str, str2);     //调用原来的函数
  7.            console.log("LoginActivity.a:", str, str2, result);
  8.            return result;
  9.       };
  10.        var FridaActivity1 = Java.use("com.example.androiddemo.Activity.FridaActivity1");
  11.        console.log(FridaActivity1);
  12.        //hook函数,没有调用原来的函数,直接返回值
  13.        FridaActivity1.a.implementation = function (barr) {
  14.            console.log("FridaActivity1.a");
  15.            return "R4jSLLLLLLLLLLOrLE7/5B+Z6fsl65yj6BgC6YWz66gO6g2t65Pk6a+P65NK44NNROl0wNOLLLL=";
  16.       };
  17.        console.log("hook_java");
  18.   });
  19. }

二、FridaActivity1

流程分析

解题

方法一: Smali 汇编修改

直接修改onCheck()方法中返回值

 

或者修改a(byte[] bArr)方法中返回值。

方法二:hook Java 层函数

修改函数返回值或参数

  1. function hook_java() {
  2.    Java.perform(function () {
  3.        var FridaActivity1 = Java.use("com.example.androiddemo.Activity.FridaActivity1");
  4.        console.log(FridaActivity1);
  5.        //hook函数,没有调用原来的函数,直接返回值
  6.        FridaActivity1.a.implementation = function (barr) {
  7.            console.log("FridaActivity1.a");
  8.            return "R4jSLLLLLLLLLLOrLE7/5B+Z6fsl65yj6BgC6YWz66gO6g2t65Pk6a+P65NK44NNROl0wNOLLLL=";
  9.       };
  10.        console.log("hook_java");
  11.   });
  12. }

三、FridaActivity2

流程分析

解题

通过分析 static_bool_var bool_var参数为true时第二关通关成功,修改参数或调用setStatic_bool_var()/setBool_var()方法即可

方法一:修改跳转语句

方法二:直接调用方法

 方法三:hook Java 层函数

调用静态函数和调用非静态函数

  1. function call_FridaActivity2() {
  2.    //主动调用函数
  3.    Java.perform(function () {
  4.        var FridaActivity2 = Java.use("com.example.androiddemo.Activity.FridaActivity2");
  5.        //调用静态函数
  6.        FridaActivity2.setStatic_bool_var();    
  7.        //Java.choose 非静态函数调用
  8.        Java.choose("com.example.androiddemo.Activity.FridaActivity2", {
  9.            onMatch: function (instance) {
  10.                instance.setBool_var();
  11.           },
  12.            onComplete: function () {
  13.           }
  14.       });
  15.   });
  16. }

四、FridaActivity3

流程分析

静态/非静态成员变量通过满足if语句使通关成功

在Smali汇编中静态成员变量与非静态成员变量区别

 

解题

方法一:修改成员变量boolan值

方法二:设置成员变量

设置静态成员变量,非静态成员变量和函数名相同的成员变量

  1. function call_FridaActivity3() {
  2.    Java.perform(function () {
  3.        var FridaActivity3 = Java.use("com.example.androiddemo.Activity.FridaActivity3");
  4.        //设置静态成员变量
  5.        FridaActivity3.static_bool_var.value = true;      
  6.        console.log(FridaActivity3.static_bool_var.value);
  7.        Java.choose("com.example.androiddemo.Activity.FridaActivity3", {
  8.            onMatch: function (instance) {
  9.                //设置非静态成员变量的值
  10.                instance.bool_var.value = true;
  11.                //设置有相同函数名的成员变量的值
  12.                instance._same_name_bool_var.value = true;
  13.                console.log(instance.bool_var.value, instance._same_name_bool_var.value);
  14.           },
  15.            onComplete: function () {
  16.           }
  17.       });
  18.   });
  19. }

五、FridaActivity4

流程分析

解题

方法一:Smali修改返回值

方法二:hook 内部类

  1. //方式一
  2. function hook_InnerClasses() {
  3.    Java.perform(function () {
  4.        
  5.        var InnerClasses = Java.use("com.example.androiddemo.Activity.FridaActivity4$InnerClasses");
  6.        console.log(InnerClasses);
  7.        InnerClasses.check1.implementation = function () {
  8.            return true;
  9.       };
  10.        InnerClasses.check2.implementation = function () {
  11.            return true;
  12.       };
  13.        InnerClasses.check3.implementation = function () {
  14.            return true;
  15.       };
  16.        InnerClasses.check4.implementation = function () {
  17.            return true;
  18.       };
  19.        InnerClasses.check5.implementation = function () {
  20.            return true;
  21.       };
  22.        InnerClasses.check6.implementation = function () {
  23.            return true;
  24.       };
  25.   });
  26. }
  27. //方式二
  28. //枚举类的函数
  29. function hook_enum_function() {
  30.    Java.perform(function () {
  31.        //hook 类的多个函数
  32.        var class_name = "com.example.androiddemo.Activity.FridaActivity4$InnerClasses";
  33.        var InnerClasses = Java.use(class_name);
  34.        var all_methods = InnerClasses.class.getDeclaredMethods();
  35.        for (var i = 0; i < all_methods.length; i++) {
  36.            var method = (all_methods[i]);
  37.            var methodStr = method.toString();
  38.            var substring = methodStr.substr(methodStr.indexOf(class_name) + class_name.length + 1);
  39.            var methodname = substring.substr(0, substring.indexOf("("));
  40.            console.log(methodname);
  41.            InnerClasses[methodname].implementation = function () {
  42.                console.log("hook_mul_function:", this);
  43.                return true;
  44.           }
  45.       }
  46.   });
  47. }

六、FridaActivity5

流程分析

动态加载dex ,调用check()方法,返回参数满足条件语句通关成功。

解题

方法一:Smali修改条件语句

getDynamicDexCheck()接口调用判断成立,只需修改check()方法满足条件。

方法二:hook动态加载的Dex

  1. function hook_dyn_dex() {
  2.    Java.perform(function () {
  3.        var FridaActivity5 = Java.use("com.example.androiddemo.Activity.FridaActivity5");
  4.        Java.choose("com.example.androiddemo.Activity.FridaActivity5", {
  5.            onMatch: function (instance) {
  6.                console.log(instance.getDynamicDexCheck().$className);
  7.           }, onComplete: function () {
  8.           }
  9.       });
  10.        //hook 动态加载的dex
  11.        Java.enumerateClassLoaders({
  12.            onMatch: function (loader) {
  13.                try {
  14.                    if (loader.findClass("com.example.androiddemo.Dynamic.DynamicCheck")) {
  15.                        console.log(loader);
  16.                        Java.classFactory.loader = loader;      //切换classloader
  17.                   }
  18.               } catch (error) {
  19.               }
  20.           }, onComplete: function () {
  21.           }
  22.       });
  23.        var DynamicCheck = Java.use("com.example.androiddemo.Dynamic.DynamicCheck");
  24.        console.log(DynamicCheck);
  25.        DynamicCheck.check.implementation = function () {
  26.            console.log("DynamicCheck.check");
  27.            return true;
  28.       }
  29.   });
  30. }

七、FridaActivity6

流程分析

解题

方法一:Smali修改条件语句

方法二:hook java类

  1. //方式一:直接返回参数为真
  2. function hook_FridaActivity6() {
  3.    Java.perform(function () {
  4.        var Frida6Class0 = Java.use("com.example.androiddemo.Activity.Frida6.Frida6Class0");
  5.        Frida6Class0.check.implementation = function () {
  6.            return true;
  7.       };
  8.        var Frida6Class1 = Java.use("com.example.androiddemo.Activity.Frida6.Frida6Class1");
  9.        Frida6Class1.check.implementation = function () {
  10.            return true;
  11.       };
  12.        var Frida6Class2 = Java.use("com.example.androiddemo.Activity.Frida6.Frida6Class2");
  13.        Frida6Class2.check.implementation = function () {
  14.            return true;
  15.       };
  16.   });
  17. }
  18. //方式二:枚举class
  19. function hook_enum_class() {
  20.    Java.perform(function () {
  21.        Java.enumerateLoadedClasses({
  22.            onMatch: function (name, handle) {
  23.                if (name.indexOf("com.example.androiddemo.Activity.Frida6") >= 0) {
  24.                    console.log(name);
  25.                    var fridaclass6 = Java.use(name);
  26.                    fridaclass6.check.implementation = function () {
  27.                        console.log("frida 6 check:", this);
  28.                        return true;
  29.                   };
  30.               }
  31.           }, onComplete: function () {
  32.           }
  33.       })
  34.   });
  35. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/90522
推荐阅读
相关标签
  

闽ICP备14008679号