Editing SPU Isolated Modules Reverse Engineering
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
[[Category:Software]] | |||
== anergistic == | == anergistic == | ||
Using a static analysis (IDA) could give you a good view of what the program does, but sometimes you want to know what a program does in real time and how it reacts to different parameters, this is where anergistics becomes a powerful tool. It simulates the SPU including its communication, and storage. | Using a static analysis (IDA) could give you a good view of what the program does, but sometimes you want to know what a program does in real time and how it reacts to different parameters, this is where anergistics becomes a powerful tool. It simulates the SPU including its communication, and storage. | ||
=== | === usage === | ||
anergistic can be launched in two different modes, one that '''only emulates''' (runs) the program through the SPU and the the other that lets you '''debug''' the process through gdb | anergistic can be launched in two different modes, one that '''only emulates''' (runs) the program through the SPU and the the other that lets you '''debug''' the process through gdb | ||
Line 17: | Line 10: | ||
==== only emulate ==== | ==== only emulate ==== | ||
<pre> | |||
./anergistic spu_elf_name.elf | |||
</pre> | |||
this mode runs an elf with all the parameters and actions defined on main.c, channel.c a | this mode runs an elf with all the parameters and actions defined on main.c, channel.c a | ||
==== debug ==== | ==== debug ==== | ||
terminal 1 | terminal 1 | ||
<pre> | |||
./anergistic -g 1234 spu_elf_name.elf | |||
</pre> | |||
terminal 2 | terminal 2 | ||
<pre> | |||
gdb | |||
(gdb)target remote :1234 | (gdb)target remote :1234 | ||
</ | </pre> | ||
this mode performs the same as above but lets you debug the process through gdb | this mode performs the same as above but lets you debug the process through gdb | ||
=== | ===== | ||
== aim_spu_module == | == aim_spu_module == | ||
It is used to retrieve the device type, device id, open psid and the pscode from the EID0 data that is passed in. | |||
=== Debug messages === | === Debug messages === | ||
{| class="wikitable" | {| class="wikitable" | ||
! colspan="2" | Address !! rowspan="2" | Message | ! colspan="2" | Address !! rowspan="2" | Message | ||
Line 115: | Line 51: | ||
| 0x3790 || 0x3610 || "(spu) PU DMA area size is not equall to AIM_DMA_SIZE\n" | | 0x3790 || 0x3610 || "(spu) PU DMA area size is not equall to AIM_DMA_SIZE\n" | ||
|} | |} | ||
This messages are DMAed to the ppu if a debug output address is specified. | |||
=== Data === | === Data === | ||
{| class="wikitable" | {| class="wikitable" | ||
! colspan="2" | Address !! rowspan="2" | Message | ! colspan="2" | Address !! rowspan="2" | Message | ||
Line 125: | Line 60: | ||
! ? 3.41 ? !! 355 CEX | ! ? 3.41 ? !! 355 CEX | ||
|- | |- | ||
| 0x37e0 || - || Reference | | 0x37e0 || - || Reference tool fallback IDPS | ||
|- | |- | ||
| 0x37f0 - ... || 0x3650 - ... || Start of | | 0x37f0 - ... || 0x3650 - ... || Start of EID keys | ||
|- | |- | ||
| 0x3ac0 || 0x3870 || AES sbox (16*16 bytes) | | 0x3ac0 || 0x3870 || AES sbox (16*16 bytes) | ||
Line 133: | Line 68: | ||
| 0x3c70 || 0x3a20 || AES inverse sbox (16*16 bytes) | | 0x3c70 || 0x3a20 || AES inverse sbox (16*16 bytes) | ||
|} | |} | ||
=== Functions === | === Functions === | ||
{| class="wikitable" | {| class="wikitable" | ||
! colspan="2" | Address !! rowspan="2" | Name !! rowspan="2" | Parameters !! rowspan="2" | Info | ! colspan="2" | Address !! rowspan="2" | Name !! rowspan="2" | Parameters !! rowspan="2" | Info | ||
|- | |- | ||
! 3.41 | ! ? 3.41 ? !! 355 CEX | ||
|- | |- | ||
| 0x9e0 || || stop_func || unknown || Stops the module execution with various stop codes. | | 0x9e0 || || stop_func || unknown || Stops the module execution with various stop codes. | ||
Line 153: | Line 88: | ||
| 0x1440 || || debug_print || unknown || As the name already states... (this outputs over DMA) | | 0x1440 || || debug_print || unknown || As the name already states... (this outputs over DMA) | ||
|- | |- | ||
| 0x17f0 || || - || - || | | 0x17f0 || || - || - || Part of aes implementation. | ||
|- | |- | ||
| 0x1c48 || || | | 0x1c48 || || - || - || Part of aes implementation. | ||
|- | |- | ||
| 0x1df0 || || | | 0x1df0 || || - || - || Probably part of aes implementation. | ||
|- | |- | ||
| 0x20f0 || || | | 0x20f0 || || - || - || Probably part of aes implementation. | ||
|- | |- | ||
| 0x2300 || || | | 0x2300 || || - || - || Probably part of aes implementation. | ||
|- | |- | ||
| 0x2418 || || | | 0x2418 || || - || - || Part of aes implementation. | ||
|- | |- | ||
| 0x2608 || || | | 0x2608 || || - || - || Part of aes implementation. | ||
|- | |- | ||
| 0x30c0 || || do_dma || ls_addr:$4, dma_effective_addr:$5, size:$6, tag_id:$7, unk0:$8, unk1:$9 || Used to dma data in and out of the isolated module's LS. | | 0x30c0 || || do_dma || ls_addr:$4, dma_effective_addr:$5, size:$6, tag_id:$7, unk0:$8, unk1:$9 || Used to dma data in and out of the isolated module's LS. | ||
Line 171: | Line 106: | ||
| 0x3168 || || write_tag_mask_bit || mask_bit:$4 || Used to set a specific bit in MFC_WrTagMask. | | 0x3168 || || write_tag_mask_bit || mask_bit:$4 || Used to set a specific bit in MFC_WrTagMask. | ||
|} | |} | ||
==== Disasm ==== | ==== Disasm ==== | ||
The complete disassembly is available at [http://pastebin.com/7vArGweJ]. | |||
== Decrypting EID == | ==Decrypting EID== | ||
=== Dumper iso.self === | === Dumper iso.self === | ||
=== Dumper Payload === | === Dumper Payload === | ||
* http://pastie.org/pastes/2101977 | |||
=== Running in aim_spu_module anergistic === | |||
//Partial code modified to run aim_spu_module | |||
* http://pastie.org/2000330 | |||
=== Running aim_spu_module | |||
* | |||