ruby_apk 0.4.1 → 0.4.2
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.
- data/CHANGELOG.md +29 -0
- data/README.md +68 -77
- data/VERSION +1 -1
- data/lib/android/dex/dex_object.rb +1 -1
- data/lib/android/manifest.rb +1 -0
- data/ruby_apk.gemspec +3 -2
- data/spec/manifest_spec.rb +17 -0
- metadata +4 -3
data/CHANGELOG.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# ChangeLog
|
2
|
+
## 0.4.2
|
3
|
+
* fix bugs(#2, #3)
|
4
|
+
* divide change log from readme
|
5
|
+
|
6
|
+
## 0.4.1
|
7
|
+
* fix typo
|
8
|
+
* add document
|
9
|
+
|
10
|
+
## 0.4.0
|
11
|
+
* add resource parser
|
12
|
+
* enhance dex parser
|
13
|
+
|
14
|
+
## 0.3.0
|
15
|
+
* add and change name space
|
16
|
+
* add Android::Utils module and some util methods
|
17
|
+
* add Apk#entry, Apk#each_entry, and Apk#time methods,
|
18
|
+
|
19
|
+
## 0.2.0
|
20
|
+
* update documents
|
21
|
+
* add Apk::Dex#each_strings, Apk::Dex#each_class_names
|
22
|
+
|
23
|
+
## 0.1.2
|
24
|
+
* fix bug(improve android binary xml parser)
|
25
|
+
|
26
|
+
## 0.1.1
|
27
|
+
* fix bug(failed to initialize Apk::Manifest::Meta class)
|
28
|
+
* replace iconv to String#encode(for ruby1.9)
|
29
|
+
|
data/README.md
CHANGED
@@ -3,108 +3,99 @@ Android Apk static analysis library for Ruby.
|
|
3
3
|
|
4
4
|
## Requirements
|
5
5
|
- ruby(>=1.9.x)
|
6
|
-
- rubyzip gem(>=0.9.9)
|
7
6
|
|
8
7
|
## Install
|
9
|
-
|
8
|
+
$ gem install ruby_apk
|
10
9
|
|
11
10
|
## Usage
|
12
11
|
### Initialize
|
13
|
-
|
14
|
-
|
12
|
+
```ruby
|
13
|
+
require 'ruby_apk'
|
14
|
+
apk = Android::Apk.new('sample.apk') # set apk file path
|
15
|
+
```
|
15
16
|
|
16
17
|
### Apk
|
17
18
|
#### Listing files in Apk
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
```ruby
|
20
|
+
# listing files in apk
|
21
|
+
apk = Android::Apk.new('sample.apk')
|
22
|
+
apk.each_file do |name, data|
|
23
|
+
puts "#{name}: #{data.size}bytes" # puts file name and data size
|
24
|
+
end
|
25
|
+
```
|
23
26
|
|
24
27
|
#### Find files in Apk
|
25
|
-
|
26
|
-
|
28
|
+
```ruby
|
29
|
+
apk = Android::Apk.new('sample.apk')
|
30
|
+
elf_files = apk.find{|name, data| data[0..3] == [0x7f, 0x45, 0x4c, 0x46] } # ELF magic number
|
31
|
+
```
|
27
32
|
|
28
33
|
### Manifest
|
29
34
|
#### Get readable xml
|
30
|
-
|
31
|
-
|
32
|
-
|
35
|
+
```ruby
|
36
|
+
apk = Android::Apk.new('sample.apk')
|
37
|
+
manifest = apk.manifest
|
38
|
+
puts manifest.to_xml
|
39
|
+
```
|
33
40
|
|
34
41
|
#### Listing components and permissions
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
42
|
+
```ruby
|
43
|
+
apk = Android::Apk.new('sample.apk')
|
44
|
+
manifest = apk.manifest
|
45
|
+
# listing components
|
46
|
+
manifest.components.each do |c| # 'c' is Android::Manifest::Component object
|
47
|
+
puts "#{c.type}: #{c.name}"
|
48
|
+
c.intent_filters.each do |filter|
|
49
|
+
puts "\t#{filter.type}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# listing use-permission tag
|
54
|
+
manifest.use_permissions.each do |permission|
|
55
|
+
puts permission
|
56
|
+
end
|
57
|
+
```
|
49
58
|
|
50
59
|
### Resource
|
51
60
|
#### Extract resource strings from apk
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
61
|
+
```ruby
|
62
|
+
apk = Android::Apk.new('sample.apk')
|
63
|
+
rsc = apk.resource
|
64
|
+
rsc.strings.each do |str|
|
65
|
+
puts str
|
66
|
+
end
|
67
|
+
```
|
57
68
|
|
58
69
|
#### Parse resource file directly
|
59
|
-
|
60
|
-
|
70
|
+
```ruby
|
71
|
+
rsc_data = File.open('resources.arsc', 'rb').read{|f| f.read }
|
72
|
+
rsc = Android::Resource.new(rsc_data)
|
73
|
+
```
|
61
74
|
|
62
75
|
### Dex
|
63
76
|
#### Extract dex information
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
77
|
+
```ruby
|
78
|
+
apk = Android::Apk.new('sample.apk')
|
79
|
+
dex = apk.dex
|
80
|
+
# listing string table in dex
|
81
|
+
dex.strings do |str|
|
82
|
+
puts str
|
83
|
+
end
|
84
|
+
|
85
|
+
# listing all class names
|
86
|
+
dex.classes do |cls| # cls is Android::Dex::ClassInfo
|
87
|
+
puts "class: #{cls.name}"
|
88
|
+
cls.virtual_methods.each do |m| # Android::Dex::MethodInfo
|
89
|
+
puts "\t#{m.definition}" # puts method definition
|
90
|
+
end
|
91
|
+
end
|
92
|
+
```
|
78
93
|
|
79
94
|
#### Parse dex file directly
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
## ChangeLog
|
85
|
-
### 0.4.1
|
86
|
-
* fix typo
|
87
|
-
* add document
|
88
|
-
|
89
|
-
### 0.4.0
|
90
|
-
* add resource parser
|
91
|
-
* enhance dex parser
|
92
|
-
|
93
|
-
### 0.3.0
|
94
|
-
* add and change name space
|
95
|
-
* add Android::Utils module and some util methods
|
96
|
-
* add Apk#entry, Apk#each_entry, and Apk#time methods,
|
97
|
-
|
98
|
-
### 0.2.0
|
99
|
-
* update documents
|
100
|
-
* add Apk::Dex#each_strings, Apk::Dex#each_class_names
|
101
|
-
|
102
|
-
### 0.1.2
|
103
|
-
* fix bug(improve android binary xml parser)
|
104
|
-
|
105
|
-
### 0.1.1
|
106
|
-
* fix bug(failed to initialize Apk::Manifest::Meta class)
|
107
|
-
* replace iconv to String#encode(for ruby1.9)
|
95
|
+
```ruby
|
96
|
+
dex_data = File.open('classes.dex','rb').read{|f| f.read }
|
97
|
+
dex = Android::Dex.new(dex_data)
|
98
|
+
```
|
108
99
|
|
109
100
|
|
110
101
|
## Copyright
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.2
|
@@ -405,7 +405,7 @@ module Android
|
|
405
405
|
def parse
|
406
406
|
@params[:size] = read_sleb
|
407
407
|
@params[:list] = read_class_array(EncodedTypeAddrPair, @params[:size].abs)
|
408
|
-
@params[:catch_all_addr] = read_uleb if @params[:size]
|
408
|
+
@params[:catch_all_addr] = read_uleb if @params[:size] <= 0
|
409
409
|
end
|
410
410
|
end
|
411
411
|
|
data/lib/android/manifest.rb
CHANGED
data/ruby_apk.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "ruby_apk"
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["SecureBrain"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-12-19"
|
13
13
|
s.description = "static analysis tool for android apk"
|
14
14
|
s.email = "info@securebrain.co.jp"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".rspec",
|
21
|
+
"CHANGELOG.md",
|
21
22
|
"Gemfile",
|
22
23
|
"Gemfile.lock",
|
23
24
|
"LICENSE.txt",
|
data/spec/manifest_spec.rb
CHANGED
@@ -122,6 +122,23 @@ describe Android::Manifest do
|
|
122
122
|
context "with no components" do
|
123
123
|
it { should be_empty }
|
124
124
|
end
|
125
|
+
context 'with text element in intent-filter element. (issue #3)' do
|
126
|
+
before do
|
127
|
+
app = REXML::Element.new('application')
|
128
|
+
activity = REXML::Element.new('activity')
|
129
|
+
intent_filter = REXML::Element.new('intent-filter')
|
130
|
+
text = REXML::Text.new('sample')
|
131
|
+
|
132
|
+
intent_filter << text
|
133
|
+
activity << intent_filter
|
134
|
+
app << activity
|
135
|
+
dummy_xml.root << app
|
136
|
+
end
|
137
|
+
it "should have components" do
|
138
|
+
subject.should have(1).items
|
139
|
+
end
|
140
|
+
it { expect { subject }.to_not raise_error }
|
141
|
+
end
|
125
142
|
end
|
126
143
|
end
|
127
144
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_apk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rubyzip
|
@@ -132,6 +132,7 @@ extra_rdoc_files:
|
|
132
132
|
- README.md
|
133
133
|
files:
|
134
134
|
- .rspec
|
135
|
+
- CHANGELOG.md
|
135
136
|
- Gemfile
|
136
137
|
- Gemfile.lock
|
137
138
|
- LICENSE.txt
|
@@ -182,7 +183,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
182
183
|
version: '0'
|
183
184
|
segments:
|
184
185
|
- 0
|
185
|
-
hash:
|
186
|
+
hash: -1781742787123284542
|
186
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
188
|
none: false
|
188
189
|
requirements:
|