origami 1.2.7 → 2.0.0

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.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.md +112 -0
  4. data/bin/config/pdfcop.conf.yml +232 -233
  5. data/bin/gui/about.rb +27 -37
  6. data/bin/gui/config.rb +108 -117
  7. data/bin/gui/file.rb +416 -365
  8. data/bin/gui/gtkhex.rb +1138 -1153
  9. data/bin/gui/hexview.rb +55 -57
  10. data/bin/gui/imgview.rb +48 -51
  11. data/bin/gui/menu.rb +388 -386
  12. data/bin/gui/properties.rb +114 -130
  13. data/bin/gui/signing.rb +571 -617
  14. data/bin/gui/textview.rb +77 -95
  15. data/bin/gui/treeview.rb +382 -387
  16. data/bin/gui/walker.rb +227 -232
  17. data/bin/gui/xrefs.rb +56 -60
  18. data/bin/pdf2pdfa +53 -57
  19. data/bin/pdf2ruby +212 -228
  20. data/bin/pdfcop +338 -348
  21. data/bin/pdfdecompress +58 -65
  22. data/bin/pdfdecrypt +56 -60
  23. data/bin/pdfencrypt +75 -80
  24. data/bin/pdfexplode +185 -182
  25. data/bin/pdfextract +201 -218
  26. data/bin/pdfmetadata +83 -82
  27. data/bin/pdfsh +4 -5
  28. data/bin/pdfwalker +1 -2
  29. data/bin/shell/.irbrc +45 -82
  30. data/bin/shell/console.rb +105 -130
  31. data/bin/shell/hexdump.rb +40 -64
  32. data/examples/README.md +34 -0
  33. data/examples/attachments/attachment.rb +38 -0
  34. data/examples/attachments/nested_document.rb +51 -0
  35. data/examples/encryption/encryption.rb +28 -0
  36. data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
  37. data/examples/flash/flash.rb +37 -0
  38. data/{samples → examples}/flash/helloworld.swf +0 -0
  39. data/examples/forms/javascript.rb +54 -0
  40. data/examples/forms/xfa.rb +115 -0
  41. data/examples/javascript/hello_world.rb +22 -0
  42. data/examples/javascript/js_emulation.rb +54 -0
  43. data/examples/loop/goto.rb +32 -0
  44. data/examples/loop/named.rb +33 -0
  45. data/examples/signature/signature.rb +65 -0
  46. data/examples/uri/javascript.rb +56 -0
  47. data/examples/uri/open-uri.rb +21 -0
  48. data/examples/uri/submitform.rb +47 -0
  49. data/lib/origami.rb +29 -42
  50. data/lib/origami/3d.rb +350 -225
  51. data/lib/origami/acroform.rb +262 -288
  52. data/lib/origami/actions.rb +268 -288
  53. data/lib/origami/annotations.rb +697 -722
  54. data/lib/origami/array.rb +258 -184
  55. data/lib/origami/boolean.rb +74 -84
  56. data/lib/origami/catalog.rb +397 -434
  57. data/lib/origami/collections.rb +144 -0
  58. data/lib/origami/destinations.rb +233 -194
  59. data/lib/origami/dictionary.rb +253 -232
  60. data/lib/origami/encryption.rb +1274 -1243
  61. data/lib/origami/export.rb +232 -268
  62. data/lib/origami/extensions/fdf.rb +307 -220
  63. data/lib/origami/extensions/ppklite.rb +368 -435
  64. data/lib/origami/filespec.rb +197 -0
  65. data/lib/origami/filters.rb +301 -295
  66. data/lib/origami/filters/ascii.rb +177 -180
  67. data/lib/origami/filters/ccitt.rb +528 -535
  68. data/lib/origami/filters/crypt.rb +26 -35
  69. data/lib/origami/filters/dct.rb +46 -52
  70. data/lib/origami/filters/flate.rb +95 -94
  71. data/lib/origami/filters/jbig2.rb +49 -55
  72. data/lib/origami/filters/jpx.rb +38 -44
  73. data/lib/origami/filters/lzw.rb +189 -183
  74. data/lib/origami/filters/predictors.rb +221 -235
  75. data/lib/origami/filters/runlength.rb +103 -104
  76. data/lib/origami/font.rb +173 -186
  77. data/lib/origami/functions.rb +67 -81
  78. data/lib/origami/graphics.rb +25 -21
  79. data/lib/origami/graphics/colors.rb +178 -187
  80. data/lib/origami/graphics/instruction.rb +79 -85
  81. data/lib/origami/graphics/path.rb +142 -148
  82. data/lib/origami/graphics/patterns.rb +160 -167
  83. data/lib/origami/graphics/render.rb +43 -50
  84. data/lib/origami/graphics/state.rb +138 -153
  85. data/lib/origami/graphics/text.rb +188 -205
  86. data/lib/origami/graphics/xobject.rb +819 -815
  87. data/lib/origami/header.rb +63 -78
  88. data/lib/origami/javascript.rb +596 -597
  89. data/lib/origami/linearization.rb +285 -290
  90. data/lib/origami/metadata.rb +139 -148
  91. data/lib/origami/name.rb +112 -148
  92. data/lib/origami/null.rb +53 -62
  93. data/lib/origami/numeric.rb +162 -175
  94. data/lib/origami/obfuscation.rb +186 -174
  95. data/lib/origami/object.rb +593 -573
  96. data/lib/origami/outline.rb +42 -47
  97. data/lib/origami/outputintents.rb +73 -82
  98. data/lib/origami/page.rb +703 -592
  99. data/lib/origami/parser.rb +238 -290
  100. data/lib/origami/parsers/fdf.rb +41 -33
  101. data/lib/origami/parsers/pdf.rb +75 -95
  102. data/lib/origami/parsers/pdf/lazy.rb +137 -0
  103. data/lib/origami/parsers/pdf/linear.rb +64 -66
  104. data/lib/origami/parsers/ppklite.rb +34 -70
  105. data/lib/origami/pdf.rb +1030 -1005
  106. data/lib/origami/reference.rb +102 -102
  107. data/lib/origami/signature.rb +591 -609
  108. data/lib/origami/stream.rb +668 -551
  109. data/lib/origami/string.rb +397 -373
  110. data/lib/origami/template/patterns.rb +56 -0
  111. data/lib/origami/template/widgets.rb +151 -0
  112. data/lib/origami/trailer.rb +144 -158
  113. data/lib/origami/tree.rb +62 -0
  114. data/lib/origami/version.rb +23 -0
  115. data/lib/origami/webcapture.rb +88 -79
  116. data/lib/origami/xfa.rb +2863 -2882
  117. data/lib/origami/xreftable.rb +472 -384
  118. data/test/dataset/calc.pdf +85 -0
  119. data/test/dataset/crypto.pdf +82 -0
  120. data/test/dataset/empty.pdf +49 -0
  121. data/test/test_actions.rb +27 -0
  122. data/test/test_annotations.rb +90 -0
  123. data/test/test_pages.rb +31 -0
  124. data/test/test_pdf.rb +16 -0
  125. data/test/test_pdf_attachment.rb +34 -0
  126. data/test/test_pdf_create.rb +24 -0
  127. data/test/test_pdf_encrypt.rb +95 -0
  128. data/test/test_pdf_parse.rb +96 -0
  129. data/test/test_pdf_sign.rb +58 -0
  130. data/test/test_streams.rb +182 -0
  131. data/test/test_xrefs.rb +67 -0
  132. metadata +88 -58
  133. data/README +0 -67
  134. data/bin/pdf2graph +0 -121
  135. data/bin/pdfcocoon +0 -104
  136. data/lib/origami/file.rb +0 -233
  137. data/samples/README.txt +0 -45
  138. data/samples/actions/launch/calc.rb +0 -87
  139. data/samples/actions/launch/winparams.rb +0 -22
  140. data/samples/actions/loop/loopgoto.rb +0 -24
  141. data/samples/actions/loop/loopnamed.rb +0 -21
  142. data/samples/actions/named/named.rb +0 -31
  143. data/samples/actions/samba/smbrelay.rb +0 -26
  144. data/samples/actions/webbug/submitform.js +0 -26
  145. data/samples/actions/webbug/webbug-browser.rb +0 -68
  146. data/samples/actions/webbug/webbug-js.rb +0 -67
  147. data/samples/actions/webbug/webbug-reader.rb +0 -90
  148. data/samples/attachments/attach.rb +0 -40
  149. data/samples/attachments/attached.txt +0 -1
  150. data/samples/crypto/crypto.rb +0 -28
  151. data/samples/digsig/signed.rb +0 -46
  152. data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
  153. data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
  154. data/samples/exploits/exploit_customdictopen.rb +0 -55
  155. data/samples/exploits/getannots.rb +0 -69
  156. data/samples/flash/flash.rb +0 -31
  157. data/samples/javascript/attached.txt +0 -1
  158. data/samples/javascript/js.rb +0 -52
  159. data/templates/patterns.rb +0 -66
  160. data/templates/widgets.rb +0 -173
  161. data/templates/xdp.rb +0 -92
  162. data/test/ts_pdf.rb +0 -50
metadata CHANGED
@@ -1,39 +1,63 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origami
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.7
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - Guillaume Delugre
7
+ - Guillaume Delugré
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-14 00:00:00.000000000 Z
12
- dependencies: []
13
- description: "Origami is a PDF-compliant parser. This is not a PDF rendering library,
14
- it aims at providing a scripting tool to generate and analyze malicious PDF files.
15
- \nAs well, it can be used to create on-the-fly customized PDFs, or to inject (evil)
16
- code into already existing documents.\n"
17
- email: guillaume at security-labs dot org
11
+ date: 2016-08-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.0'
41
+ description: Origami is a pure Ruby library to parse, modify and generate PDF documents.
42
+ email: gdelugre@security-labs.org
18
43
  executables:
19
- - pdfdecompress
20
- - pdfdecrypt
21
- - pdfencrypt
22
- - pdfmetadata
23
- - pdf2graph
24
- - pdf2ruby
25
- - pdfextract
26
- - pdfcop
27
- - pdfcocoon
28
44
  - pdfsh
29
45
  - pdfwalker
30
46
  - pdf2pdfa
47
+ - pdf2ruby
48
+ - pdfcop
49
+ - pdfmetadata
50
+ - pdfdecompress
51
+ - pdfdecrypt
52
+ - pdfencrypt
31
53
  - pdfexplode
54
+ - pdfextract
32
55
  extensions: []
33
56
  extra_rdoc_files: []
34
57
  files:
58
+ - CHANGELOG.md
35
59
  - COPYING.LESSER
36
- - README
60
+ - README.md
37
61
  - bin/config/pdfcop.conf.yml
38
62
  - bin/gui/COPYING
39
63
  - bin/gui/about.rb
@@ -49,10 +73,8 @@ files:
49
73
  - bin/gui/treeview.rb
50
74
  - bin/gui/walker.rb
51
75
  - bin/gui/xrefs.rb
52
- - bin/pdf2graph
53
76
  - bin/pdf2pdfa
54
77
  - bin/pdf2ruby
55
- - bin/pdfcocoon
56
78
  - bin/pdfcop
57
79
  - bin/pdfdecompress
58
80
  - bin/pdfdecrypt
@@ -65,6 +87,23 @@ files:
65
87
  - bin/shell/.irbrc
66
88
  - bin/shell/console.rb
67
89
  - bin/shell/hexdump.rb
90
+ - examples/README.md
91
+ - examples/attachments/attachment.rb
92
+ - examples/attachments/nested_document.rb
93
+ - examples/encryption/encryption.rb
94
+ - examples/events/events.rb
95
+ - examples/flash/flash.rb
96
+ - examples/flash/helloworld.swf
97
+ - examples/forms/javascript.rb
98
+ - examples/forms/xfa.rb
99
+ - examples/javascript/hello_world.rb
100
+ - examples/javascript/js_emulation.rb
101
+ - examples/loop/goto.rb
102
+ - examples/loop/named.rb
103
+ - examples/signature/signature.rb
104
+ - examples/uri/javascript.rb
105
+ - examples/uri/open-uri.rb
106
+ - examples/uri/submitform.rb
68
107
  - lib/origami.rb
69
108
  - lib/origami/3d.rb
70
109
  - lib/origami/acroform.rb
@@ -73,13 +112,14 @@ files:
73
112
  - lib/origami/array.rb
74
113
  - lib/origami/boolean.rb
75
114
  - lib/origami/catalog.rb
115
+ - lib/origami/collections.rb
76
116
  - lib/origami/destinations.rb
77
117
  - lib/origami/dictionary.rb
78
118
  - lib/origami/encryption.rb
79
119
  - lib/origami/export.rb
80
120
  - lib/origami/extensions/fdf.rb
81
121
  - lib/origami/extensions/ppklite.rb
82
- - lib/origami/file.rb
122
+ - lib/origami/filespec.rb
83
123
  - lib/origami/filters.rb
84
124
  - lib/origami/filters/ascii.rb
85
125
  - lib/origami/filters/ccitt.rb
@@ -117,6 +157,7 @@ files:
117
157
  - lib/origami/parser.rb
118
158
  - lib/origami/parsers/fdf.rb
119
159
  - lib/origami/parsers/pdf.rb
160
+ - lib/origami/parsers/pdf/lazy.rb
120
161
  - lib/origami/parsers/pdf/linear.rb
121
162
  - lib/origami/parsers/ppklite.rb
122
163
  - lib/origami/pdf.rb
@@ -124,41 +165,31 @@ files:
124
165
  - lib/origami/signature.rb
125
166
  - lib/origami/stream.rb
126
167
  - lib/origami/string.rb
168
+ - lib/origami/template/patterns.rb
169
+ - lib/origami/template/widgets.rb
127
170
  - lib/origami/trailer.rb
171
+ - lib/origami/tree.rb
172
+ - lib/origami/version.rb
128
173
  - lib/origami/webcapture.rb
129
174
  - lib/origami/xfa.rb
130
175
  - lib/origami/xreftable.rb
131
- - samples/README.txt
132
- - samples/actions/launch/calc.rb
133
- - samples/actions/launch/winparams.rb
134
- - samples/actions/loop/loopgoto.rb
135
- - samples/actions/loop/loopnamed.rb
136
- - samples/actions/named/named.rb
137
- - samples/actions/samba/smbrelay.rb
138
- - samples/actions/triggerevents/trigger.rb
139
- - samples/actions/webbug/submitform.js
140
- - samples/actions/webbug/webbug-browser.rb
141
- - samples/actions/webbug/webbug-js.rb
142
- - samples/actions/webbug/webbug-reader.rb
143
- - samples/attachments/attach.rb
144
- - samples/attachments/attached.txt
145
- - samples/crypto/crypto.rb
146
- - samples/digsig/signed.rb
147
- - samples/exploits/cve-2008-2992-utilprintf.rb
148
- - samples/exploits/cve-2009-0927-geticon.rb
149
- - samples/exploits/exploit_customdictopen.rb
150
- - samples/exploits/getannots.rb
151
- - samples/flash/flash.rb
152
- - samples/flash/helloworld.swf
153
- - samples/javascript/attached.txt
154
- - samples/javascript/js.rb
155
- - templates/patterns.rb
156
- - templates/widgets.rb
157
- - templates/xdp.rb
158
- - test/ts_pdf.rb
159
- homepage: http://code.google.com/p/origami-pdf
176
+ - test/dataset/calc.pdf
177
+ - test/dataset/crypto.pdf
178
+ - test/dataset/empty.pdf
179
+ - test/test_actions.rb
180
+ - test/test_annotations.rb
181
+ - test/test_pages.rb
182
+ - test/test_pdf.rb
183
+ - test/test_pdf_attachment.rb
184
+ - test/test_pdf_create.rb
185
+ - test/test_pdf_encrypt.rb
186
+ - test/test_pdf_parse.rb
187
+ - test/test_pdf_sign.rb
188
+ - test/test_streams.rb
189
+ - test/test_xrefs.rb
190
+ homepage: http://github.com/gdelugre/origami
160
191
  licenses:
161
- - LGPL-3
192
+ - LGPL-3.0+
162
193
  metadata: {}
163
194
  post_install_message:
164
195
  rdoc_options: []
@@ -168,19 +199,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
168
199
  requirements:
169
200
  - - ">="
170
201
  - !ruby/object:Gem::Version
171
- version: '0'
202
+ version: '2.1'
172
203
  required_rubygems_version: !ruby/object:Gem::Requirement
173
204
  requirements:
174
205
  - - ">="
175
206
  - !ruby/object:Gem::Version
176
207
  version: '0'
177
208
  requirements:
178
- - ruby-gtk2 if you plan to run the PDF Walker interface
209
+ - gtk2 to run the graphical interface
179
210
  rubyforge_project:
180
- rubygems_version: 2.2.2
211
+ rubygems_version: 2.5.1
181
212
  signing_key:
182
213
  specification_version: 4
183
- summary: Origami aims at providing a scripting tool to generate and analyze malicious
184
- PDF files.
214
+ summary: Ruby framework to manipulate PDF documents
185
215
  test_files:
186
- - test/ts_pdf.rb
216
+ - test/test_pdf.rb
data/README DELETED
@@ -1,67 +0,0 @@
1
- NAME
2
-
3
- origami
4
-
5
- DESCRIPTION
6
-
7
- Origami is a framework written in Ruby designed to parse, analyze, and forge
8
- PDF documents. This is not a PDF rendering library, it aims at providing a
9
- scripting tool for generating and analyzing malicious PDF files. As well, it
10
- can be used to create on-the-fly customized PDFs, or to inject evil code into
11
- already existing documents.
12
-
13
- VERSION
14
-
15
- 1.2
16
-
17
- OPTIONAL DEPENDENCIES
18
-
19
- - Ruby-GTK2 (only for GUI), http://ruby-gnome2.sourceforge.jp/
20
- - Ruby with OpenSSL support
21
- - TheRubyRacer gem (only for JavaScript support)
22
-
23
- INSTALL
24
-
25
- Stable: gem install origami
26
- Devel: hg clone https://origami-pdf.googlecode.com/hg/ origami
27
-
28
- DIRECTORIES
29
-
30
- ``lib/``
31
- Core scripts used to parse a PDF file. All objects and features are
32
- provided here.
33
-
34
- ``samples/``
35
- Many samples, mostly sorted to generate specially crafted PDFs.
36
-
37
- ``bin/``
38
- Useful tools based on Origami.
39
-
40
- ``test/``
41
- Test case units.
42
-
43
- HOMEPAGE
44
-
45
- http://aslr.fr/pages/Origami
46
-
47
- CONTRIBUTORS
48
-
49
- Guillaume Delugré <guillaume (at) security-labs.org> - Author
50
- Frédéric Raynal <fred (at) security-labs.org> - Contributor
51
-
52
- LICENSE
53
-
54
- This software is distributed under the LGPL license.
55
- See the COPYING.LESSER file for more details.
56
-
57
- Exception is for the PDF Walker graphical interface located in subdirectory
58
- bin/gui, which is distributed under the GPL license.
59
- See bin/gui/COPYING file for more details.
60
-
61
- NOTES
62
-
63
- It contains many bugs and many incomplete features. If you encounter a
64
- problem, feel free to report it by mail at <guillaume [at] security-labs
65
- [dot] org>, with a short explanation of what you did and any necessary PDF
66
- documents. Thanks.
67
-
@@ -1,121 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- =begin
4
-
5
- = Author:
6
- Guillaume Delugré <guillaume/at/security-labs.org>
7
-
8
- = Info:
9
- Generates a Graphviz DOT or GraphML file out of a PDF document.
10
-
11
- = License:
12
- Origami is free software: you can redistribute it and/or modify
13
- it under the terms of the GNU Lesser General Public License as published by
14
- the Free Software Foundation, either version 3 of the License, or
15
- (at your option) any later version.
16
-
17
- Origami is distributed in the hope that it will be useful,
18
- but WITHOUT ANY WARRANTY; without even the implied warranty of
19
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
- GNU Lesser General Public License for more details.
21
-
22
- You should have received a copy of the GNU Lesser General Public License
23
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
24
-
25
- =end
26
-
27
- begin
28
- require 'origami'
29
- rescue LoadError
30
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../lib"
31
- $: << ORIGAMIDIR
32
- require 'origami'
33
- end
34
- include Origami
35
-
36
- require 'optparse'
37
-
38
- class OptParser
39
- BANNER = <<USAGE
40
- Usage: #{$0} <PDF-file> [-f <format>] [-o <output-file>]
41
- Generates a Graphviz DOT file out of a PDF document.
42
- Bug reports or feature requests at: http://origami-pdf.googlecode.com/
43
-
44
- Options:
45
- USAGE
46
-
47
- def self.parser(options)
48
- OptionParser.new do |opts|
49
- opts.banner = BANNER
50
-
51
- opts.on("-o", "--output FILE", "Output PDF file") do |o|
52
- options[:output] = o
53
- end
54
-
55
- opts.on("-f", "--format FORMAT", "File format for the generated graph, dot or graphml (Default: dot).") do |f|
56
- options[:format] = f
57
- end
58
-
59
- opts.on_tail("-h", "--help", "Show this message") do
60
- puts opts
61
- exit
62
- end
63
- end
64
- end
65
-
66
- def self.parse(args)
67
- options =
68
- {
69
- :format => 'DOT'
70
- }
71
-
72
- self.parser(options).parse!(args)
73
-
74
- options
75
- end
76
- end
77
-
78
- begin
79
- @options = OptParser.parse(ARGV)
80
-
81
- if ARGV.empty?
82
- STDERR.puts "Error: No filename was specified. #{$0} --help for details."
83
- exit 1
84
- else
85
- target = ARGV.shift
86
- end
87
-
88
- unless ['DOT', 'GRAPHML'].include? @options[:format].upcase
89
- STDERR.puts "Error: Invalid format `#{format}'. #{0} --help for details."
90
- end
91
-
92
- if @options[:outfile].nil?
93
- @options[:outfile] = File.basename(target, '.pdf') +
94
- case @options[:format].upcase
95
- when 'DOT' then
96
- '.dot'
97
- when 'GRAPHML' then
98
- '.graphml'
99
- end
100
- end
101
-
102
- params =
103
- {
104
- :verbosity => Parser::VERBOSE_QUIET,
105
- }
106
-
107
- pdf = PDF.read(target, params)
108
- case @options[:format].upcase
109
- when 'DOT' then
110
- pdf.export_to_graph(@options[:outfile])
111
-
112
- when 'GRAPHML' then
113
- pdf.export_to_graphml(@options[:outfile])
114
- end
115
-
116
- rescue SystemExit
117
- rescue Exception => e
118
- STDERR.puts "#{e.class}: #{e.message}"
119
- exit 1
120
- end
121
-
@@ -1,104 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- =begin
4
-
5
- = Author:
6
- Guillaume Delugré <guillaume/at/security-labs.org>
7
-
8
- = Info:
9
- Embeds and PDF document into a trojan PDF document.
10
-
11
- = License:
12
- Origami is free software: you can redistribute it and/or modify
13
- it under the terms of the GNU Lesser General Public License as published by
14
- the Free Software Foundation, either version 3 of the License, or
15
- (at your option) any later version.
16
-
17
- Origami is distributed in the hope that it will be useful,
18
- but WITHOUT ANY WARRANTY; without even the implied warranty of
19
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
- GNU Lesser General Public License for more details.
21
-
22
- You should have received a copy of the GNU Lesser General Public License
23
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
24
-
25
- =end
26
-
27
- begin
28
- require 'origami'
29
- rescue LoadError
30
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../lib"
31
- $: << ORIGAMIDIR
32
- require 'origami'
33
- end
34
- include Origami
35
-
36
- require 'optparse'
37
-
38
- class OptParser
39
- BANNER = <<USAGE
40
- Usage: #{$0} [<PDF-file>] [-o <output-file>]
41
- Embeds and PDF document into a trojan PDF document.
42
- Bug reports or feature requests at: http://origami-pdf.googlecode.com/
43
-
44
- Options:
45
- USAGE
46
-
47
- def self.parser(options)
48
- OptionParser.new do |opts|
49
- opts.banner = BANNER
50
-
51
- opts.on("-o", "--output FILE", "Output PDF file (stdout by default)") do |o|
52
- options[:output] = o
53
- end
54
-
55
- opts.on_tail("-h", "--help", "Show this message") do
56
- puts opts
57
- exit
58
- end
59
- end
60
- end
61
-
62
- def self.parse(args)
63
- options =
64
- {
65
- :output => STDOUT,
66
- }
67
-
68
- self.parser(options).parse!(args)
69
-
70
- options
71
- end
72
- end
73
-
74
- begin
75
- @options = OptParser.parse(ARGV)
76
-
77
- target = (ARGV.empty?) ? STDIN : ARGV.shift
78
-
79
- EMBEDDEDNAME = "#{::Array.new(5){ rand(26) + 97}}.pdf"
80
-
81
- pdf = PDF.new
82
-
83
- objstm = ObjectStream.new.setFilter(:FlateDecode)
84
- pdf.insert(objstm)
85
-
86
- pagetree = PageTreeNode.new.insert_page(0, page = Page.new)
87
- pdf.Catalog.Pages = objstm.insert(pagetree)
88
- objstm.insert(page)
89
-
90
- file = objstm.insert(pdf.attach_file(target, :Register => false))
91
- pdf.Catalog.Names = objstm.insert(
92
- Names.new.setEmbeddedFiles(NameTreeNode.new.setNames([ EMBEDDEDNAME, file ]))
93
- )
94
-
95
- page.onOpen Action::GoToE.new(EMBEDDEDNAME, Destination::GlobalFit.new(0))
96
-
97
- pdf.save(@options[:output], :noindent => true)
98
-
99
- rescue SystemExit
100
- rescue Exception => e
101
- STDERR.puts "#{e.class}: #{e.message}"
102
- exit 1
103
- end
104
-