1

I'm writing a piece of software that will take positional data from a piece of software called Pyware and put it into a GUI so I can visualize the coordinates and assign each coordinate a color.

Pyware is written in Java and I unzipped one of its save files and found the images Pyware loads as materials and then a .3dj file. I'm trying to reverse engineer the positional data from this 3dj file so I can create some reasonable coordinate system to load into my GUI but I'm pretty lost on how to do this.

Since the software was written in Java, I thought maybe the data was a serialized object, so I used google's jdeserialize to try to reconstruct the object schema, but that didn't work. Here's the file I'm trying to reverse engineer. Any ideas?

1

This is not an answer, just a suggestion what you can explore next.

The file seems to be a simple sequence of blocks like this:

+00000 [4 bytes] block tag/id
+00004 [4 bytes] block length
+00008 [length ] block data

+00008+length [4 bytes] next block tag/id
...

So in your file:

00000000  33 44 4a 56 00 00 00 0a  00 09 00 00 00 30 11 f9  |3DJV.........0..|
00000010  19 6d 50 52 50 54 00 00  00 09 00 00 00 00 00 00  |.mPRPT..........|
00000020  00 00 00 50 52 45 46 00  00 00 3f 09 53 61 6e 73  |...PREF...?.Sans|
00000030  53 65 72 69 66 00 00 00  00 00 00 00 0c 09 53 61  |Serif.........Sa|
00000040  6e 73 53 65 72 69 66 00  00 00 00 00 00 00 06 40  |nsSerif........@|
00000050  00 00 00 16 41 41 4d 42  20 32 30 31 38 20 2d 20  |....AAMB 2018 - |
00000060  41 72 65 74 68 61 20 2d  20 32 50 52 46 32 00 00  |Aretha - 2PRF2..|
00000070  00 13 00 78 07 42 10 00  00 01 00 0c 00 06 04 ff  |...x.B..........|
00000080  ff 00 ff ff 00 47 52 49  44 00 00 05 25 00 56 08  |.....GRID...%.V.|
00000090  56 45 52 53 20 30 20 30  44 54 49 54 4c 20 2f 55  |VERS 0 0DTITL /U|
...

you get these blocks:

00000000 block "3DJV", length 0x0000000a (10) bytes
00000012 block "PRPT", length 0x00000009 (9) bytes
00000023 block "PREF", length 0x0000003f (63) bytes
0000006a block "PRF2", length 0x00000013 (19) bytes
...

As you continue parsing the file you're probably going to find more interesting blocks, possibly related to data you're interested in.

Now what you can do is to create the simplest possible file and save it. Then modify just one coordinate in the GUI, save it and compare with the first file. Modify the coordinate in another way and compare. Because the file looks rather simple, it could be that only one floating point number changes in the file and you'll be able to identify the coordinate format.

Another approach would be to decompile the Java code. It can give you insight into the meaning of each block and how data are stored. You can also look at which 3rd party Java classes and packages are imported, it might simplify your life if you can use them directly or even find an online documentation.

Other possibilities are asking Pyware authors whether they have a documentation of the format or an SDK. If Pyware allows you to save or export files in a well-supported or open format you should be able to import with ease.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.