Files
radaree2/test/db/cmd/cmd_pf2
potato 82ac752631 Removing pf, pf2 is the new pf ##print
* Refactor print formatting to improve handling of structs, arrays and pointers ##print
* Refactor print formatting to improve handling of structs, arrays, and pointers
* Remove format2.c and refactor print formatting to improve handling of structs, arrays, and pointers
* update abiversion
2025-12-07 22:27:51 +01:00

656 lines
26 KiB
Plaintext

NAME=PE JSON test
FILE=bins/pe/ch22.exe
ARGS=-nn -e bin.types=true
CMDS=<<EOF
e asm.bits=32
s 0x80
pfj.pe_nt_image_headers32
EOF
EXPECT=<<EOF
[{"name":"signature","type":"z","offset":128,"value":"PE"},{"name":"fileHeader","type":"pe_image_file_header","offset":132,"value":[{"name":"machine","type":"E","offset":132,"value":332,"label":"IMAGE_FILE_MACHINE_I386","enum":"pe_machine"},{"name":"numberOfSections","type":"w","offset":134,"value":4},{"name":"timeDateStamp","type":"t","offset":136,"value":"Thu Sep 11 18:21:46 2014"},{"name":"pointerToSymbolTable","type":"x","offset":140,"value":0},{"name":"numberOfSymbols","type":"x","offset":144,"value":0},{"name":"sizeOfOptionalHeader","type":"w","offset":148,"value":224},{"name":"characteristics","type":"B","offset":150,"value":"0x00000102 : IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_32BIT_MACHINE"}]},{"name":"optionalHeader","type":"pe_image_optional_header32","offset":152,"value":[{"name":"magic","type":"E","offset":152,"value":267,"label":"IMAGE_NT_OPTIONAL_HDR32_MAGIC","enum":"pe_magic"},{"name":"majorLinkerVersion","type":"b","offset":154,"value":11},{"name":"minorLinkerVersion","type":"b","offset":155,"value":0},{"name":"sizeOfCode","type":"x","offset":156,"value":12288},{"name":"sizeOfInitializedData","type":"x","offset":160,"value":13312},{"name":"sizeOfUninitializedData","type":"x","offset":164,"value":0},{"name":"addressOfEntryPoint","type":"x","offset":168,"value":20286},{"name":"baseOfCode","type":"x","offset":172,"value":8192},{"name":"baseOfData","type":"x","offset":176,"value":24576},{"name":"imageBase","type":"x","offset":180,"value":4194304},{"name":"sectionAlignment","type":"x","offset":184,"value":8192},{"name":"fileAlignment","type":"x","offset":188,"value":512},{"name":"majorOperatingSystemVersion","type":"w","offset":192,"value":4},{"name":"minorOperatingSystemVersion","type":"w","offset":194,"value":0},{"name":"majorImageVersion","type":"w","offset":196,"value":0},{"name":"minorImageVersion","type":"w","offset":198,"value":0},{"name":"majorSubsystemVersion","type":"w","offset":200,"value":6},{"name":"minorSubsystemVersion","type":"w","offset":202,"value":0},{"name":"win32VersionValue","type":"x","offset":204,"value":0},{"name":"sizeOfImage","type":"x","offset":208,"value":57344},{"name":"sizeOfHeaders","type":"x","offset":212,"value":1024},{"name":"checkSum","type":"x","offset":216,"value":0},{"name":"subsystem","type":"E","offset":220,"value":2,"label":"IMAGE_SUBSYSTEM_WINDOWS_GUI","enum":"pe_subsystem"},{"name":"dllCharacteristics","type":"B","offset":222,"value":"0x00008560 : IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA | IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE | IMAGE_DLLCHARACTERISTICS_NX_COMPAT | IMAGE_DLLCHARACTERISTICS_NO_SEH | IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE"},{"name":"sizeOfStackReserve","type":"x","offset":224,"value":1048576},{"name":"sizeOfStackCommit","type":"x","offset":228,"value":4096},{"name":"sizeOfHeapReserve","type":"x","offset":232,"value":1048576},{"name":"sizeOfHeapCommit","type":"x","offset":236,"value":4096},{"name":"loaderFlags","type":"x","offset":240,"value":0},{"name":"numberOfRvaAndSizes","type":"x","offset":244,"value":16},{"name":"dataDirectory","type":"pe_image_data_directory","offset":248,"value":[{"name":"virtualAddress","type":"x","offset":248,"value":0},{"name":"size","type":"x","offset":252,"value":0},{"name":"virtualAddress","type":"x","offset":256,"value":20208},{"name":"size","type":"x","offset":260,"value":75},{"name":"virtualAddress","type":"x","offset":264,"value":32768},{"name":"size","type":"x","offset":268,"value":11840},{"name":"virtualAddress","type":"x","offset":272,"value":0},{"name":"size","type":"x","offset":276,"value":0},{"name":"virtualAddress","type":"x","offset":280,"value":0},{"name":"size","type":"x","offset":284,"value":0},{"name":"virtualAddress","type":"x","offset":288,"value":49152},{"name":"size","type":"x","offset":292,"value":12},{"name":"virtualAddress","type":"x","offset":296,"value":24576},{"name":"size","type":"x","offset":300,"value":28},{"name":"virtualAddress","type":"x","offset":304,"value":0},{"name":"size","type":"x","offset":308,"value":0},{"name":"virtualAddress","type":"x","offset":312,"value":0},{"name":"size","type":"x","offset":316,"value":0},{"name":"virtualAddress","type":"x","offset":320,"value":0},{"name":"size","type":"x","offset":324,"value":0},{"name":"virtualAddress","type":"x","offset":328,"value":0},{"name":"size","type":"x","offset":332,"value":0},{"name":"virtualAddress","type":"x","offset":336,"value":0},{"name":"size","type":"x","offset":340,"value":0},{"name":"virtualAddress","type":"x","offset":344,"value":8192},{"name":"size","type":"x","offset":348,"value":8},{"name":"virtualAddress","type":"x","offset":352,"value":0},{"name":"size","type":"x","offset":356,"value":0},{"name":"virtualAddress","type":"x","offset":360,"value":8200},{"name":"size","type":"x","offset":364,"value":72},{"name":"virtualAddress","type":"x","offset":368,"value":0},{"name":"size","type":"x","offset":372,"value":0}]}]}]
EOF
RUN
NAME=JSON output
FILE=malloc://1024
CMDS=<<EOF
e asm.bits=32
wx 341289679a020000a00f00002a003000000014426416
wx 800600000040@0x20
wx 14000000641620000000@0x30
pf.troll iw*? integer word (troll)Bah
pf.plop i?w first (troll)Boh bwa
pf.gobelin 2ww?x blah meh (plop)Buh foo
pfj.gobelin
EOF
EXPECT=<<EOF
[{"array":[{"index":0,"offset":0,"values":[{"name":"blah","type":"w","offset":0,"value":4660},{"name":"meh","type":"w","offset":2,"value":26505},{"name":"Buh","type":"plop","offset":4,"value":[{"name":"first","type":"i","offset":4,"value":666},{"name":"Boh","type":"troll","offset":8,"value":[{"name":"integer","type":"i","offset":8,"value":4000},{"name":"word","type":"w","offset":12,"value":42},{"name":"Bah","type":"troll","ptr":true,"offset":8,"ptraddr":48,"value":[{"name":"integer","type":"i","offset":48,"value":20},{"name":"word","type":"w","offset":52,"value":5732},{"name":"Bah","type":"troll","ptr":true,"offset":48,"ptraddr":32,"value":[{"name":"integer","type":"i","offset":32,"value":1664},{"name":"word","type":"w","offset":36,"value":16384},{"name":"Bah","type":"troll","ptr":true,"offset":32,"value":"NULL"}]}]}]},{"name":"bwa","type":"w","offset":18,"value":16916}]},{"name":"foo","type":"x","offset":20,"value":5732}]},{"index":1,"offset":24,"values":[{"name":"blah","type":"w","offset":24,"value":0},{"name":"meh","type":"w","offset":26,"value":0},{"name":"Buh","type":"plop","offset":28,"value":[{"name":"first","type":"i","offset":28,"value":0},{"name":"Boh","type":"troll","offset":32,"value":[{"name":"integer","type":"i","offset":32,"value":1664},{"name":"word","type":"w","offset":36,"value":16384},{"name":"Bah","type":"troll","ptr":true,"offset":32,"value":"NULL"}]},{"name":"bwa","type":"w","offset":42,"value":0}]},{"name":"foo","type":"x","offset":44,"value":0}]}]}]
EOF
RUN
NAME=access specific element through nested struct
FILE=malloc://1024
CMDS=<<EOF
e asm.bits=32
wx 341289679a020000a00f00002a003000000014426416
wx 800600000040@0x20
wx 14000000641620000000@0x30
pf.troll iw*? integer word (troll)Bah
pf.plop i?w first (troll)Boh bwa
pf.gobelin ww?x blah meh (plop)Buh foo
pf.gobelin.Buh.first
pf.gobelin.Buh.Boh.word
EOF
EXPECT=<<EOF
Buh :
struct<plop>
first : 0x00000004 = 666
Buh :
struct<plop>
Boh :
struct<troll>
word : 0x0000000c = 0x002a
EOF
RUN
NAME=access specific element in an array
FILE=malloc://1024
CMDS=<<EOF
e asm.bits=32
wx a00f0000adde @ 0x10
pf.plop iwqw one two three four
pf.troll [3]? (plop)str
pf.troll.str[1]
pf.troll.str[1].two
EOF
EXPECT=<<EOF
str :
[
struct<plop>
one : 0x00000010 = 4000
two : 0x00000014 = 0xdead
three : 0x00000016 = (qword)0x0000000000000000
four : 0x0000001e = 0x0000
]
str :
[
struct<plop>
two : 0x00000014 = 0xdead
]
EOF
RUN
NAME=Complex request with specific array element and specific field
FILE=bins/pe/ch22.exe
ARGS=-nn -e bin.types=true
CMDS=<<EOF
e asm.bits=32
s 0x80
pf.pe_dos_header.e_res[2]
pf.pe_dos_header.e_res2[8]
EOF
EXPECT=<<EOF
e_res : 0x000000a0 = [ 0x3400 ]
e_res2 : 0x000000b8 = [ 0x2000 ]
EOF
RUN
NAME=write specific element through nested struct
FILE=malloc://1024
CMDS=<<EOF
e asm.bits=32
wx 341289679a020000a00f00002a003000000014426416
wx 800600000040@0x20
wx 14000000641620000000@0x30
pf.troll iw*? integer word (troll)Bah
pf.plop i?w first (troll)Boh bwa
pf.gobelin ww?x blah meh (plop)Buh foo
pf.gobelin.Buh.first=42
.pf.gobelin.Buh.first=42
pf.gobelin.Buh.Boh.Bah.Bah.word=0xadde
.pf.gobelin.Buh.Boh.Bah.Bah.word=0xadde
pf.gobelin
EOF
EXPECT=<<EOF
wv4 42 @ 4
wv2 0xadde @ 0x00000024
blah : 0x00000000 = 0x1234
meh : 0x00000002 = 0x6789
Buh :
struct<plop>
first : 0x00000004 = 42
Boh :
struct<troll>
integer : 0x00000008 = 4000
word : 0x0000000c = 0x002a
Bah : (*0x30)
struct<troll>
integer : 0x00000030 = 20
word : 0x00000034 = 0x1664
Bah : (*0x20)
struct<troll>
integer : 0x00000020 = 1664
word : 0x00000024 = 0xadde
Bah : NULL
bwa : 0x00000012 = 0x4214
foo : 0x00000014 = 0x00001664
EOF
RUN
NAME=nested struct field selection then full print
FILE=malloc://64
CMDS=<<EOF
e asm.bits=32
wv 1
wv 2 @ 4
wv 3 @ 8
wv 4 @ 12
pf.child ii one two
pf.parent i?i head (child)body tail
pfj.parent
pf.parent.body
pf.parent
EOF
EXPECT=<<EOF
[{"name":"head","type":"i","offset":0,"value":1},{"name":"body","type":"child","offset":4,"value":[{"name":"one","type":"i","offset":4,"value":2},{"name":"two","type":"i","offset":8,"value":3}]},{"name":"tail","type":"i","offset":12,"value":4}]
body :
struct<child>
one : 0x00000004 = 2
two : 0x00000008 = 3
head : 0x00000000 = 1
body :
struct<child>
one : 0x00000004 = 2
two : 0x00000008 = 3
tail : 0x0000000c = 4
EOF
RUN
NAME=print anonymous nested struct
FILE=malloc://1024
CMDS=<<EOF
e asm.bits=32
wx 71776572747975696f706173646667686a6b6c7a786376626e6d71776572747975696f706173646667686a6b6c7a786376626e6d
pf.dsf ii a b
pf.abc ic...?i a b (pf i?i a (dsf)b c)c d
pf.def ic...*?i a b (pf i?i a (dsf)b c)c d
pf.abc
pf.def
EOF
EXPECT=<<EOF
a : 0x00000000 = 1919252337
b : 0x00000004 = 't'
c :
struct<i?i a (dsf)b c>
a : 0x00000008 = 1935765615
b :
struct<dsf>
a : 0x0000000c = 1751606884
b : 0x00000010 = 2053925738
c : 0x00000014 = 1651925880
d : 0x00000018 = 2003922286
a : 0x00000000 = 1919252337
b : 0x00000004 = 't'
c : (*0x7361706f)
struct<i?i a (dsf)b c>
a : 0x7361706f = 0
b :
struct<dsf>
a : 0x73617073 = 0
b : 0x73617077 = 0
c : 0x7361707b = 0
d : 0x0000000c = 1751606884
EOF
RUN
NAME=pf only one size
FILE=malloc://1024
CMDS=pf 16 16
EXPECT=<<EOF
| pf fmt show data using the given format-string (see 'pf??' and 'pf???')
| pf? help on commands
| pf?? help on format characters
| pf??? show usage examples
EOF
RUN
NAME=pf refuse space between size and format-string
FILE=malloc://1024
CMDS=pf 16 16
EXPECT=<<EOF
| pf fmt show data using the given format-string (see 'pf??' and 'pf???')
| pf? help on commands
| pf?? help on format characters
| pf??? show usage examples
EOF
RUN
NAME=pf field name
FILE=malloc://1024
CMDS=pf 2x x2
EXPECT=<<EOF
0x00000000 [0] {
x2 : 0x00000000 = 0x00000000
}
0x00000004 [1] {
x2 : 0x00000004 = 0x00000000
}
EOF
RUN
NAME=pf rop64
FILE=malloc://1024
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
wx 5558 @ 0x22
wv8 0x22 @ 0x50
wv8 0x23 @ 0x58
pf *D*D @ 0x50
EOF
EXPECT=<<EOF
(*0x22)push rbp
(*0x23)pop rax
EOF
RUN
NAME=pf rop32
FILE=malloc://1024
CMDS=<<EOF
e asm.arch=x86
e asm.bits=32
wx 5558 @ 0x22
wv4 0x22 @ 0x50
wv4 0x23 @ 0x54
pf *D*D @ 0x50
EOF
EXPECT=<<EOF
(*0x22)push ebp
(*0x23)pop eax
EOF
RUN
NAME=pf *z (64bit addr)
FILE=-
CMDS=<<EOF
e io.cache=true
e asm.bits=64
wz root @ 0x0000000100000faf
pf z @ 0x0000000100000faf
e cfg.bigendian=false
16wx+cc @ 0x200
wv8 0x0000000100000faf @ 0x204
pf *z @ 0x204
e cfg.bigendian=true
16wx+cc @ 0x200
wv8 0x0000000100000faf @ 0x204
pf *z @ 0x204
EOF
EXPECT=<<EOF
0x100000faf = "root"
(*0x100000faf)0x00000204 = "root"
(*0x100000faf)0x00000204 = "root"
EOF
RUN
NAME=pf F max precision (#13027)
FILE=-
CMDS=<<EOF
wv8 0x400921fb54442d18
pf F
?e
wv8 0x3e901b2b20000000
pf q
pf F
EOF
EXPECT=<<EOF
0x00000000 = 3.1415926535897931
0x00000000 = (qword)0x3e901b2b20000000
0x00000000 = 2.3999999143597961e-07
EOF
RUN
NAME=pf f max precision
FILE=-
CMDS=<<EOF
wv4 0x40490fdb
pf f
EOF
EXPECT=<<EOF
0x00000000 = 3.14159274
EOF
RUN
NAME=pfj z not-at-start fix
FILE=-
CMDS=<<EOF
wx 46
wz ABCDE @ 0x1
pf bz
pfj bz
EOF
EXPECT=<<EOF
0x00000000 = 0x46
0x00000001 = "ABCDE"
[{"type":"b","offset":0,"value":70},{"type":"z","offset":1,"value":"ABCDE"}]
EOF
RUN
NAME=pf/pfj z with size
FILE=-
CMDS=<<EOF
wz ABCDE
(pf2 format; pf $0; pfj $0)
.(pf2 z)
?e
.(pf2 [3]z)
?e
.(pf2 [7]z)
EOF
EXPECT=<<EOF
0x00000000 = "ABCDE"
[{"type":"z","offset":0,"value":"ABCDE"}]
0x00000000 = "ABC"
[{"type":"z","offset":0,"value":"ABC"}]
0x00000000 = "ABCDE"
[{"type":"z","offset":0,"value":"ABCDE"}]
EOF
RUN
NAME=pf z overflow
FILE=malloc://3200
ARGS=-m 1000
CMDS=<<EOF
e io.cache=false
om* > $initial_map
?e --- io.unalloc = true ---
?e
e io.unalloc=true
e io.va=true
s 3046
w AB
pf [2]z
pf z
pf [5]z
pf z @ 0xfffff
?e
e io.va=false
s 2046
pf [2]z
pf z
pf [5]z
pf z @ 0xfffff
?e
e io.va=true
om
?e ----
om-*
om 3 1000 1024 0 rwx
om 3 2024 1024 1024 rwx
om
wz CD @ 2023
pf z @ 2023
?e ----
om- 2
om 3 2024 1024 1024 -wx
om
pf z @ 2023
?e ----
om- 2
om
pf z @ 2023
om-*
.$initial_map
?e
e io.cache=true
wz 12 @ 0xfffff
pf z @ 0xfffff
e io.cache=false
?e
?e --- io.unalloc = false ---
?e
e io.unalloc=false
e io.va=true
s 3046
pf [2]z
pf z
pf [5]z
pf z @ 0xfffff
EOF
EXPECT=<<EOF
--- io.unalloc = true ---
0x00000be6 = "AB"
0x00000be6 = "AB"
0x00000be6 = "AB"
0x000fffff = ovf "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
0x000007fe = "AB"
0x000007fe = "AB"
0x000007fe = "AB"
0x000fffff = ovf "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
* 1 fd: 3 +0x00000000 0x000003e8 - 0x00001067 rwx
----
* 2 fd: 3 +0x00000400 0x000007e8 - 0x00000be7 rwx
- 1 fd: 3 +0x00000000 0x000003e8 - 0x000007e7 rwx
0x000007e7 = "CD"
----
* 2 fd: 3 +0x00000400 0x000007e8 - 0x00000be7 -wx
- 1 fd: 3 +0x00000000 0x000003e8 - 0x000007e7 rwx
0x000007e7 = ovf "C\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
----
- 1 fd: 3 +0x00000000 0x000003e8 - 0x000007e7 rwx
0x000007e7 = ovf "C\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
0x000fffff = "12"
--- io.unalloc = false ---
0x00000be6 = "AB"
0x00000be6 = "AB"
0x00000be6 = "AB"
0x000fffff = "12"
EOF
RUN
NAME=pfj z overflow
FILE=malloc://3200
ARGS=-m 1000
CMDS=<<EOF
e io.unalloc=true
s 3046
w AB\x00
pfj [2]z
pfj z
pfj [5]z
?e ----
w AB\xff
pfj [2]z
pfj z
pfj [5]z
pfj z @ 0xfffff
e io.unalloc=false
pfj z @ 0xfffff
EOF
EXPECT=<<EOF
[{"type":"z","offset":3046,"value":"AB"}]
[{"type":"z","offset":3046,"value":"AB"}]
[{"type":"z","offset":3046,"value":"AB"}]
----
[{"type":"z","offset":3046,"value":"AB"}]
[{"type":"z","offset":3046,"value":"AB\u00ff"}]
[{"type":"z","offset":3046,"value":"AB\u00ff"}]
[{"type":"z","offset":1048575,"value":"\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff","overflow":true}]
[{"type":"z","offset":1048575,"value":"\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff","overflow":true}]
EOF
RUN
NAME=pf?
FILE=-
CMDS=<<EOF
pfo elf32.r2
pf?elf_header
pf? elf_header
EOF
EXPECT=<<EOF
?[2]E[2]E[4]ExxxxN2N2N2N2N2N2 (elf_ident)ident (elf_type)type (elf_machine)machine (elf_obj_version)version entry phoff shoff flags ehsize phentsize phnum shentsize shnum shstrndx
?[2]E[2]E[4]ExxxxN2N2N2N2N2N2 (elf_ident)ident (elf_type)type (elf_machine)machine (elf_obj_version)version entry phoff shoff flags ehsize phentsize phnum shentsize shnum shstrndx
EOF
RUN
NAME=pf? struct not defined
FILE=-
CMDS=pf?cat_sat_on_keyboard
EXPECT_ERR=<<EOF
ERROR: Struct cat_sat_on_keyboard is not defined
EOF
RUN
NAME=-nn filename with @
FILE=bins/elf/analysis/tiny1@invalid_addr
ARGS=-nn -e bin.types=true
CMDS=<<EOF
e io.va=0
pf.elf_header @ elf_header
EOF
EXPECT=<<EOF
ident :
struct<elf_ident>
magic : 0x00000000 = "\x7fELF"
class : 0x00000004 = class (enum elf_class) = 0x1 ; ELFCLASS32
data : 0x00000005 = data (enum elf_data) = 0x1 ; ELFDATA2LSB
version : 0x00000006 = version (enum elf_hdr_version) = 0x1 ; EV_CURRENT
type : 0x00000010 = type (enum elf_type) = 0x2 ; ET_EXEC
machine : 0x00000012 = machine (enum elf_machine) = 0x3 ; EM_386
version : 0x00000014 = version (enum elf_obj_version) = 0x1 ; EV_CURRENT
entry : 0x00000018 = 0x08048054
phoff : 0x0000001c = 0x00000034
shoff : 0x00000020 = 0x00000000
flags : 0x00000024 = 0x00000000
ehsize : 0x00000028 = 52
phentsize : 0x0000002a = 32
phnum : 0x0000002c = 1
shentsize : 0x0000002e = 0
shnum : 0x00000030 = 0
shstrndx : 0x00000032 = 0
EOF
RUN
NAME=pfc N# and n#
FILE=-
ARGS=-a x86 -b 64
CMDS=<<EOF
(wneg num size; wv$1 -$0; s+ $1)
.(wneg 1 1)
.(wneg 2 2)
.(wneg 3 4)
.(wneg 4 8)
s 0
pfc N1N2N4N8 byte word dword qword
pfc n1n2n4n8 byte word dword qword
EOF
EXPECT=<<EOF
struct {
uint8_t byte; // 255
uint16_t word; // 65534
uint32_t dword; // 4294967293
uint64_t qword; // 18446744073709551612
}
struct {
int8_t byte; // -1
int16_t word; // -2
int32_t dword; // -3
int64_t qword; // -4
}
EOF
RUN
NAME=pf missing features
FILE=malloc://1024
CMDS=<<EOF
e asm.bits=32
# ULEB128: 624485 = 0x98765 => E5 8E 26
wx e58e26 @ 0
pf u @ 0
# Octal
wx 10000000 @ 4
pf o @ 4
# Bfloat16
# 1.0 is 0x3f80
wx 803f @ 8
pf g @ 8
# 10 bytes
wx 0102030405060708090a @ 12
pf T @ 12
# Endian swap
# wx writes bytes 12 34 56 78
# LE read: 0x78563412
# BE read: 0x12345678
wx 12345678 @ 24
pf "x;ex" @ 24
# Skip : (4 bytes) and . (1 byte)
wx 112233445566778899aa @ 32
pf x.x @ 32
# Overlap ,
# wx writes bytes: AA BB CC DD
# x (LE) -> 0xDDCCBBAA
# , rewinds 1 byte.
# c reads at offset+3 (DD).
wx AABBCCDD @ 48
pf x,c @ 48
# Pointer to string s
w "Hello" @ 0x100
wv4 0x100 @ 60
pf s @ 60
# Wide string Z
# H e l l o
wx 480065006c006c006f000000 @ 70
pf Z @ 70
# Uint128 Q
wx 0102030405060708090a0b0c0d0e0f00 @ 80
pf Q @ 80
# Hex pairs X (4 bytes)
pf [4]X @ 80
EOF
EXPECT=<<EOF
0x00000000 = 624485
0x00000004 = (octal) 000000020
0x00000008 = 1
0x0000000c = 01 02 03 04 05 06 07 08 09 0a ... (..........)
0x00000018 = 0x78563412
0x00000018 = 0x12345678
0x00000020 = 0x44332211
0x00000025 = 0x99887766
0x00000030 = 0xddccbbaa
0x00000033 = '.'
0x0000003c = 0x0000003c -> 0x00000100 "Hello"
0x00000046 = Hello
0x00000050 = (uint128_t)0x000f0e0d0c0b0a090807060504030201
0x00000050 = 01 02 03 04 ... (....)
EOF
RUN
NAME=format2 endian enum check
FILE=malloc://1024
CMDS=<<EOF
e cfg.bigendian=true
wX 4142434431323334
"td enum ascii{ LETTER_A=0x41, LETTER_D=0x44, DIGIT_1=0x31, DIGIT_4=0x34}"
pf [1]E[1]E[1]E[1]E[1]E[1]E[1]E[1]E (ascii)B1 (ascii)B2 (ascii)B3 (ascii)B4 (ascii)B5 (ascii)B6 (ascii)B7 (ascii)B8
EOF
EXPECT=<<EOF
B1 : 0x00000000 = B1 (enum ascii) = 0x41 ; LETTER_A
B2 : 0x00000001 = B2 (enum ascii) = 0x42
B3 : 0x00000002 = B3 (enum ascii) = 0x43
B4 : 0x00000003 = B4 (enum ascii) = 0x44 ; LETTER_D
B5 : 0x00000004 = B5 (enum ascii) = 0x31 ; DIGIT_1
B6 : 0x00000005 = B6 (enum ascii) = 0x32
B7 : 0x00000006 = B7 (enum ascii) = 0x33
B8 : 0x00000007 = B8 (enum ascii) = 0x34 ; DIGIT_4
EOF
RUN