Been doing some reverse engineering on a recently released pixel art related device. The use non standard way to store images, and even if they provide some tools to convert to more normal image format, when they disappear, these tools will too.

To start with, the device is the MinBay MB701 Pixel Art board that was on kickstarter not long ago. It's a small device, about 10x10cm with a touch screen LCD
It hold well in hand, and is easy to use.

Each image you make on the device do generate two files, a .pix file that store the final image, and a .dat file which is the history of the image, you can use it to create animation and also the device use it to have a redo function.

Here is an example of one image preloaded on the device, and the animation going with it.
Yes the history do show things that was deleted in the final image, it is quite interesting.

Their file format is reasonably well though, but have some weird quirks, and of course there are still some unknown field in the header because not used by the exporting apps.
For example, commands that deal with color, the color index shifted by 28, so reading 28 mean it's actually the color 0. Canvas indexes are stored with their value multiplied by 4.
There are some more oddities that I have documented (if you are interested look at the stroke number in the PTCR file format)

And last for now, here is the link to the GitHub that have all the info I've published up so far: https://github.com/Godzil/MB701-Reverse

Near completion: PIXB and PTCR file format and sample tool to deal with them
To be done: The BLE protocole, Update file format, Hardware reference.

And if you fancy helping, especially on the update format, you are more than welcome! I'll probably setup a shared ghidra repository for that.

GitHub - Godzil/MB701-Reverse

Contribute to Godzil/MB701-Reverse development by creating an account on GitHub.

GitHub

And guess what? Just found a bug 😃

The history format do store a full stroke of pixel, and I way the command is made it can only store up to 255 pixel in one stroke. And found two problem, It seems they are not storing the number of pixel on 8bit, but less (some history file have a too low number of pixel and there are less than 255) making the history to not work properly, and if a stroke is really too long, the firmware just crash, most likely a buffer overflow 😄

I suspect them to have a fixed size array to store the draw pixel position and do not check if the stroke get too long by splitting it, and the array get overflowed.

I'm sadly not far enough on the reverse of the firmware update format to know how to extract the app binary and check that, but that's the best explanation up so far on what is happening.

How to not crash it? Avoid long stroke 🙂

Damn that's so nice to be able to edit a toot when you spot there is a typo :D
@Godzil It's like the difference between WhatsApp and Telegram. Long live Telegram.