android_parser 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a338a6e092fc1dc50e3c1688f165109dbb900397e51b968b0397877aa4f6a030
4
+ data.tar.gz: 5fbbb6f2630a3a4d2a7b090106c53dd45ac9b8ec6b4be9cb37477d1c5615c594
5
+ SHA512:
6
+ metadata.gz: 7c270a031fc08369c7afa11e274da90c3aa732b86cade0b10066a227de49bafb30b0dd8b14ce7b77a3a347fda85bfefcf5796c55f8b2a5c645309d625030f01c
7
+ data.tar.gz: e850a3d98e71801a57686f8b890d45fa1d65d3459805b6855f9451990a960ba6f608ed147c88ea9ded54fb40ab8c49b4d89d19e014172aa24b8a36ba329dc7d9
data/.gitignore ADDED
@@ -0,0 +1,54 @@
1
+ # rcov generated
2
+ coverage
3
+
4
+ # rdoc generated
5
+ rdoc
6
+
7
+ # yard generated
8
+ doc
9
+ .yardoc
10
+
11
+ # bundler
12
+ .bundle
13
+
14
+ # rvm
15
+ .ruby-version
16
+
17
+ # jeweler generated
18
+ #pkg # upload gem file to server
19
+
20
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
21
+ #
22
+ # * Create a file at ~/.gitignore
23
+ # * Include files you want ignored
24
+ # * Run: git config --global core.excludesfile ~/.gitignore
25
+ #
26
+ # After doing this, these files will be ignored in all your git projects,
27
+ # saving you from having to 'pollute' every project you touch with them
28
+ #
29
+ # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
30
+ #
31
+ # For MacOS:
32
+ #
33
+ .DS_Store
34
+ .idea
35
+
36
+ # For TextMate
37
+ #*.tmproj
38
+ #tmtags
39
+
40
+ # For emacs:
41
+ #*~
42
+ #\#*
43
+ #.\#*
44
+
45
+ # For vim:
46
+ *.swp
47
+
48
+ # For redcar:
49
+ #.redcar
50
+
51
+ # For rubinius:
52
+ #*.rbc
53
+
54
+ pkg/
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ - 2.3.3
5
+ - 2.4.1
data/CHANGELOG.md ADDED
@@ -0,0 +1,45 @@
1
+ # ChangeLog
2
+ ## 0.7.0
3
+ * implement Apk#signs, Apk#certificates and Manifest#version_name (#14, #15)
4
+ * bugfix
5
+
6
+ ## 0.6.0
7
+ * implement Android::Apk#layouts(#10), Android::Apk#icon(#11), Android::Apk#label(#12),
8
+ * fix bug (#13)
9
+
10
+ ## 0.5.1
11
+ * [#8] add Android::Manifest#label
12
+ * [#7] fix wrong boolean value in manifest parser
13
+ * [#6] add accessor Android::Manifest#doc
14
+
15
+ ## 0.5.0
16
+ * [issue #1] implement Android::Resource#find, #res_readable_id, #res_hex_id methods
17
+
18
+ ## 0.4.2
19
+ * fix bugs(#2, #3)
20
+ * divide change log from readme
21
+
22
+ ## 0.4.1
23
+ * fix typo
24
+ * add document
25
+
26
+ ## 0.4.0
27
+ * add resource parser
28
+ * enhance dex parser
29
+
30
+ ## 0.3.0
31
+ * add and change name space
32
+ * add Android::Utils module and some util methods
33
+ * add Apk#entry, Apk#each_entry, and Apk#time methods,
34
+
35
+ ## 0.2.0
36
+ * update documents
37
+ * add Apk::Dex#each_strings, Apk::Dex#each_class_names
38
+
39
+ ## 0.1.2
40
+ * fix bug(improve android binary xml parser)
41
+
42
+ ## 0.1.1
43
+ * fix bug(failed to initialize Apk::Manifest::Meta class)
44
+ * replace iconv to String#encode(for ruby1.9)
45
+
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+ gem "rubyzip", ">=1.0.0"
6
+
7
+ # Add dependencies to develop your gem here.
8
+ # Include everything needed to run rake, tests, features, etc.
9
+ group :development do
10
+ gem "rspec-its", ">= 1.2.0"
11
+ gem "rspec-collection_matchers", ">= 1.1.0"
12
+ gem "rspec-mocks", ">= 3.6.0"
13
+ gem "bundler", ">= 1.1.5"
14
+ gem "jeweler"
15
+ gem "yard", require: false
16
+ gem "redcarpet"
17
+ gem "simplecov", require: false
18
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,92 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ addressable (2.4.0)
5
+ builder (3.2.3)
6
+ descendants_tracker (0.0.4)
7
+ thread_safe (~> 0.3, >= 0.3.1)
8
+ diff-lcs (1.3)
9
+ docile (1.1.5)
10
+ faraday (0.9.2)
11
+ multipart-post (>= 1.2, < 3)
12
+ git (1.3.0)
13
+ github_api (0.16.0)
14
+ addressable (~> 2.4.0)
15
+ descendants_tracker (~> 0.0.4)
16
+ faraday (~> 0.8, < 0.10)
17
+ hashie (>= 3.4)
18
+ mime-types (>= 1.16, < 3.0)
19
+ oauth2 (~> 1.0)
20
+ hashie (3.5.7)
21
+ highline (1.7.10)
22
+ jeweler (2.3.9)
23
+ builder
24
+ bundler
25
+ git (>= 1.2.5)
26
+ github_api (~> 0.16.0)
27
+ highline (>= 1.6.15)
28
+ nokogiri (>= 1.5.10)
29
+ psych
30
+ rake
31
+ rdoc
32
+ semver2
33
+ json (2.1.0)
34
+ jwt (1.5.6)
35
+ mime-types (2.99.3)
36
+ mini_portile2 (2.3.0)
37
+ multi_json (1.13.1)
38
+ multi_xml (0.6.0)
39
+ multipart-post (2.0.0)
40
+ nokogiri (1.8.2)
41
+ mini_portile2 (~> 2.3.0)
42
+ oauth2 (1.4.0)
43
+ faraday (>= 0.8, < 0.13)
44
+ jwt (~> 1.0)
45
+ multi_json (~> 1.3)
46
+ multi_xml (~> 0.5)
47
+ rack (>= 1.2, < 3)
48
+ psych (3.0.2)
49
+ rack (2.0.4)
50
+ rake (12.3.0)
51
+ rdoc (6.0.1)
52
+ redcarpet (3.4.0)
53
+ rspec-collection_matchers (1.1.3)
54
+ rspec-expectations (>= 2.99.0.beta1)
55
+ rspec-core (3.6.0)
56
+ rspec-support (~> 3.6.0)
57
+ rspec-expectations (3.6.0)
58
+ diff-lcs (>= 1.2.0, < 2.0)
59
+ rspec-support (~> 3.6.0)
60
+ rspec-its (1.2.0)
61
+ rspec-core (>= 3.0.0)
62
+ rspec-expectations (>= 3.0.0)
63
+ rspec-mocks (3.6.0)
64
+ diff-lcs (>= 1.2.0, < 2.0)
65
+ rspec-support (~> 3.6.0)
66
+ rspec-support (3.6.0)
67
+ rubyzip (1.2.1)
68
+ semver2 (3.4.2)
69
+ simplecov (0.15.1)
70
+ docile (~> 1.1.0)
71
+ json (>= 1.8, < 3)
72
+ simplecov-html (~> 0.10.0)
73
+ simplecov-html (0.10.2)
74
+ thread_safe (0.3.6)
75
+ yard (0.9.12)
76
+
77
+ PLATFORMS
78
+ ruby
79
+
80
+ DEPENDENCIES
81
+ bundler (>= 1.1.5)
82
+ jeweler
83
+ redcarpet
84
+ rspec-collection_matchers (>= 1.1.0)
85
+ rspec-its (>= 1.2.0)
86
+ rspec-mocks (>= 3.6.0)
87
+ rubyzip (>= 1.0.0)
88
+ simplecov
89
+ yard
90
+
91
+ BUNDLED WITH
92
+ 1.15.4
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2012 Securebrain
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,158 @@
1
+ # ruby_apk
2
+ Android Apk static analysis library for Ruby.
3
+
4
+ [![Gem Version](https://badge.fury.io/rb/ruby_apk.png)](http://badge.fury.io/rb/ruby_apk)
5
+ [![Build Status](https://travis-ci.org/playtestcloud/ruby_apk.svg?branch=master)](https://travis-ci.org/playtestcloud/ruby_apk)
6
+ [![Dependency Status](https://gemnasium.com/badges/github.com/playtestcloud/ruby_apk.png)](https://gemnasium.com/github.com/playtestcloud/ruby_apk)
7
+
8
+ ## Requirements
9
+ - ruby(>=2.2.2)
10
+
11
+ ## Install
12
+ $ gem install ruby_apk
13
+
14
+ ## Usage
15
+ ### Initialize
16
+ ```ruby
17
+ require 'ruby_apk'
18
+ apk = Android::Apk.new('sample.apk') # set apk file path
19
+ ```
20
+
21
+ ### Apk
22
+ #### Listing files in Apk
23
+ ```ruby
24
+ # listing files in apk
25
+ apk = Android::Apk.new('sample.apk')
26
+ apk.each_file do |name, data|
27
+ puts "#{name}: #{data.size}bytes" # puts file name and data size
28
+ end
29
+ ```
30
+
31
+ #### Find files in Apk
32
+ ```ruby
33
+ apk = Android::Apk.new('sample.apk')
34
+ elf_files = apk.find{|name, data| data[0..3] == [0x7f, 0x45, 0x4c, 0x46] } # ELF magic number
35
+ ```
36
+
37
+ #### Extract icon data in Apk (since 0.6.0)
38
+ ```ruby
39
+ apk = Android::Apk.new('sample.apk')
40
+ icons = apk.icon # { "res/drawable-hdpi/ic_launcher.png" => "\x89PNG\x0D\x0A...", ... }
41
+ icons.each do |name, data|
42
+ File.open(File.basename(name), 'wb') {|f| f.write data } # save to file.
43
+ end
44
+ ```
45
+
46
+ #### Extract signature and certificate information from Apk (since v0.7.0)
47
+ ```ruby
48
+ apk = Android::Apk.new('sample.apk')
49
+ signs = apk.signs # retrun Hash(key: signature file path, value: OpenSSL::PKCS7)
50
+ signs.each do |path, sign|
51
+ puts path # => "MATA-INF/CERT.RSA" or ...
52
+ puts sign # => "-----BEGIN PKCS7-----\n..." PKCS7 object
53
+ end
54
+
55
+ certs = apk.certificates # retrun Hash(key: signature file path, value: OpenSSL::X509::Certificate)
56
+ certs.each do |path, cert|
57
+ puts path # => "MATA-INF/CERT.RSA" or ...
58
+ puts cert # => "-----BEGIN CERTIFICATE-----\n..." # X509::Certificate object
59
+ end
60
+ ```
61
+ Note: Most apks have only one signature and cerficate.
62
+
63
+ ### Manifest
64
+ #### Get readable xml
65
+ ```ruby
66
+ apk = Android::Apk.new('sample.apk')
67
+ manifest = apk.manifest
68
+ puts manifest.to_xml
69
+ ```
70
+
71
+ #### Listing components and permissions
72
+ ```ruby
73
+ apk = Android::Apk.new('sample.apk')
74
+ manifest = apk.manifest
75
+ # listing components
76
+ manifest.components.each do |c| # 'c' is Android::Manifest::Component object
77
+ puts "#{c.type}: #{c.name}"
78
+ c.intent_filters.each do |filter|
79
+ puts "\t#{filter.type}"
80
+ end
81
+ end
82
+
83
+ # listing use-permission tag
84
+ manifest.use_permissions.each do |permission|
85
+ puts permission
86
+ end
87
+ ```
88
+
89
+ #### Extract application label string
90
+ ```ruby
91
+ apk = Android::Apk.new('sample.apk')
92
+ puts apk.manifest.label
93
+ ```
94
+
95
+ ### Resource
96
+ #### Extract resource strings from apk
97
+ ```ruby
98
+ apk = Android::Apk.new('sample.apk')
99
+ rsc = apk.resource
100
+ rsc.strings.each do |str|
101
+ puts str
102
+ end
103
+ ```
104
+
105
+ #### Parse resource file directly
106
+ ```ruby
107
+ rsc_data = File.open('resources.arsc', 'rb').read{|f| f.read }
108
+ rsc = Android::Resource.new(rsc_data)
109
+ ```
110
+
111
+ ### Resolve resource id
112
+ This feature supports only srting resources for now.
113
+
114
+ ```ruby
115
+ apk = Android::Apk.new('sample.apk')
116
+ rsc = apk.resource
117
+
118
+ # assigns readable resource id
119
+ puts rsc.find('@string/app_name') # => 'application name'
120
+
121
+ # assigns hex resource id
122
+ puts rsc.find('@0x7f040000') # => 'application name'
123
+
124
+ # you can set lang attribute.
125
+ puts rsc.find('@0x7f040000', :lang => 'ja')
126
+ ```
127
+
128
+
129
+ ### Dex
130
+ #### Extract dex information
131
+ ```ruby
132
+ apk = Android::Apk.new('sample.apk')
133
+ dex = apk.dex
134
+ # listing string table in dex
135
+ dex.strings.each do |str|
136
+ puts str
137
+ end
138
+
139
+ # listing all class names
140
+ dex.classes.each do |cls| # cls is Android::Dex::ClassInfo
141
+ puts "class: #{cls.name}"
142
+ cls.virtual_methods.each do |m| # Android::Dex::MethodInfo
143
+ puts "\t#{m.definition}" # puts method definition
144
+ end
145
+ end
146
+ ```
147
+
148
+ #### Parse dex file directly
149
+ ```ruby
150
+ dex_data = File.open('classes.dex','rb').read{|f| f.read }
151
+ dex = Android::Dex.new(dex_data)
152
+ ```
153
+
154
+
155
+ ## Copyright
156
+
157
+ Copyright (c) 2012 SecureBrain. See LICENSE.txt for further details.
158
+
data/Rakefile ADDED
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+ require 'bundler/gem_tasks'
14
+
15
+ # require 'jeweler'
16
+ # Jeweler::Tasks.new do |gem|
17
+ # # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
18
+ # gem.name = "android_parser"
19
+ # gem.homepage = "https://github.com/icyleaf/ruby_apk"
20
+ # gem.license = "MIT"
21
+ # gem.summary = %Q{static analysis tool for android apk}
22
+ # gem.description = %Q{static analysis tool for android apk}
23
+ # gem.email = "info@securebrain.co.jp"
24
+ # gem.authors = ["SecureBrain"]
25
+ # # dependencies defined in Gemfile
26
+ # end
27
+ # Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rspec/core'
30
+ require 'rspec/core/rake_task'
31
+ RSpec::Core::RakeTask.new(:spec) do |spec|
32
+ spec.pattern = FileList['spec/**/*_spec.rb']
33
+ end
34
+
35
+
36
+ task :default => :spec
37
+
38
+ # require 'yard'
39
+ # require 'yard/rake/yardoc_task'
40
+ # YARD::Rake::YardocTask.new do |t|
41
+ # t.files = ['lib/**/*.rb']
42
+ # t.options = []
43
+ # t.options << '--debug' << '--verbose' if $trace
44
+ # end