反射修改
一,介绍
反射修改是一种在运行时改变类的属性和方法的机制,java,go,c#等等语言都有这样的机制,这里就不详细说明是怎么实现的,毕竟相关资料很多,这里主要记录一下我遇到过的反射修改的特征,让人能遇到时知道这是什么。
二,特征
1,会导入import java.lang.reflect.Field()来使用Field
2,会使用getDeclaredField来获取类中的属性
3,会通过setAccessible(true)来绕过访问条件
4,会用set()来修改属性
三,例题
[SWPUCTF 2022 新生赛]android2:
package com.example.ilililililil;
/* loaded from: classes.dex */
public class Encoder {
private int key = 123456789;
public String encode(String str) {
StringBuilder sb = new StringBuilder();
for (char c : str.toCharArray()) {
sb.append((char) (c ^ this.key));
}
return sb.toString();
}
}
这是加密函数,可以看到里面的key是123456789.
那如何判断是否被反射修改呢?
只要右键类名Encoder,然后查找用例,也就是查看这个类被如何使用了。

可以看到出现了关键词getDeclaredField,去那个类看看
package com.example.ilililililil;
import java.lang.reflect.Field;
/* loaded from: classes.dex */
public class MainActlvity {
public MainActlvity() {
try {
Field declaredField = Encoder.class.getDeclaredField("key");
declaredField.setAccessible(true);
declaredField.set(MainActivity.encoder, 987654321);
} catch (IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace();
}
}
}
很清晰明了,获取Encoder中的key属性,然后改为987654321
我目前只遇到这一个,后面遇到别的再补充
本文来自博客园,作者:漫宿骄盛,转载请注明原文链接:https://www.cnblogs.com/msjs/p/18810925
都是顺手发的,写的时候可能有错误,如果发现了,望各位指出。

浙公网安备 33010602011771号