Mercurial > paraspace
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() |