Mercurial > paraspace
annotate paraspace/injection.py @ 154:c659b8c7d6cb
Use right opcode formats
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Wed, 17 Aug 2011 08:36:33 +0800 |
parents | bc213cb88636 |
children |
rev | line source |
---|---|
87 | 1 |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
2 def _relocatable_children(obj): |
106
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
105
diff
changeset
|
3 from paraspace.dex_deptracker import _dex_tree_get_child |
100
355986e5cfbd
Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents:
99
diff
changeset
|
4 from paraspace.dexfile import relocatable, array |
106
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
105
diff
changeset
|
5 |
100
355986e5cfbd
Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents:
99
diff
changeset
|
6 if isinstance(obj, array): |
106
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
105
diff
changeset
|
7 rel_children = [('items.' + str(idx), value) |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
105
diff
changeset
|
8 for idx, value in enumerate(obj.items) |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
105
diff
changeset
|
9 if isinstance(value, relocatable)] |
100
355986e5cfbd
Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents:
99
diff
changeset
|
10 return rel_children |
87 | 11 |
106
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
105
diff
changeset
|
12 attrs = obj.children() |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
105
diff
changeset
|
13 attr_value_pairs = [(attr, _dex_tree_get_child(obj, attr)) |
7821c6e89622
dexfile_redirect_types() is almost ready.
Thinker K.F. Li <thinker@codemud.net>
parents:
105
diff
changeset
|
14 for attr in attrs] |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
15 rel_children = [(attr, value) for attr, value in attr_value_pairs |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
16 if isinstance(value, relocatable)] |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
17 return rel_children |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
18 |
87 | 19 |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
20 ## \brief Travel relocatable descendants. |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
21 # |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
22 # \param cloner is the function to return a clone. |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
23 # \param adjuster is called to adjust the clone. |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
24 # \param visit_log is a dictionary to keep clones. |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
25 # |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
26 def _travel_desc_relocatable(obj, worker, visit_log): |
87 | 27 if id(obj) in visit_log: |
28 return visit_log[id(obj)] | |
29 | |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
30 result = worker(obj) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
31 visit_log[id(obj)] = result |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
32 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
33 rel_children = _relocatable_children(obj) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
34 for attr, value in rel_children: |
96
1769e52bdd9d
Make dexfile_insert_class() pass the testcase
Thinker K.F. Li <thinker@codemud.net>
parents:
94
diff
changeset
|
35 _travel_desc_relocatable(value, worker, visit_log) |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
36 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
37 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
38 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
39 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
40 ## \brief Return name string of a linked class definition item. |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
41 def classdef_name(classdef): |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
42 return classdef.classIdx.descriptorIdx.stringDataOff.data |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
43 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
44 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
45 ## \brief Return a map that map type of a object to the list of a DEXFile. |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
46 def dex_type_2_array_attr_map(): |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
47 global dex_type_2_array_attr_map |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
48 from paraspace.dexfile import DEXFile, array |
98
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
96
diff
changeset
|
49 from paraspace.dex_deptracker import _marker |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
96
diff
changeset
|
50 |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
96
diff
changeset
|
51 def skip_marker_type(clazz): |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
96
diff
changeset
|
52 while isinstance(clazz, _marker): |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
96
diff
changeset
|
53 clazz = clazz.back_type |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
96
diff
changeset
|
54 pass |
c0c127c7b37e
Check and fix issues of map sizes
Thinker K.F. Li <thinker@codemud.net>
parents:
96
diff
changeset
|
55 return clazz |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
56 |
100
355986e5cfbd
Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents:
99
diff
changeset
|
57 attr_values = [(attr, skip_marker_type(getattr(DEXFile, attr))) |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
58 for attr in dir(DEXFile)] |
100
355986e5cfbd
Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents:
99
diff
changeset
|
59 array_attrs = [(skip_marker_type(value.child_type), attr) |
355986e5cfbd
Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents:
99
diff
changeset
|
60 for attr, value in attr_values |
355986e5cfbd
Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents:
99
diff
changeset
|
61 if isinstance(value, array)] |
355986e5cfbd
Make surce methods of injected class are also being and bug fixed.
Thinker K.F. Li <thinker@codemud.net>
parents:
99
diff
changeset
|
62 type_2_attr = dict(array_attrs) |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
63 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
64 dex_type_2_array_attr_map = lambda: type_2_attr |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
65 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
66 return type_2_attr |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
67 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
68 |
105
f14c32108164
Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
69 _saved_dex_type_2_array_attr_map = dex_type_2_array_attr_map |
f14c32108164
Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
70 |
f14c32108164
Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
71 |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
72 ## \brief Append a object to appropriate list of a DEXFile object. |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
73 # |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
74 # Skip the object if found no appropriate list. |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
75 # |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
76 def dex_append_obj_list(dex, obj): |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
77 from paraspace.dex_deptracker import _dex_tree_get_child |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
78 from paraspace.dex_deptracker import _dex_tree_set_child |
134
3dee4d929e1f
Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
79 from paraspace.dexfile import _DEX_TypeList, _DEX_TypeList_align |
135
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
80 from paraspace.dexfile import array_sorted |
134
3dee4d929e1f
Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
81 |
147
a95b69de2e22
Fix bug of returning _DEX_TypeList_align of dex_append_obj_list()
Thinker K.F. Li <thinker@codemud.net>
parents:
146
diff
changeset
|
82 ret_obj = obj |
134
3dee4d929e1f
Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
83 if isinstance(obj, _DEX_TypeList): |
3dee4d929e1f
Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
84 wrapper = _DEX_TypeList_align() |
3dee4d929e1f
Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
85 wrapper.value = obj |
3dee4d929e1f
Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
86 obj = wrapper |
3dee4d929e1f
Wrap _DEX_TypeList to _DEX_TypeList_align before append to list.
Thinker K.F. Li <thinker@codemud.net>
parents:
131
diff
changeset
|
87 pass |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
88 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
89 type_2_attr = dex_type_2_array_attr_map() |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
90 try: |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
91 attr = type_2_attr[obj.__class__] |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
92 except KeyError: |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
93 return |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
94 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
95 array = getattr(dex, attr) |
135
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
96 |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
97 if isinstance(array, array_sorted): |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
98 if obj in array.items: |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
99 idx = array.items.index(obj) |
147
a95b69de2e22
Fix bug of returning _DEX_TypeList_align of dex_append_obj_list()
Thinker K.F. Li <thinker@codemud.net>
parents:
146
diff
changeset
|
100 obj = array.items[idx] |
a95b69de2e22
Fix bug of returning _DEX_TypeList_align of dex_append_obj_list()
Thinker K.F. Li <thinker@codemud.net>
parents:
146
diff
changeset
|
101 if isinstance(obj, _DEX_TypeList_align): |
a95b69de2e22
Fix bug of returning _DEX_TypeList_align of dex_append_obj_list()
Thinker K.F. Li <thinker@codemud.net>
parents:
146
diff
changeset
|
102 return obj.value |
a95b69de2e22
Fix bug of returning _DEX_TypeList_align of dex_append_obj_list()
Thinker K.F. Li <thinker@codemud.net>
parents:
146
diff
changeset
|
103 return obj |
135
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
104 pass |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
105 |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
106 array.items.append(obj) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
107 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
108 count_name = array.count_name |
96
1769e52bdd9d
Make dexfile_insert_class() pass the testcase
Thinker K.F. Li <thinker@codemud.net>
parents:
94
diff
changeset
|
109 if count_name: |
1769e52bdd9d
Make dexfile_insert_class() pass the testcase
Thinker K.F. Li <thinker@codemud.net>
parents:
94
diff
changeset
|
110 count = _dex_tree_get_child(dex, count_name) |
1769e52bdd9d
Make dexfile_insert_class() pass the testcase
Thinker K.F. Li <thinker@codemud.net>
parents:
94
diff
changeset
|
111 _dex_tree_set_child(dex, count_name, count + 1) |
1769e52bdd9d
Make dexfile_insert_class() pass the testcase
Thinker K.F. Li <thinker@codemud.net>
parents:
94
diff
changeset
|
112 pass |
135
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
113 |
147
a95b69de2e22
Fix bug of returning _DEX_TypeList_align of dex_append_obj_list()
Thinker K.F. Li <thinker@codemud.net>
parents:
146
diff
changeset
|
114 return ret_obj |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
115 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
116 |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
117 ## \brief Clone a composite object. |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
118 # |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
119 # \param dex is the DEXFile that the composite object is cloning for. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
120 # \param comobj is composite object that is cloning. |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
121 # |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
122 def _clone_composite(dex, comobj): |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
123 from copy import copy |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
124 from paraspace.dexfile import _DEX_StringDataItem, _DEX_StringId |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
125 from paraspace.dexfile import _DEX_TypeId |
105
f14c32108164
Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
126 from paraspace.dex_deptracker import _dex_tree_set_child |
f14c32108164
Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
127 from paraspace.dex_deptracker import _dex_tree_get_child |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
128 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
129 visit_log = {} |
87 | 130 |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
131 def cloner(obj): |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
132 clone = copy(obj) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
133 return clone |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
134 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
135 def relink_dependencies(clone): |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
136 rel_children = _relocatable_children(clone) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
137 for attr, value in rel_children: |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
138 clone_value = visit_log[id(value)] |
105
f14c32108164
Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
139 _dex_tree_set_child(clone, attr, clone_value) |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
140 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
141 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
142 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
143 def merge_unique_strdata(): |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
144 strdatas = [(obj_id, obj) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
145 for obj_id, obj in visit_log.items() |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
146 if isinstance(obj, _DEX_StringDataItem)] |
99
3898711adb2c
Make sure string data list is consistent.
Thinker K.F. Li <thinker@codemud.net>
parents:
98
diff
changeset
|
147 dex_str_2_strdata = dict([(strdata.data.data, strdata) |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
148 for strdata in dex.stringDataItems.items]) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
149 for obj_id, strdata in strdatas: |
99
3898711adb2c
Make sure string data list is consistent.
Thinker K.F. Li <thinker@codemud.net>
parents:
98
diff
changeset
|
150 if strdata.data.data in dex_str_2_strdata: |
3898711adb2c
Make sure string data list is consistent.
Thinker K.F. Li <thinker@codemud.net>
parents:
98
diff
changeset
|
151 visit_log[obj_id] = dex_str_2_strdata[strdata.data.data] |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
152 else: |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
153 dex_append_obj_list(dex, strdata) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
154 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
155 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
156 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
157 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
158 def merge_unique_strid(): |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
159 strids = [(obj_id, obj) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
160 for obj_id, obj in visit_log.items() |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
161 if isinstance(obj, _DEX_StringId)] |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
162 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
163 for obj_id, strid in strids: |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
164 relink_dependencies(strid) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
165 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
166 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
167 strdata_2_strid = dict([(strid.stringDataOff, strid) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
168 for strid in dex.stringIds.items]) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
169 for obj_id, strid in strids: |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
170 if strid.stringDataOff in strdata_2_strid: |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
171 visit_log[obj_id] = strdata_2_strid[strid.stringDataOff] |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
172 else: |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
173 dex_append_obj_list(dex, strid) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
174 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
175 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
176 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
177 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
178 def merge_unique_typeid(): |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
179 typeids = [(obj_id, obj) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
180 for obj_id, obj in visit_log.items() |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
181 if isinstance(obj, _DEX_TypeId)] |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
182 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
183 for obj_id, typeid in typeids: |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
184 relink_dependencies(typeid) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
185 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
186 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
187 strid_2_typeid = dict([(typeid.descriptorIdx, typeid) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
188 for typeid in dex.typeIds.items]) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
189 for obj_id, typeid in typeids: |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
190 if typeid.descriptorIdx in strid_2_typeid: |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
191 visit_log[obj_id] = strid_2_typeid[typeid.descriptorIdx] |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
192 else: |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
193 dex_append_obj_list(dex, typeid) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
194 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
195 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
196 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
197 |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
198 _travel_desc_relocatable(comobj, cloner, visit_log) |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
199 |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
200 merge_unique_strdata() |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
201 merge_unique_strid() |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
202 merge_unique_typeid() |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
203 |
135
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
204 relink_list = [] |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
205 for key, obj in visit_log.items(): |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
206 if isinstance(obj, (_DEX_StringDataItem, |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
207 _DEX_StringId, |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
208 _DEX_TypeId)): |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
209 continue |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
210 r = dex_append_obj_list(dex, obj) |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
211 if r and r is not obj: |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
212 visit_log[key] = r |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
213 else: |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
214 relink_list.append(obj) |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
215 pass |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
216 pass |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
217 |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
218 for obj in relink_list: |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
219 if isinstance(obj, (_DEX_StringDataItem, |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
220 _DEX_StringId, |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
221 _DEX_TypeId)): |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
222 continue |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
223 relink_dependencies(obj) |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
224 pass |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
225 |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
226 clone = visit_log[id(comobj)] |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
227 return clone |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
228 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
229 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
230 ## \brief Clone a class definition item |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
231 # |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
232 # \param dex is the DEXFile that clazz is cloning for. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
233 # \param clazz is the class definition item that is cloning. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
234 # \return the cloning _DEX_ClassDef. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
235 # |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
236 def _clone_classdef(dex, clazz): |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
237 from paraspace.dexfile import DEXFile_linked, _DEX_ClassDef |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
238 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
239 def has_classdef(clazz): |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
240 classname = DEXFile_linked.get_classdef_name(clazz) |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
241 try: |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
242 dex.find_class_name(classname) |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
243 except ValueError: |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
244 return False |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
245 return True |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
246 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
247 assert isinstance(clazz, _DEX_ClassDef) |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
248 |
96
1769e52bdd9d
Make dexfile_insert_class() pass the testcase
Thinker K.F. Li <thinker@codemud.net>
parents:
94
diff
changeset
|
249 if has_classdef(clazz): |
88
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
250 raise RuntimeError, \ |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
251 'clone a class \'%s\'that is already in the DEXFile' % \ |
bbe8d5cbe368
Clone objects with meta info
Thinker K.F. Li <thinker@codemud.net>
parents:
87
diff
changeset
|
252 classdef_name(clazz) |
94
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
253 |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
254 clone = _clone_composite(dex, clazz) |
94
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
255 return clone |
87 | 256 |
257 | |
94
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
258 ## \brief Clone a class definition and insert into a DEXFile. |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
259 # |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
260 # This function clone a class definition from a linked DEXFile and |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
261 # insert it into another one. |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
262 # |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
263 # \param dex is a DEXFile_linked to insert the clone. |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
264 # \param class_def is a class definition going to be cloned. |
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
265 # |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
266 def dexfile_insert_class(dex, classdef): |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
267 clone = _clone_classdef(dex, classdef) |
94
88645ab29aeb
dexfile_insert_class() returns a clone object
Thinker K.F. Li <thinker@codemud.net>
parents:
88
diff
changeset
|
268 return clone |
104 | 269 |
270 | |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
271 ## \biref Relative object set for a _DEX_ClassData. |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
272 class classdef_rel_set(object): |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
273 classdefs = None |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
274 typeids = None |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
275 strids = None |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
276 fieldids = None |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
277 |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
278 def __init__(self, classdefs, typeids, strids, fieldids): |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
279 self.classdefs = set(classdefs) |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
280 self.typeids = set(typeids) |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
281 self.strids = set(strids) |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
282 self.fieldids = set(fieldids) |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
283 pass |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
284 |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
285 @staticmethod |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
286 def dup(src): |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
287 return relative_obj_set(src.classdefs, src.typeids, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
288 src.strids, str.fieldids) |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
289 |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
290 def update(self, new_data): |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
291 self.classdefs.update(new_data.classdefs) |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
292 self.typeids.update(new_data.typeids) |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
293 self.strids.update(new_data.strids) |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
294 self.fieldids.update(new_data.fieldids) |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
295 pass |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
296 pass |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
297 |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
298 |
151 | 299 ## \brief Collect all type and string indices mentioned in the method code. |
300 # | |
301 # \param method is a \ref _DEX_Method. | |
302 # \return a list of type indices mentioned in the code. | |
303 # | |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
304 def collect_typeidxs_stridxs_fieldidxs_in_method(dex, method): |
151 | 305 from paraspace.dexfile import _DEX_Method, DEXFile_linked |
306 from paraspace.dalvik_opcodes import decode_insn_blk, all_opcodes | |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
307 from paraspace.dalvik_opcodes import all_opcodes |
151 | 308 |
309 assert isinstance(method, _DEX_Method) | |
310 | |
311 def get_typeidx_methodidx(methodidx): | |
312 methodid = dex.find_methodid_idx(methodidx) | |
313 method_typeid = methodid.classIdx | |
314 method_typeidx = dex.get_idx_typeid(method_typeid) | |
315 return method_typeidx | |
316 | |
317 def collect_types_in_op_vector(op_vector): | |
318 code, args = op_vector | |
319 | |
320 if code == all_opcodes.OP_NEW_INSTANCE: | |
321 return args[1] | |
322 | |
323 if code in (all_opcodes.OP_INVOKE_DIRECT, | |
324 all_opcodes.OP_INVOKE_VIRTUAL, | |
325 all_opcodes.OP_INVOKE_SUPER, | |
326 all_opcodes.OP_INVOKE_STATIC, | |
327 all_opcodes.OP_INVOKE_INTERFACE): | |
328 methodidx = args[2] | |
329 method_typeidx = get_typeidx_methodidx(methodidx) | |
330 return method_typeidx | |
331 | |
332 if code in (all_opcodes.OP_INVOKE_VIRTUAL_RANGE, | |
333 all_opcodes.OP_INVOKE_DIRECT_RANGE, | |
334 all_opcodes.OP_INVOKE_SUPER_RANGE, | |
335 all_opcodes.OP_INVOKE_STATIC_RANGE, | |
336 all_opcodes.OP_INVOKE_INTERFACE_RANGE): | |
337 methodidx = args[1] | |
338 method_typeidx = get_typeidx_methodidx(methodidx) | |
339 return method_typeidx | |
340 | |
341 return None | |
342 | |
343 def collect_strings_in_op_vector(op_vector): | |
344 code, args = op_vector | |
345 if code == all_opcodes.OP_CONST_STRING: | |
346 stridx = args[1] | |
347 return stridx | |
348 | |
349 return None | |
350 | |
154
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
351 field2_opcodes = set([all_opcodes.OP_IGET, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
352 all_opcodes.OP_IGET_WIDE, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
353 all_opcodes.OP_IGET_OBJECT, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
354 all_opcodes.OP_IGET_BOOLEAN, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
355 all_opcodes.OP_IGET_BYTE, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
356 all_opcodes.OP_IGET_CHAR, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
357 all_opcodes.OP_IGET_SHORT, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
358 all_opcodes.OP_IPUT, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
359 all_opcodes.OP_IPUT_WIDE, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
360 all_opcodes.OP_IPUT_OBJECT, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
361 all_opcodes.OP_IPUT_BOOLEAN, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
362 all_opcodes.OP_IPUT_BYTE, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
363 all_opcodes.OP_IPUT_CHAR, |
154
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
364 all_opcodes.OP_IPUT_SHORT]) |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
365 |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
366 field1_opcodes = set([all_opcodes.OP_SGET, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
367 all_opcodes.OP_SGET_WIDE, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
368 all_opcodes.OP_SGET_OBJECT, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
369 all_opcodes.OP_SGET_BOOLEAN, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
370 all_opcodes.OP_SGET_BYTE, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
371 all_opcodes.OP_SGET_CHAR, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
372 all_opcodes.OP_SGET_SHORT, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
373 all_opcodes.OP_SPUT, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
374 all_opcodes.OP_SPUT_WIDE, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
375 all_opcodes.OP_SPUT_OBJECT, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
376 all_opcodes.OP_SPUT_BOOLEAN, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
377 all_opcodes.OP_SPUT_BYTE, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
378 all_opcodes.OP_SPUT_CHAR, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
379 all_opcodes.OP_SPUT_SHORT]) |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
380 |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
381 def collect_fields_in_op_vector(op_vector): |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
382 code, args = op_vector |
154
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
383 if code in field2_opcodes: |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
384 fieldidx = args[2] |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
385 return fieldidx |
154
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
386 elif code in field1_opcodes: |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
387 fieldidx = args[1] |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
388 return fieldidx |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
389 pass |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
390 |
151 | 391 code_blk = DEXFile_linked.get_code_block_method(method) |
392 op_vectors = decode_insn_blk(code_blk) | |
393 types_insns = [collect_types_in_op_vector(op_vector) | |
394 for op_vector in op_vectors] | |
395 typeidxs = [idx for idx in types_insns if idx is not None] | |
396 | |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
397 strs_insns = [collect_strings_in_op_vector(op_vector) |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
398 for op_vector in op_vectors] |
151 | 399 stridxs = [idx for idx in strs_insns if idx is not None] |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
400 |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
401 fields_insns = [collect_fields_in_op_vector(op_vector) |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
402 for op_vector in op_vectors] |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
403 fieldidxs = [idx for idx in fields_insns if idx is not None] |
151 | 404 |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
405 return typeidxs, stridxs, fieldidxs |
151 | 406 |
407 | |
408 ## \brief Collect all type and string indices mentioned by the class code. | |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
409 def collect_typeidxs_stridxs_fieldidxs_mentioned_by_class(dex, classdef): |
151 | 410 from paraspace.dexfile import DEXFile_linked |
411 | |
412 assert isinstance(dex, DEXFile_linked) | |
413 | |
414 typeidxs = set() | |
415 stridxs = set() | |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
416 fieldidxs = set() |
151 | 417 methods = DEXFile_linked.get_methods_classdef(classdef) |
418 for method in methods: | |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
419 method_typeidxs, method_stridxs, method_fieldidxs = \ |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
420 collect_typeidxs_stridxs_fieldidxs_in_method(dex, method) |
151 | 421 typeidxs.update(method_typeidxs) |
422 stridxs.update(method_stridxs) | |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
423 fieldidxs.update(method_fieldidxs) |
151 | 424 pass |
425 | |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
426 return list(typeidxs), list(stridxs), list(fieldidxs) |
151 | 427 |
428 | |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
429 ## \brief Collect info of classes mentioned by the code of given class. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
430 def _find_class_relative(dex, classdef): |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
431 def classify_typeids_defined(dex, typeids): |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
432 classdefs = [] |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
433 undef_typeids = [] |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
434 for typeid in typeids: |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
435 try: |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
436 classdef = dex.find_class_typeid(typeid) |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
437 except ValueError: |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
438 undef_typeids.append(typeid) |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
439 else: |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
440 classdefs.append(classdef) |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
441 pass |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
442 pass |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
443 return classdefs, undef_typeids |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
444 |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
445 typeidxs, stridxs, fieldidxs = \ |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
446 collect_typeidxs_stridxs_fieldidxs_mentioned_by_class(dex, classdef) |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
447 typeids = [dex.find_typeid_idx(typeidx) |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
448 for typeidx in typeidxs] |
149
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
449 strids = [dex.find_strid_idx(idx) for idx in stridxs] |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
450 fieldids = [dex.find_fieldid_idx(idx) for idx in fieldidxs] |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
451 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
452 classdefs, typeids = classify_typeids_defined(dex, typeids) |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
453 |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
454 rel_set = classdef_rel_set(classdefs, typeids, strids, fieldids) |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
455 return rel_set |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
456 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
457 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
458 def dexfile_insert_classdefs(dex_dst, dex_src, classdefs): |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
459 clones = [dexfile_insert_class(dex_dst, classdef) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
460 for classdef in classdefs] |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
461 return clones |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
462 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
463 |
149
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
464 ## \brief Insert _DEX_StringId into another DEX. |
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
465 def dexfile_insert_stringid(dex_dst, dex_src, strid): |
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
466 clone = _clone_composite(dex_dst, strid) |
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
467 return clone |
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
468 |
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
469 |
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
470 ## \brief Insert _DEX_StringIds into another DEX. |
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
471 def dexfile_insert_stringids(dex_dst, dex_src, strids): |
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
472 clones = [dexfile_insert_stringid(dex_dst, dex_src, strid) |
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
473 for strid in strids] |
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
474 return clones |
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
475 |
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
476 |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
477 ## \brief Insert _DEX_FieldId into another DEX. |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
478 def dexfile_insert_fieldid(dex_dst, dex_src, fieldid): |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
479 clone = _clone_composite(dex_dst, fieldid) |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
480 return clone |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
481 |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
482 |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
483 ## \brief Insert _DEX_FieldIds into another DEX. |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
484 def dexfile_insert_fieldids(dex_dst, dex_src, fieldids): |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
485 clones = [dexfile_insert_fieldid(dex_dst, dex_src, fieldid) |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
486 for fieldid in fieldids] |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
487 return clones |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
488 |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
489 |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
490 ## \brief Clone and insert a _DEX_TypeId to another DEXFile_linked. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
491 # |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
492 # \param dex_dst is a DEXFile_linked where the cloning one is inserted. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
493 # \param dex_src is a DEXFile_linked where the cloned one is from. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
494 # \param typeid is a _DEX_TypeId that is cloned. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
495 # \return the cloning _DEX_TypeId. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
496 # |
146
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
497 def dexfile_insert_or_merge_typeid(dex_dst, dex_src, typeid): |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
498 from paraspace.dexfile import _DEX_TypeId, DEXFile_linked, _DEX_MethodId |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
499 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
500 assert isinstance(typeid, _DEX_TypeId) |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
501 |
146
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
502 def typeid_not_in_dst(typeid): |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
503 typename = DEXFile_linked.get_typeid_name(typeid) |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
504 try: |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
505 dex_dst.find_typeid_name(typename) |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
506 except ValueError: |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
507 return True |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
508 return False |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
509 |
146
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
510 if typeid_not_in_dst(typeid): |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
511 cloning = _clone_composite(dex_dst, typeid) |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
512 |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
513 methodids = dex_src.find_methodids_typeid(dex_src, typeid) |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
514 for methodid in methodids: |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
515 _clone_composite(dex_dst, methodid) |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
516 pass |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
517 pass |
146
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
518 else: |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
519 typename = DEXFile_linked.get_typeid_name(typeid) |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
520 cloning = dex_dst.find_typeid_name(typename) |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
521 |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
522 methodids = dex_src.find_methodids_typeid(typeid) |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
523 for methodid in methodids: |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
524 methodname = DEXFile_linked.get_methodid_name(methodid) |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
525 try: |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
526 dex_dst.find_methodid_name_proto(methodname, methodid.protoIdx, |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
527 cloning) |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
528 except ValueError: |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
529 cloning_methodid = _clone_composite(dex_dst, methodid) |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
530 pass |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
531 pass |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
532 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
533 return cloning |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
534 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
535 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
536 ## \brief Clone and insert a list of _DEX_TypeId objects to a DEXFile_linked. |
146
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
537 def dexfile_insert_or_merge_typeids(dex_dst, dex_src, typeids): |
032877e14560
Merge typeid and methodids if injected type is already in destinate
Thinker K.F. Li <thinker@codemud.net>
parents:
145
diff
changeset
|
538 clones = [dexfile_insert_or_merge_typeid(dex_dst, dex_src, typeid) |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
539 for typeid in typeids] |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
540 return clones |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
541 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
542 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
543 ## \brief Collects relative type IDs and classes definition for given class. |
114
867184e01852
Change interface of dexfile_insert_classdefs_relative
Thinker K.F. Li <thinker@codemud.net>
parents:
113
diff
changeset
|
544 def collect_classdefs_relative(dex, classdefs): |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
545 rel_set = classdef_rel_set(classdefs, [], [], []) |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
546 |
114
867184e01852
Change interface of dexfile_insert_classdefs_relative
Thinker K.F. Li <thinker@codemud.net>
parents:
113
diff
changeset
|
547 classdef_queue = list(classdefs) |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
548 while classdef_queue: |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
549 cur_classdef = classdef_queue.pop(0) |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
550 |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
551 new_rel_set = _find_class_relative(dex, cur_classdef) |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
552 rel_set.update(new_rel_set) |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
553 new_classdefs = new_rel_set.classdefs - rel_set.classdefs |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
554 classdef_queue = classdef_queue + list(new_classdefs) |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
555 pass |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
556 return rel_set |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
557 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
558 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
559 ## \brief Clone and insert given and relative classes into another DEXFile. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
560 # |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
561 # \param dex_dst is a DEXFile_linked where the class will be inserted. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
562 # \param dex_src is a DEXFile_linked where the cloned class is from. |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
563 # \param classdef is a _DEX_ClassDef that will be cloned. |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
564 # \return a vector of a list of classdefs and a list of typeids. |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
565 # |
114
867184e01852
Change interface of dexfile_insert_classdefs_relative
Thinker K.F. Li <thinker@codemud.net>
parents:
113
diff
changeset
|
566 def dexfile_insert_classdefs_relative(dex_dst, dex_src, classdefs): |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
567 from paraspace.dexfile import DEXFile_linked |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
568 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
569 def classdef_not_in_dst(classdef): |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
570 classname = DEXFile_linked.get_classdef_name(classdef) |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
571 try: |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
572 dex_dst.find_class_name(classname) |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
573 except ValueError: |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
574 return True |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
575 return False |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
576 |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
577 rel_set = collect_classdefs_relative(dex_src, classdefs) |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
578 |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
579 for classdef in rel_set.classdefs: |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
580 if classdef_not_in_dst(classdef): |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
581 continue |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
582 raise ValueError, '%s is already in DEX %s: can not insert it' % \ |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
583 (repr(classdef), repr(dex_dst)) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
584 |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
585 cloning_classdefs = \ |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
586 dexfile_insert_classdefs(dex_dst, dex_src, rel_set.classdefs) |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
587 cloning_typeids = \ |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
588 dexfile_insert_or_merge_typeids(dex_dst, dex_src, rel_set.typeids) |
149
d4533a59c694
inject_classdefs() also inject relative _DEX_StringIds.
Thinker K.F. Li <thinker@codemud.net>
parents:
148
diff
changeset
|
589 cloning_strids = \ |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
590 dexfile_insert_stringids(dex_dst, dex_src, rel_set.strids) |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
591 cloning_fieldids = \ |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
592 dexfile_insert_fieldids(dex_dst, dex_src, rel_set.fieldids) |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
593 |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
594 cloning = classdef_rel_set(cloning_classdefs, cloning_typeids, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
595 cloning_strids, cloning_fieldids) |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
596 return cloning |
111
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
597 |
3820379b34e8
Add dexfile_insert_class_relative()
Thinker K.F. Li <thinker@codemud.net>
parents:
110
diff
changeset
|
598 |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
599 ## \brief Redirect types, methods and strings for the code of given method. |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
600 def method_redirect_indices(dex, method, typeidxs_redir, methods_redir, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
601 stridxs_redir, fieldidxs_redir): |
104 | 602 from paraspace.dalvik_opcodes import decode_insn_blk, all_opcodes |
603 from paraspace.dalvik_opcodes import encode_opcode_vectors | |
604 from paraspace.dexfile import DEXFile_linked | |
605 | |
606 if not method.codeOffRef.is_true: | |
607 return | |
608 | |
609 code = method.codeOffRef.value | |
610 insns_blk = code.insns.data | |
611 op_vectors = decode_insn_blk(insns_blk) | |
612 | |
154
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
613 field2_opcodes = set([all_opcodes.OP_IGET, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
614 all_opcodes.OP_IGET_WIDE, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
615 all_opcodes.OP_IGET_OBJECT, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
616 all_opcodes.OP_IGET_BOOLEAN, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
617 all_opcodes.OP_IGET_BYTE, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
618 all_opcodes.OP_IGET_CHAR, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
619 all_opcodes.OP_IGET_SHORT, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
620 all_opcodes.OP_IPUT, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
621 all_opcodes.OP_IPUT_WIDE, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
622 all_opcodes.OP_IPUT_OBJECT, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
623 all_opcodes.OP_IPUT_BOOLEAN, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
624 all_opcodes.OP_IPUT_BYTE, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
625 all_opcodes.OP_IPUT_CHAR, |
154
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
626 all_opcodes.OP_IPUT_SHORT]) |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
627 |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
628 field1_opcodes = set([all_opcodes.OP_SGET, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
629 all_opcodes.OP_SGET_WIDE, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
630 all_opcodes.OP_SGET_OBJECT, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
631 all_opcodes.OP_SGET_BOOLEAN, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
632 all_opcodes.OP_SGET_BYTE, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
633 all_opcodes.OP_SGET_CHAR, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
634 all_opcodes.OP_SGET_SHORT, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
635 all_opcodes.OP_SPUT, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
636 all_opcodes.OP_SPUT_WIDE, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
637 all_opcodes.OP_SPUT_OBJECT, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
638 all_opcodes.OP_SPUT_BOOLEAN, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
639 all_opcodes.OP_SPUT_BYTE, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
640 all_opcodes.OP_SPUT_CHAR, |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
641 all_opcodes.OP_SPUT_SHORT]) |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
642 |
104 | 643 def redirect(opcode, args): |
644 if opcode == all_opcodes.OP_NEW_INSTANCE: | |
645 typeidx = args[1] | |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
646 if typeidx in typeidxs_redir: |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
647 to_type = typeidxs_redir[typeidx] |
104 | 648 return opcode, (args[0], to_type) |
649 pass | |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
650 elif opcode in (all_opcodes.OP_INVOKE_DIRECT, |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
651 all_opcodes.OP_INVOKE_VIRTUAL, |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
652 all_opcodes.OP_INVOKE_SUPER, |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
653 all_opcodes.OP_INVOKE_STATIC, |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
654 all_opcodes.OP_INVOKE_INTERFACE): |
104 | 655 methodidx = args[2] |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
656 if methodidx not in methods_redir: |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
657 return opcode, args |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
658 |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
659 return opcode, (args[0], args[1], methods_redir[methodidx], |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
660 args[3], args[4], args[5], args[6]) |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
661 elif opcode in (all_opcodes.OP_INVOKE_VIRTUAL_RANGE, |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
662 all_opcodes.OP_INVOKE_DIRECT_RANGE, |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
663 all_opcodes.OP_INVOKE_SUPER_RANGE, |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
664 all_opcodes.OP_INVOKE_STATIC_RANGE, |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
665 all_opcodes.OP_INVOKE_INTERFACE_RANGE): |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
666 methodidx = args[1] |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
667 if methodidx not in methods_redir: |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
668 return opcode, args |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
669 |
138
372009418896
Fix bug of redirect methodid for XXX_RANGE istructions
Thinker K.F. Li <thinker@codemud.net>
parents:
137
diff
changeset
|
670 return opcode, (args[0], methods_redir[methodidx], args[2]) |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
671 elif opcode == all_opcodes.OP_CONST_STRING: |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
672 stridx = args[1] |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
673 if stridx not in stridxs_redir: |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
674 return opcode, args |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
675 |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
676 return opcode, (args[0], stridxs_redir[stridx]) |
154
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
677 elif opcode in field2_opcodes: |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
678 fieldidx = args[2] |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
679 if fieldidx not in fieldidxs_redir: |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
680 return opcode, args |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
681 return opcode, (args[0], args[1], fieldidxs_redir[fieldidx]) |
154
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
682 elif opcode in field1_opcodes: |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
683 fieldidx = args[1] |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
684 if fieldidx not in fieldidxs_redir: |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
685 return opcode, args |
c659b8c7d6cb
Use right opcode formats
Thinker K.F. Li <thinker@codemud.net>
parents:
152
diff
changeset
|
686 return opcode, (args[0], fieldidxs_redir[fieldidx]) |
104 | 687 return opcode, args |
688 | |
689 new_op_vectors = [redirect(opcode, args) for opcode, args in op_vectors] | |
690 new_insns_blk = encode_opcode_vectors(new_op_vectors) | |
691 | |
692 code.insns.data = new_insns_blk | |
693 pass | |
694 | |
695 | |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
696 ## \brief Make a map for methods from source type ID to ones from desinate. |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
697 def make_redir_classes_methods_map(dex_src, typeid_src, |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
698 dex_dst, typeid_dst): |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
699 from paraspace.dexfile import DEXFile_linked |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
700 |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
701 methods_src = [(idx, methodid) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
702 for idx, methodid in enumerate(dex_src.methodIds.items) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
703 if methodid.classIdx == typeid_src] |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
704 |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
705 def make_map_methodid(methodid_src): |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
706 name = DEXFile_linked.get_methodid_name(methodid_src) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
707 proto = methodid_src.protoIdx |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
708 try: |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
709 methodid_dst = \ |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
710 dex_dst.find_methodid_name_proto(name, proto, typeid_dst) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
711 except ValueError: |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
712 return -1 |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
713 methodidx_dst = dex_dst.get_idx_methodid(methodid_dst) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
714 return methodidx_dst |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
715 |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
716 methods_map = [(methodidx_src, make_map_methodid(methodid_src)) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
717 for methodidx_src, methodid_src in methods_src] |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
718 methods_map = [(methodidx_src, methodidx_dst) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
719 for methodidx_src, methodidx_dst in methods_map |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
720 if methodidx_dst != -1] |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
721 methods_map = dict(methods_map) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
722 return methods_map |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
723 |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
724 |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
725 ## \brief Redirect types and methods mentioned in the code of a class. |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
726 # |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
727 # For code of given class definition, Every mentions of types and |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
728 # methods are rewrote to types and methods according typeidxs_redir and |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
729 # methods_redir respectively. |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
730 # |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
731 # \param dex is a DEXFile_linked. |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
732 # \param classdef is a class definition. |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
733 # \param typeidxs_redir is a map of types. |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
734 # \param methods_redir is a map of methods. |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
735 # \param stridxs_redir is a map of strings. |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
736 # \param fieldidxs_redir is a map of fields. |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
737 # |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
738 def class_redirect_indices(dex, classdef, typeidxs_redir, methods_redir, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
739 stridxs_redir, fieldidxs_redir): |
104 | 740 if not classdef.classDataOffRef.is_true: |
741 return | |
742 | |
743 classdata = classdef.classDataOffRef.value | |
744 for method in classdata.directMethods.items: | |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
745 method_redirect_indices(dex, method, typeidxs_redir, methods_redir, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
746 stridxs_redir, fieldidxs_redir) |
104 | 747 pass |
748 for method in classdata.virtualMethods.items: | |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
749 method_redirect_indices(dex, method, typeidxs_redir, methods_redir, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
750 stridxs_redir, fieldidxs_redir) |
104 | 751 pass |
752 pass | |
753 | |
754 | |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
755 ## \brief Make a map to map methods from source types to destinate types. |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
756 # |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
757 # This function create a map to map methods from source types to |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
758 # methods from destinate types in \ref typeidxs_redir. |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
759 # |
119
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
115
diff
changeset
|
760 # \param dex_src is a DEXFile_linked that owns source types. |
4f508f84c8a1
Add inject_redir.py example
Thinker K.F. Li <thinker@codemud.net>
parents:
115
diff
changeset
|
761 # \param dex_dst is a DEXFile_linked that owns destinate types. |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
762 # \param typeidxs_redir is a map of type indices for redirecting types. |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
763 # \return a map of method indices. |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
764 # |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
765 def make_methodidxs_redir_map(dex_src, dex_dst, typeidxs_redir): |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
766 methods_map = {} |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
767 for typeidx_src, typeidx_dst in typeidxs_redir.items(): |
113
ee13c86d84f2
Let user specify redirection map for methods
Thinker K.F. Li <thinker@codemud.net>
parents:
112
diff
changeset
|
768 typeid_src = dex_src.find_typeid_idx(typeidx_src) |
ee13c86d84f2
Let user specify redirection map for methods
Thinker K.F. Li <thinker@codemud.net>
parents:
112
diff
changeset
|
769 typeid_dst = dex_dst.find_typeid_idx(typeidx_dst) |
ee13c86d84f2
Let user specify redirection map for methods
Thinker K.F. Li <thinker@codemud.net>
parents:
112
diff
changeset
|
770 class_methods_map = make_redir_classes_methods_map(dex_src, |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
771 typeid_src, |
113
ee13c86d84f2
Let user specify redirection map for methods
Thinker K.F. Li <thinker@codemud.net>
parents:
112
diff
changeset
|
772 dex_dst, |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
773 typeid_dst) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
774 methods_map.update(class_methods_map) |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
775 pass |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
776 return methods_map |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
777 |
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
778 |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
779 ## \brief Make a map to map string indices from source to destinate DEX. |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
780 # |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
781 # \param dex_src is soruce of the mapping. |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
782 # \param dex_dst is destination of the mapping. |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
783 # \param classdefs is _DEX_ClassDefs from dex_src. |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
784 # \return a mapping for string indices. |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
785 # |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
786 def make_stridxs_redir_map(dex_src, dex_dst): |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
787 stridxs_map = {} |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
788 for idx, strid in enumerate(dex_src.stringIds.items): |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
789 try: |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
790 tgt_idx = dex_dst.stringIds.items.index(strid) |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
791 except ValueError: |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
792 continue |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
793 stridxs_map[idx] = tgt_idx |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
794 pass |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
795 return stridxs_map |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
796 |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
797 |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
798 def make_fieldidxs_redir_map(dex_src, dex_dst): |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
799 fieldidxs_map = {} |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
800 for idx, fieldid in enumerate(dex_src.fieldIds.items): |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
801 try: |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
802 tgt_idx = dex_dst.fieldIds.items.index(fieldid) |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
803 except ValueError: |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
804 continue |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
805 fieldidxs_map[idx] = tgt_idx |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
806 pass |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
807 return fieldidxs_map |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
808 |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
809 |
108
18be67af7f1e
Use method redirection map for defining redirection
Thinker K.F. Li <thinker@codemud.net>
parents:
107
diff
changeset
|
810 ## \biref Redirect types of all code in given DEXFile_linked. |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
811 def dexfile_redirect_indices(dex, typeidxs_redir, methods_redir, stridxs_redir, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
812 fieldidxs_redir, excludes=set([])): |
104 | 813 for classdef in dex.classDefs.items: |
814 typeid = classdef.classIdx | |
105
f14c32108164
Test dexfile_redirect_types
Thinker K.F. Li <thinker@codemud.net>
parents:
104
diff
changeset
|
815 idx = dex.get_idx_typeid(typeid) |
104 | 816 if idx in excludes: |
817 continue | |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
818 class_redirect_indices(dex, classdef, typeidxs_redir, methods_redir, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
819 stridxs_redir, fieldidxs_redir) |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
820 pass |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
821 pass |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
822 |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
823 |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
824 ## \brief Redirect types for code of types specified by given indices. |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
825 def dexfile_redirect_indices_typeidxs(dex, typeidxs_redir, methodidxs_redir, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
826 stridxs_redir, fieldidxs_redir, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
827 typeidxs): |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
828 typeidxs = set(typeidxs) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
829 for classdef in dex.classDefs.items: |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
830 typeid = classdef.classIdx |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
831 idx = dex.get_idx_typeid(typeid) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
832 if idx not in typeidxs: |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
833 continue |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
834 class_redirect_indices(dex, classdef, typeidxs_redir, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
835 methodidxs_redir, stridxs_redir, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
836 fieldidxs_redir) |
104 | 837 pass |
838 pass | |
109
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
839 |
835336632aba
Add collect_typeidxs_in_method()
Thinker K.F. Li <thinker@codemud.net>
parents:
108
diff
changeset
|
840 |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
841 ## \brief Make a mapping for type indices of injection. |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
842 def make_typeidxs_map_after_injection(dex_dst, dex_src, |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
843 relative_classdefs, |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
844 relative_typeids): |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
845 from paraspace.dexfile import DEXFile_linked |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
846 |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
847 def map_src_dst_typeid(typeid): |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
848 idx_src = dex_src.get_idx_typeid(typeid) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
849 typename = DEXFile_linked.get_typeid_name(typeid) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
850 typeid_dst = dex_dst.find_typeid_name(typename) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
851 idx_dst = dex_dst.get_idx_typeid(typeid_dst) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
852 dex_dst.find_typeid_idx(idx_dst) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
853 return idx_src, idx_dst |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
854 |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
855 def map_src_dst_classdef(classdef): |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
856 typeid = classdef.classIdx |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
857 idx_src, idx_dst = map_src_dst_typeid(typeid) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
858 return idx_src, idx_dst |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
859 |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
860 typeidxs_classdefs = [map_src_dst_classdef(classdef) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
861 for classdef in relative_classdefs] |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
862 typeidxs_typeids = [map_src_dst_typeid(typeid) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
863 for typeid in relative_typeids] |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
864 typeidxs_map = dict(typeidxs_classdefs + typeidxs_typeids) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
865 return typeidxs_map |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
866 |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
867 |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
868 ## \brief Redirect code for methods of injected classes. |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
869 def redirect_injected_code(dex_dst, dex_src, classdefs): |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
870 rel_set = collect_classdefs_relative(dex_src, classdefs) |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
871 |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
872 typeidxs_redir = \ |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
873 make_typeidxs_map_after_injection(dex_dst, dex_src, \ |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
874 rel_set.classdefs, \ |
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
875 rel_set.typeids) |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
876 methodidxs_redir = \ |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
877 make_methodidxs_redir_map(dex_src, dex_dst, typeidxs_redir) |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
878 |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
879 stridxs_redir = \ |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
880 make_stridxs_redir_map(dex_src, dex_dst) |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
881 |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
882 fieldidxs_redir = \ |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
883 make_fieldidxs_redir_map(dex_src, dex_dst) |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
884 |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
885 dexfile_redirect_indices_typeidxs(dex_dst, typeidxs_redir, |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
886 methodidxs_redir, |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
887 stridxs_redir, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
888 fieldidxs_redir, |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
889 typeidxs_redir.values()) |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
890 pass |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
891 |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
892 |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
893 ## \brief Inject classes and relative information to a DEX file. |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
894 # |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
895 # \param dex_dst is a DEXFile_linked where to inject classes. |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
896 # \param dex_src is a DEXFile_linked where the class is from. |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
897 # \param classdefs is a list of _DEX_ClassDef instances from \ref dex_src. |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
898 # \return a list of _DEX_ClassDef instances for injection. |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
899 # |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
900 def inject_classdefs(dex_dst, dex_src, classdefs): |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
901 from paraspace.dexfile import DEXFile_linked |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
902 |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
903 assert isinstance(classdefs, (list, tuple)) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
904 assert isinstance(dex_dst, DEXFile_linked) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
905 assert isinstance(dex_src, DEXFile_linked) |
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
906 |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
907 rel_set = dexfile_insert_classdefs_relative(dex_dst, dex_src, classdefs) |
115
d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
Thinker K.F. Li <thinker@codemud.net>
parents:
114
diff
changeset
|
908 redirect_injected_code(dex_dst, dex_src, classdefs) |
150
1eb1b2ca5de4
Use classdef_rel_set to carry relative information.
Thinker K.F. Li <thinker@codemud.net>
parents:
149
diff
changeset
|
909 return list(rel_set.classdefs) |
131
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
910 |
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
911 |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
912 ## \brief Redirect all references of given class and its methods. |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
913 # |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
914 # Redirect all references of given class and its methods to target class. |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
915 # |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
916 def redirect_type(dex, src_classname, tgt_classname, exclude_classnames): |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
917 src_typeid = dex.find_typeid_name(src_classname) |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
918 src_typeidx = dex.get_idx_typeid(src_typeid) |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
919 tgt_typeid = dex.find_typeid_name(tgt_classname) |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
920 tgt_typeidx = dex.get_idx_typeid(tgt_typeid) |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
921 typeidxs_redir = {src_typeidx: tgt_typeidx} |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
922 |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
923 methodidxs_redir = \ |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
924 make_methodidxs_redir_map(dex, dex, typeidxs_redir) |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
925 |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
926 stridxs_redir = {} |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
927 fieldidxs_redir = {} |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
928 |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
929 ex_typeids = [dex.find_typeid_name(name) |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
930 for name in exclude_classnames] |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
931 ex_typeidxs = [dex.get_idx_typeid(typeid) |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
932 for typeid in ex_typeids] |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
933 dexfile_redirect_indices(dex, typeidxs_redir, methodidxs_redir, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
934 stridxs_redir, fieldidxs_redir, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
935 excludes=ex_typeidxs) |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
936 pass |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
937 |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
938 |
131
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
939 ## \brief Inject and redirect a _DEX_ClassDef from one linked to another. |
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
940 # |
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
941 # The _DEX_ClassDef given by inj_classname would be inserted to dst_linked, |
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
942 # and redirect all invoking of type, given by redir_classname, to |
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
943 # the injected one. |
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
944 # |
135
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
945 def inject_redir_no_restore(src_linked, inj_classname, |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
946 dst_linked, redir_classname, decls): |
131
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
947 inj_classdef = src_linked.find_class_name(inj_classname) |
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
948 injected_classdefs = inject_classdefs(dst_linked, src_linked, |
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
949 [inj_classdef]) |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
950 excludes = [dst_linked.get_classdef_name(classdef) |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
951 for classdef in injected_classdefs] |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
952 redirect_type(dst_linked, redir_classname, inj_classname, excludes) |
135
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
953 pass |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
954 |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
955 |
137
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
956 ## \brief Make indices map for typeid and methodid. |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
957 # |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
958 # It is used to create indices maps for typeid and methodid after |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
959 # changing order. For example, after sorting sorted array after an |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
960 # injection, this function create maps for remapping indices mentioned |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
961 # in the code. |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
962 # |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
963 def _make_idx_map(saved_typeids, saved_methodids, saved_strids, saved_fieldids, |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
964 new_typeids, new_methodids, new_strids, new_fieldids): |
137
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
965 methodidxs_map = dict([(idx, new_methodids.index(methodid)) |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
966 for idx, methodid in enumerate(saved_methodids)]) |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
967 typeidxs_map = dict([(idx, new_typeids.index(typeid)) |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
968 for idx, typeid in enumerate(saved_typeids)]) |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
969 stridxs_map = dict([(idx, new_strids.index(strid)) |
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
970 for idx, strid in enumerate(saved_strids)]) |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
971 fieldidxs_map = dict([(idx, new_fieldids.index(fieldid)) |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
972 for idx, fieldid in enumerate(saved_fieldids)]) |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
973 |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
974 return typeidxs_map, methodidxs_map, stridxs_map, fieldidxs_map |
137
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
975 |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
976 |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
977 ## \brief Sort sorted arrays and remapping indices for code blocks. |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
978 # |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
979 # Since sorting changes the order of sorted arrays, code blocks should |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
980 # be updated by remapping indices, typeid indices and methodid indices. |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
981 # |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
982 def dex_sort_sorted_arrays_consistent(dex_linked): |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
983 from paraspace.dex_deptracker import dex_sort_sorted_arrays |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
984 |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
985 saved_typeids = list(dex_linked.typeIds.items) |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
986 saved_methodids = list(dex_linked.methodIds.items) |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
987 saved_strids = list(dex_linked.stringIds.items) |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
988 saved_fieldids = list(dex_linked.fieldIds.items) |
137
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
989 |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
990 dex_sort_sorted_arrays(dex_linked) |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
991 |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
992 new_typeids = dex_linked.typeIds.items |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
993 new_methodids = dex_linked.methodIds.items |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
994 new_strids = dex_linked.stringIds.items |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
995 new_fieldids = dex_linked.fieldIds.items |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
996 typeidxs_map, methodidxs_map, stridxs_map, fieldidxs_map = \ |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
997 _make_idx_map(saved_typeids, saved_methodids, saved_strids, \ |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
998 saved_fieldids, \ |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
999 new_typeids, new_methodids, new_strids, \ |
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
1000 new_fieldids) |
137
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
1001 |
145
c4324c3461e8
Redirect string indices.
Thinker K.F. Li <thinker@codemud.net>
parents:
144
diff
changeset
|
1002 dexfile_redirect_indices(dex_linked, typeidxs_map, methodidxs_map, |
152
bc213cb88636
Inject and redirect fields
Thinker K.F. Li <thinker@codemud.net>
parents:
151
diff
changeset
|
1003 stridxs_map, fieldidxs_map) |
137
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
1004 pass |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
1005 |
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
1006 |
135
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
1007 ## \brief Inject and redirect a _DEX_ClassDef from one linked to another. |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
1008 # |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
1009 # The _DEX_ClassDef given by inj_classname would be inserted to dst_linked, |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
1010 # and redirect all invoking of type, given by redir_classname, to |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
1011 # the injected one. |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
1012 # |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
1013 def inject_redir(src_linked, inj_classname, |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
1014 dst_linked, redir_classname, decls): |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
1015 from paraspace.dex_deptracker import restore_dependencies |
131
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
1016 |
135
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
1017 inject_redir_no_restore(src_linked, inj_classname, |
b488ca519709
Make sure elements are absolute incremental for sorted arrays when injecting.
Thinker K.F. Li <thinker@codemud.net>
parents:
134
diff
changeset
|
1018 dst_linked, redir_classname, decls) |
137
987fead83ce3
Fix issue that dalvik complaining fail to verify code.
Thinker K.F. Li <thinker@codemud.net>
parents:
135
diff
changeset
|
1019 dex_sort_sorted_arrays_consistent(dst_linked) |
131
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
1020 restore_dependencies(dst_linked, decls) |
044bfc415577
Fix issue of data map verification.
Thinker K.F. Li <thinker@codemud.net>
parents:
119
diff
changeset
|
1021 pass |