反射修改

一,介绍

反射修改是一种在运行时改变类的属性和方法的机制,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

我目前只遇到这一个,后面遇到别的再补充

posted @ 2025-04-06 10:45  漫宿骄盛  阅读(49)  评论(0)    收藏  举报