ruby_apk 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|