反射机制


app加上这个属性,也能发布测试版本,被成功感染,无需签名和发布那个release版本

APP是E:\1A_androidstudio_project\course4

插件是E:\1A_androidstudio_project\project_save

// HookConstructorEntry.java
package com.sam.myapplicationcj;import android.util.Log;import com.virjar.ratel.api.rposed.IRposedHookLoadPackage;
import com.virjar.ratel.api.rposed.RC_MethodHook;
import com.virjar.ratel.api.rposed.RposedHelpers;
import com.virjar.ratel.api.rposed.callbacks.RC_LoadPackage;public class HookConstructorEntry implements IRposedHookLoadPackage {private static final String TAG = "yuanrenxue->";@Overridepublic void handleLoadPackage(RC_LoadPackage.LoadPackageParam lpparam) throws Throwable {if (lpparam.packageName.equals("com.yuanrenxue.course4")){Log.d(TAG,"handleLoadPackage: hooked success");// findAndHookConstructor的第一种重载方法(需要传入class实例对象):public static RC_MethodHook.Unhook findAndHookConstructor(Class<?> clazz, Object... parameterTypesAndCallback) {// 通过classLoader去拿class实例对象Class<?> MysteryBoxClass = lpparam.classLoader.loadClass("com.yuanrenxue.course4.MysteryBox");RposedHelpers.findAndHookConstructor(MysteryBoxClass, new RC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {Object[] objects = param.args;Log.d(TAG, "beforeHookedMethod: objects length = " + objects.length);super.beforeHookedMethod(param);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});// findAndHookConstructor的第二种重载方法(需要传入全类名,):public static RC_MethodHook.Unhook findAndHookConstructor(String className, ClassLoader classLoader, Object... parameterTypesAndCallback) {// 其实第二种方法内部也是先调用第一种方法的拿class对象的:先通过方法一classLoader去拿class实例对象->拿到构造器方法->hook// 这里hook带int参数的构造函数RposedHelpers.findAndHookConstructor("com.yuanrenxue.course4.MysteryBox", lpparam.classLoader, int.class, new RC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {Log.d(TAG, "beforeHookedMethod: price:" + param.args[0]);// 修改参数的值param.args[0] = 100000;super.beforeHookedMethod(param);}});// hook传两个参数的那个构造函数RposedHelpers.findAndHookConstructor("com.yuanrenxue.course4.MysteryBox", lpparam.classLoader, int.class,String.class, new RC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {Log.d(TAG, "beforeHookedMethod: price:" + param.args[0]);// 修改参数的值param.args[0] = 100000;param.args[1] = "一个被我暗中打开的盲盒";super.beforeHookedMethod(param);}// 如何拿到构造成功返回的实例@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);// 打印一下param.thisObject和param.getResult()分别拿到的是什么>>>afterHookedMethod: com.yuanrenxue.course4.MysteryBox@d78a80e,null// 构造函数返回值是空值,所以不能通过getResult去拿Log.d(TAG, "afterHookedMethod: " + param.thisObject + "," + param.getResult());}});}}
}
// ExampleUnitTest.java(反射的代码)
package com.yuanrenxue.course4;import org.junit.Test;import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;import static org.junit.Assert.*;/*** Example local unit test, which will execute on the development machine (host).** @see <a href="http://d.android.com/tools/testing">Testing documentation</a>*/
public class ExampleUnitTest {@Testpublic void addition_isCorrect() {assertEquals(4, 2 + 2);}// 获取Class对象的⽅法@Testpublic void getClassDemo() throws Exception{// 1. 通过类直接获取Class<?> class1 = MysteryBox.class;System.out.println(class1);// 2. 通过对象获取ClassMysteryBox box = new MysteryBox();Class<?> aClass = box.getClass();System.out.println(aClass);// 3. 通过全类名获取--通过forNameClass<?> aClass1 = Class.forName("com.yuanrenxue.course4.MysteryBox");System.out.println(aClass1);// 通过全类名获取--通过ClassLoaderClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();Class<?> aClass2 = systemClassLoader.loadClass("com.yuanrenxue.course4.MysteryBox");System.out.println(aClass2);}// 如何判断是否为某个类的实例@Testpublic void checkInstanceOf(){MysteryBox box = new MysteryBox();// 通过instanceOf关键字来判断System.out.println(box instanceof MysteryBox);// class.isInstance--利用反射System.out.println(MysteryBox.class.isInstance(box));// isAssignableFrom--利用反射。System.out.println(box.getClass().isAssignableFrom(MysteryBox.class));// 我插入的两段,为了更好滴理解getClass()和.classSystem.out.println(box.getClass());System.out.println(MysteryBox.class);}// 如何通过反射的思路来创建对象@Testpublic void createInstance() throws Exception{Class<MysteryBox> mysteryBoxClass = MysteryBox.class;// 1. newInstance。使⽤Class对象的newInstance()⽅法来创建Class对象对应类的实例(默认走无参的构造函数)MysteryBox box1 = (MysteryBox) mysteryBoxClass.newInstance();System.out.println(box1.getContent());// 2. 首先获取到构造器,然后实例化类实例。先通过Class对象获取指定的Constructor对象,再调⽤Constructor对象的newInstance()⽅法来创建//实例。这种⽅法可以⽤指定的构造器构造类的实例Constructor<?> constructor = mysteryBoxClass.getConstructor();Object box2 = constructor.newInstance();System.out.println(box2);}// 通过指定不同的的构造器构造类的实例@Testpublic void getConstructor() throws Exception{// 1. getConstructor---只能获取public修饰的构造函数Constructor<?> constructor = MysteryBox.class.getConstructor(int.class);System.out.println(constructor);// 2. getConstructors 获取所有的构造函数---只能获取public修饰的构造函数Constructor<?>[] constructors = MysteryBox.class.getConstructors();System.out.println(Arrays.toString(constructors));// 3. getConstructor 获取private修饰的构造函数---会报错java.lang.NoSuchMethodException: com.yuanrenxue.course4.MysteryBox.<init>(java.lang.String)// Constructor<?> constructor1 = MysteryBox.class.getConstructor(String.class);// 如何获取private构造函数Constructor<MysteryBox> declaredConstructor = MysteryBox.class.getDeclaredConstructor(String.class);System.out.println(declaredConstructor);// 如何获取所有的构造函数,不论是public修饰还是private修饰Constructor<?>[] declaredConstructors = MysteryBox.class.getDeclaredConstructors();System.out.println(Arrays.toString(declaredConstructors));}// 如何获取成员变量@Testpublic void getFields() throws Exception{MysteryBox box = new MysteryBox();// 这里的getField()和上面的getConstructor()一样,只能获取public修饰的属性不能获取private修饰的Field priceField = MysteryBox.class.getField("price");System.out.println(priceField);// 获取所有的public修饰的属性Field[] fields = MysteryBox.class.getFields();for(Field field:fields){// field.get()取得对象的Field属性值,如果字段不是静态字段的话,要传入反射类的对象.如果传null是会报java.lang.NullPointerException,// 如果字段是静态字段的话,传入任何对象都是可以的,包括nullSystem.out.println(field.getName() + "," + field.get(box));}// 获取private修饰的属性Field content = MysteryBox.class.getDeclaredField("content");content.setAccessible(true);System.out.println(box.getContent());System.out.println(content.get(box));box.open();System.out.println(box.getContent());// 获取不论private还是public修饰的属性Field[] declaredFields = MysteryBox.class.getDeclaredFields();for(Field field:declaredFields){field.setAccessible(true);System.out.println(field.getName() + "," + field.get(box));}}// 获取类的方法@Testpublic void getMethods() throws Exception{MysteryBox box = new MysteryBox();// 获取public修饰的方法Method getContent = MysteryBox.class.getMethod("getContent");Object content = getContent.invoke(box);System.out.println(content);// 获取所有public修饰的方法Method[] methods = MysteryBox.class.getMethods();for(Method method:methods){System.out.println(method);}box.open();System.out.println(box.getContent());// 获取private修饰的方法Method close = MysteryBox.class.getDeclaredMethod("close");close.setAccessible(true);close.invoke(box);System.out.println(box.getContent());// 获取不论是public还是private修饰的方法Method[] declaredMethods = MysteryBox.class.getDeclaredMethods();for(Method method:declaredMethods){System.out.println(method);}}
}

安卓逆向-new-sec6-4 Java反射相关知识以及平头哥框架hook构造函数 | App发布测试版本感染相关推荐

  1. Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO

    Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...

  2. java 反射基础知识

    java 反射 基础知识 反射:reflection 反射关键类 java 反射部分应用 反射:reflection 在运行中分析类. 在运行中查看和操作对象. 基于反射自己创建对象. 调用不可以访问 ...

  3. Java多线程相关知识【17】--设计模式--上下文模式(Context)

    文章目录 Java多线程相关知识[17]--设计模式--上下文模式(Context) 1. 问题的引入 2. 解决方法 1. 解决理论 2. 实操代码 上下文数据保存 上文 下文 调度者 测试上下文 ...

  4. native层 安卓_安卓逆向——拼xx协议java层分析

    制丨阿星 整理丨阿星 老铁们大家好,今天小编给大家带来很实用的技巧叫拼xx协议java层分析,有啥不足的地方望大家指点指点! 首先抓包  反编译 这个时间段我们方法剖析一下 找到onclick 看他的 ...

  5. java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点

    关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...

  6. 12000+字Java反射,一起全面了解Java反射机制,为学习框架铺路

    文章目录 Java反射机制 理解Class类 获取Class类实例 类的加载过程 类加载器ClassLoader 创建运行时类的对象 获取运行时类的结构 调用运行时类的指定结构 动态代理 Java反射 ...

  7. java基础相关知识

    1.JAVA中的单例模式 单例设计模式所解决的问题就是:保证类的对象在内存中唯一. 单例模式分为:懒汉式单例.饿汉式单例.登记式单例三种. 1)饿汉式单例类.在类初始化时,已经自行实例化 2)懒汉式单 ...

  8. java反射 基本知识

    2019独角兽企业重金招聘Python工程师标准>>> java反射是一个十分重要的点,所有复杂的功能,框架如spring的IOC,RPC异步通信等 都用到了反射.反射简单理解 是 ...

  9. 学习Java的相关知识

    工作的原因现在学习Java极其相关的技术,包括JBoss,Struts,JSP,EJB等. 感觉Java的库比较多,但做的真的一般,易用性很差,编程也非常的"片断"性,不像.NET ...

最新文章

  1. 如何将文件放到服务器,如何将服务器文件放到云服务器
  2. 人工智能数学基础----导数
  3. 开源圆桌 QA 集锦
  4. kubernetes一步一步搭建与https访问
  5. (百度云服务器的)域名不加www可以访问,添加就不能访问 (添加域名绑定)- 解决篇
  6. 学历影响程序员的工资吗?
  7. html表示主题内容的标签是,HTML 基本标签
  8. 删除指定目录下的所有文件与更改文件扩展名
  9. 骁龙660_骁龙660卖到4000元!这款手机哪里来的自信?
  10. springboot+vue+websocket 消息推送
  11. 栈溢出脚本_CTF必备技能丨Linux Pwn入门教程——栈溢出基础
  12. AD导入原理图库PCB库文件 最强原理图PCB库
  13. csv 计算机系统化验证,计算机化系统CSV验证问答.doc
  14. linux eclipse安装使用教程
  15. 阿里Sophix 集成
  16. 游戏开发工具引擎/模拟器收集
  17. Namenode服务挂
  18. CFI Flash, JEDEC Flash ,Parellel Flash, SPI Flash, Nand Flash,Nor Flash的区别和联系
  19. 微信小程序与内嵌网页交互实现支付功能
  20. linux-学习目标

热门文章

  1. matlab中switch函数的使用
  2. 2022年全球市场柠檬酸酯总体规模、主要生产商、主要地区、产品和应用细分研究报告
  3. 使用PreTranslateMessage(MSG* pMsg)截获键盘数字键
  4. 高数下-空间几何(一)-向量
  5. 帅某---考研---高数笔记---汤家凤---第十章向量代数与空间几何
  6. ios duang 动画简记
  7. van-field 校验手机号码格式
  8. k8s.gcr.io的镜像无法下载的问题
  9. 2019表情包制作工具哪个好用
  10. 流量偷跑,运营商该不该赔偿?