I wanted to examine the textures of a game I like on mobile. As far as I understand, the game textures were made with cocos2d. I have reversed the textures of other 2D games before, but I could not do this, please help.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>frames</key>
<dict>
<key>npc_alisa_arrange_black_01.png</key>
<dict>
<key>frame</key>
<string>{{82,60},{22,32}}</string>
<key>offset</key>
<string>{-1,16}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{28,8},{22,32}}</string>
<key>sourceSize</key>
<string>{80,80}</string>
</dict>
<key>npc_alisa_arrange_black_02.png</key>
<dict>
<key>frame</key>
<string>{{74,188},{22,30}}</string>
<key>offset</key>
<string>{-1,15}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{28,10},{22,30}}</string>
<key>sourceSize</key>
<string>{80,80}</string>
</dict>
<key>npc_alisa_cooking_black_01.png</key>
<dict>
<key>frame</key>
<string>{{34,84},{22,36}}</string>
<key>offset</key>
<string>{-1,17}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{28,5},{22,36}}</string>
<key>sourceSize</key>
<string>{80,80}</string>
</dict>
<key>npc_alisa_cooking_black_02.png</key>
<dict>
<key>frame</key>
<string>{{66,2},{22,38}}</string>
<key>offset</key>
<string>{-1,18}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{28,3},{22,38}}</string>
<key>sourceSize</key>
<string>{80,80}</string>
</dict>
<key>npc_alisa_cooking_black_03.png</key>
<dict>
<key>frame</key>
<string>{{2,126},{22,36}}</string>
<key>offset</key>
<string>{-1,17}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{28,5},{22,36}}</string>
<key>sourceSize</key>
<string>{80,80}</string>
</dict>
I tried with classic textureunpackers but I was not successful. Normally they open easily but I keep getting errors.
If you hex-dump your PNG file, it looks like this:
xxd npc_alisa.png | more
00000000: 0050 4e47 0d0a 1a0a 5000 000d 4948 4452 .PNG....P...IHDR
00000010: 0000 0100 0000 00f4 0803 0000 0043 d808 .............C..
00000020: ef00 0000 0467 414d 4100 00b1 8f0b fc61 .....gAMA......a
The "file magic" (a.k.a. signature) of a PNG file is:
89 50 4e 47 0d 0a 1a 0a
so the first byte is corrupted. You can either edit it with a hex-editor, or if you are a dinosaur like me, use xxd
to dump it in plain ASCII, then use sed
to change the first byte from 00
to 89
and then re-assemble the binary PNG from plain ASCII:
That looks like this:
xxd -p npc_alisa.png | sed '1s/00/89/' | xxd -r -p > patched.png
If you try and use that file, you'll get an error because the length
field of the IHDR
chunk is set to 50 00 00 0d
which is an enormous number which will make PNG readers try and read 1342177293 bytes of IHDR
and fall off the end of the file. The correct length of an IHDR
is 13 bytes, so it should be 00 00 00 0d
. So, I get out trusty old xxd
and sed
and change that too:
xxd -p npc_alisa.png | sed -e '1s/00/89/' -e '1s/1a0a50/1a0a00/' | xxd -r -p > patched.png
Note that if you don't have/like xxd
and sed
, you can use a hex editor. This is not an endorsement, and I have no affiliation, but there is a fairly decent online one here which means you don't have to install anything on your machine and it works for hapless Windows users too.