comparison examples/inject_redir.py @ 131:044bfc415577

Fix issue of data map verification. - Dalvik complain that data map generated by inject_redir.py is unexpected. - Test case map_verify_error_test() - Refactor inject_redir.py to paraspace.injection.inject_redir().
author Thinker K.F. Li <thinker@codemud.net>
date Tue, 09 Aug 2011 11:47:43 +0800
parents b381aa95fbad
children
comparison
equal deleted inserted replaced
130:117047deda64 131:044bfc415577
5 # methods. All calls of specified class will be redirected to the 5 # methods. All calls of specified class will be redirected to the
6 # injected class. 6 # injected class.
7 # 7 #
8 from paraspace.dexfile import DEXFile, DEXFile_linked 8 from paraspace.dexfile import DEXFile, DEXFile_linked
9 from paraspace.dex_deptracker import prepare_dep_decls 9 from paraspace.dex_deptracker import prepare_dep_decls
10 from paraspace.dex_deptracker import restore_dependencies 10 from paraspace.injection import inject_redir
11 from paraspace.dex_deptracker import dex_sort_sorted_arrays
12 from paraspace.injection import inject_classdefs, make_methodidxs_redir_map
13 from paraspace.injection import dexfile_redirect_types
14 import sys 11 import sys
15 12
16 if len(sys.argv) != 6: 13 if len(sys.argv) != 6:
17 print >> sys.stderr, \ 14 print >> sys.stderr, \
18 'usage: %s <src dex> <inject class> ' \ 15 'usage: %s <src dex> <inject class> ' \
19 '<dst dex> <redirect class> <output>' % \ 16 '<dst dex> <redirect class> <output>' % \
20 (sys.argv[0]) 17 (sys.argv[0])
21 sys.exit(1) 18 sys.exit(1)
22 pass 19 pass
23 20
24 src_dexname = sys.argv[1]
25 inj_classname = sys.argv[2]
26 dst_dexname = sys.argv[3]
27 redir_classname = sys.argv[4]
28 output_name = sys.argv[5]
29 21
30 decls = prepare_dep_decls() 22 if __name__ == '__main__':
31 23 src_dexname = sys.argv[1]
32 src_dex = DEXFile.open(src_dexname) 24 inj_classname = sys.argv[2]
33 src_linked = DEXFile_linked.build_dependencies(src_dex, decls) 25 dst_dexname = sys.argv[3]
34 26 redir_classname = sys.argv[4]
35 dst_dex = DEXFile.open(dst_dexname) 27 output_name = sys.argv[5]
36 dst_linked = DEXFile_linked.build_dependencies(dst_dex, decls) 28
37 29 decls = prepare_dep_decls()
38 inj_classdef = src_linked.find_class_name(inj_classname) 30
39 injected_classdefs = inject_classdefs(dst_linked, src_linked, [inj_classdef]) 31 src_dex = DEXFile.open(src_dexname)
40 32 src_linked = DEXFile_linked.build_dependencies(src_dex, decls)
41 redir_typeid = dst_linked.find_typeid_name(redir_classname) 33
42 redir_typeidx = dst_linked.get_idx_typeid(redir_typeid) 34 dst_dex = DEXFile.open(dst_dexname)
43 inj_typeid = dst_linked.find_typeid_name(inj_classname) 35 dst_linked = DEXFile_linked.build_dependencies(dst_dex, decls)
44 inj_typeidx = dst_linked.get_idx_typeid(inj_typeid) 36
45 typeidxs_redir = {redir_typeidx: inj_typeidx} 37 inject_redir(src_linked, inj_classname,
46 38 dst_linked, redir_classname, decls)
47 methodidxs_redir = \ 39
48 make_methodidxs_redir_map(dst_linked, dst_linked, typeidxs_redir) 40 restore_raw = dst_linked.to_str()
49 41
50 injected_typeidxs = [dst_linked.get_idx_classdef(classdef) 42 ofile = open(output_name, 'w')
51 for classdef in injected_classdefs] 43 ofile.write(restore_raw)
52 dexfile_redirect_types(dst_linked, typeidxs_redir, methodidxs_redir, 44 ofile.close()
53 excludes=injected_typeidxs) 45 pass
54
55 dex_sort_sorted_arrays(dst_linked)
56 restore_dependencies(dst_linked, decls)
57
58 restore_raw = dst_linked.to_str()
59
60 ofile = open(output_name, 'w')
61 ofile.write(restore_raw)
62 ofile.close()