安卓实现内存漫游&Xposed逆向必备

前言:

一个安卓原生方法实现内存漫游的功能对象。

之前在摸索了很久,后来在heap.cc里面根据方法名字发现的。具体实现如下。

9.0以下挺大的实现难度挺大的,需要通过Debug调试模式去发送对应的调试指令,才可以实现。

但是9.0原生的可以直接通过原生API实现。具体使用参考下方。感觉不错的还希望留个言支持一下。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

/**

 * @author Zhenxi on 2021/5/5

 *

 * 源码参考:

 * http://androidxref.com/9.0.0_r3/s?refs=ClassD&project=art

 */

public class ChooseUtils {

    private static final Method startMethodTracingMethod;

    private static final Method stopMethodTracingMethod;

    private static final Method getMethodTracingModeMethod;

    private static final Method getRuntimeStatMethod;

    private static final Method getRuntimeStatsMethod;

    private static final Method countInstancesOfClassMethod;

    private static final Method countInstancesOfClassesMethod;

    private static  Method getInstancesOfClassesMethod ;

    static {

        try {

            Class<?> c = Class.forName("dalvik.system.VMDebug");

            startMethodTracingMethod = c.getDeclaredMethod("startMethodTracing", String.class,

                    Integer.TYPE, Integer.TYPE, Boolean.TYPE, Integer.TYPE);

            stopMethodTracingMethod = c.getDeclaredMethod("stopMethodTracing");

            getMethodTracingModeMethod = c.getDeclaredMethod("getMethodTracingMode");

            getRuntimeStatMethod = c.getDeclaredMethod("getRuntimeStat", String.class);

            getRuntimeStatsMethod = c.getDeclaredMethod("getRuntimeStats");

            countInstancesOfClassMethod = c.getDeclaredMethod("countInstancesOfClass",

                    Class.class, Boolean.TYPE);

            countInstancesOfClassesMethod = c.getDeclaredMethod("countInstancesOfClasses",

                    Class[].class, Boolean.TYPE);

            //android 9.0以上才有这个方法

            if(android.os.Build.VERSION.SDK_INT>=28) {

                getInstancesOfClassesMethod = c.getDeclaredMethod("getInstancesOfClasses",

                        Class[].class, Boolean.TYPE);

            }

        catch (Exception e) {

            throw new RuntimeException(e);

        }

    }

    /**

     * 根据Class获取当前进程全部的实例

     *

     * @param clazz 需要查找的Class

     * @return 当前进程的全部实例。

     */

    @TargetApi(28)

    public static ArrayList<Object> choose(Class clazz) {

        return choose(clazz, false);

    }

    /**

     * 根据Class获取当前进程全部的实例

     *

     * @param clazz      需要查找的Class

     * @param assignable 是否包含子类的实例

     * @return 当前进程的全部实例。

     */

    @TargetApi(28)

    public static synchronized ArrayList<Object> choose(Class clazz, boolean assignable) {

        ArrayList<Object> resut = null;

        try {

            Object[][] instancesOfClasses = getInstancesOfClasses(new Class[]{clazz}, assignable);

            if (instancesOfClasses != null) {

                resut = new ArrayList<>();

                for (Object[] instancesOfClass : instancesOfClasses) {

                    resut.addAll(Arrays.asList(instancesOfClass));

                }

            }

        catch (Throwable e) {

            Log.e(Constants.TAG,"ChooseUtils choose error ", e);

            e.printStackTrace();

        }

        return resut;

    }

    @TargetApi(28)

    private static Object[][] getInstancesOfClasses(Class<?>[] classes,

                                                    boolean assignable)

            throws Exception {

        return (Object[][]) getInstancesOfClassesMethod.invoke(

                nullnew Object[]{classes, assignable});

    }

    public static void startMethodTracing(String filename, int bufferSize, int flags,

                                          boolean samplingEnabled, int intervalUs) throws Exception {

        startMethodTracingMethod.invoke(null, filename, bufferSize, flags, samplingEnabled,

                intervalUs);

    }

    public static void stopMethodTracing() throws Exception {

        stopMethodTracingMethod.invoke(null);

    }

    public static int getMethodTracingMode() throws Exception {

        return (int) getMethodTracingModeMethod.invoke(null);

    }

    /**

     *  String gc_count = VMDebug.getRuntimeStat("art.gc.gc-count");

     *  String gc_time = VMDebug.getRuntimeStat("art.gc.gc-time");

     *  String bytes_allocated = VMDebug.getRuntimeStat("art.gc.bytes-allocated");

     *  String bytes_freed = VMDebug.getRuntimeStat("art.gc.bytes-freed");

     *  String blocking_gc_count = VMDebug.getRuntimeStat("art.gc.blocking-gc-count");

     *  String blocking_gc_time = VMDebug.getRuntimeStat("art.gc.blocking-gc-time");

     *  String gc_count_rate_histogram = VMDebug.getRuntimeStat("art.gc.gc-count-rate-histogram");

     *  String blocking_gc_count_rate_histogram =VMDebug.getRuntimeStat("art.gc.gc-count-rate-histogram");

     */

    public static String getRuntimeStat(String statName) throws Exception {

        return (String) getRuntimeStatMethod.invoke(null, statName);

    }

    /**

     * 获取当前进程的状态信息

     */

    public static Map<String, String> getRuntimeStats() throws Exception {

        return (Map<String, String>) getRuntimeStatsMethod.invoke(null);

    }

    public static long countInstancesofClass(Class<?> c, boolean assignable) throws Exception {

        return (long) countInstancesOfClassMethod.invoke(nullnew Object[]{c, assignable});

    }

    public static long[] countInstancesofClasses(Class<?>[] classes, boolean assignable)

            throws Exception {

        return (long[]) countInstancesOfClassesMethod.invoke(

                nullnew Object[]{classes, assignable});

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值