安卓逆向-new-sec6-4 Java反射相关知识以及平头哥框架hook构造函数 | App发布测试版本感染
反射机制
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发布测试版本感染相关推荐
- Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...
- java 反射基础知识
java 反射 基础知识 反射:reflection 反射关键类 java 反射部分应用 反射:reflection 在运行中分析类. 在运行中查看和操作对象. 基于反射自己创建对象. 调用不可以访问 ...
- Java多线程相关知识【17】--设计模式--上下文模式(Context)
文章目录 Java多线程相关知识[17]--设计模式--上下文模式(Context) 1. 问题的引入 2. 解决方法 1. 解决理论 2. 实操代码 上下文数据保存 上文 下文 调度者 测试上下文 ...
- native层 安卓_安卓逆向——拼xx协议java层分析
制丨阿星 整理丨阿星 老铁们大家好,今天小编给大家带来很实用的技巧叫拼xx协议java层分析,有啥不足的地方望大家指点指点! 首先抓包 反编译 这个时间段我们方法剖析一下 找到onclick 看他的 ...
- java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点
关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...
- 12000+字Java反射,一起全面了解Java反射机制,为学习框架铺路
文章目录 Java反射机制 理解Class类 获取Class类实例 类的加载过程 类加载器ClassLoader 创建运行时类的对象 获取运行时类的结构 调用运行时类的指定结构 动态代理 Java反射 ...
- java基础相关知识
1.JAVA中的单例模式 单例设计模式所解决的问题就是:保证类的对象在内存中唯一. 单例模式分为:懒汉式单例.饿汉式单例.登记式单例三种. 1)饿汉式单例类.在类初始化时,已经自行实例化 2)懒汉式单 ...
- java反射 基本知识
2019独角兽企业重金招聘Python工程师标准>>> java反射是一个十分重要的点,所有复杂的功能,框架如spring的IOC,RPC异步通信等 都用到了反射.反射简单理解 是 ...
- 学习Java的相关知识
工作的原因现在学习Java极其相关的技术,包括JBoss,Struts,JSP,EJB等. 感觉Java的库比较多,但做的真的一般,易用性很差,编程也非常的"片断"性,不像.NET ...
最新文章
- 如何将文件放到服务器,如何将服务器文件放到云服务器
- 人工智能数学基础----导数
- 开源圆桌 QA 集锦
- kubernetes一步一步搭建与https访问
- (百度云服务器的)域名不加www可以访问,添加就不能访问 (添加域名绑定)- 解决篇
- 学历影响程序员的工资吗?
- html表示主题内容的标签是,HTML 基本标签
- 删除指定目录下的所有文件与更改文件扩展名
- 骁龙660_骁龙660卖到4000元!这款手机哪里来的自信?
- springboot+vue+websocket 消息推送
- 栈溢出脚本_CTF必备技能丨Linux Pwn入门教程——栈溢出基础
- AD导入原理图库PCB库文件 最强原理图PCB库
- csv 计算机系统化验证,计算机化系统CSV验证问答.doc
- linux eclipse安装使用教程
- 阿里Sophix 集成
- 游戏开发工具引擎/模拟器收集
- Namenode服务挂
- CFI Flash, JEDEC Flash ,Parellel Flash, SPI Flash, Nand Flash,Nor Flash的区别和联系
- 微信小程序与内嵌网页交互实现支付功能
- linux-学习目标