PS3MFW Builder

From PS3 Developer wiki
Jump to navigation Jump to search
PS3MFW Builder v0.2
PS3MFW Builder v0.2 OtherOS++
PS3MFW Builder v0.2 Rebug OtherOS++

Main description[edit | edit source]

Tasks[edit | edit source]

PS3MFW[edit | edit source]

  • PS3MFW *
    • add_license_msg.tcl (0.1) - Add a custom message to the 'New Features' installation screen. Modifies PUP license.xml --license-auto-add-features : Automatically generate the enabled features of PS3MFW --license-features-message : Prefix message to the generated features list --license-message : New Features message (Appears after the license agreement)
    • broken_bluray.tcl (0.2) – Allows you to remove Blu-Ray firmware installation so that the MFW can be installed without a working Blu-Ray drive. This is potentially dangerous if used on a PS3 with a working drive, and should only be used if the drive is broken.
    • change_coldboot_files.tcl (0.2) – Advanced users only: Allows changing the sound played and image shown during the boot process. Caution: If improper files are used, this can cause a “brick” (Currently not working for me maybe it‘s getting fixed in the future).
    • change_devflash_files.tcl
    • change_ssl_cer.tcl (0.2) – Allows changing of SSL certificates.
    • change_theme.tcl (0.2) – Can be used to replace the default "Airbrush" theme with another theme file (.p3t format).
    • change_version.tcl
    • clean_friends.tcl (0.1) - Clean unwanted icons from the XMB Friends Category. Modifies dev_flash/vsh/resource/explore/xmb/category_friends.xml file --clean-friends-avcroom : Remove "Video Chat" icon from the XMB Friends Category --clean-friends-chat : Remove "Chat Room" icon from the XMB Friends Category --clean-friends-message-box : Remove "Message Box" icon from the XMB Friends Category --clean-friends-nas : Remove "My Profile" icon from the XMB Friends Category --clean-friends-new-chat : Remove "New Chat" icon from the XMB Friends Category
    • clean_game.tcl (0.1) - Clean unwanted icons from the XMB Game Category. Modifies dev_flash/vsh/resource/explore/xmb/category_game.xml file --clean-game-gamedata : Remove "Game Data" icon from the XMB Game Category --clean-game-mcutility : Remove "Memory Card Utility (PS/PS2)" icon from the XMB Game Category --clean-game-minis-manual : Remove "Minis Manual" icon from the XMB Game Category --clean-game-sdps3 : Remove "Saved Data Utility (PS3)" icon from the XMB Game Category --clean-game-sdpsp : Remove "Saved Data Utility (minis)" icon from the XMB Game Category --clean-game-trophy : Remove "Trophy Collection" icon from the XMB Game Category --clean-game-welcome : Remove "PlayStation Store" icon from the XMB Game Category
    • tasks/clean_music.tcl (0.1) - Clean unwanted icons from the XMB Music Category. Modifies dev_flash/vsh/resource/explore/xmb/category_music.xml file --clean-music-dlna-device : Remove "Network Media Servers" icon from the XMB Music Category --clean-music-dlna-scan : Remove "Search for Media Servers" icon from the XMB Music Category --clean-music-welcome : Remove "PlayStation Store" icon from the XMB Music Category
    • clean_network.tcl (0.1) - Clean unwanted icons from the XMB Network Category. Modifies dev_flash/vsh/resource/explore/xmb/category_network.xml file --clean-network-browser : Remove "Internet Browser" icon from the XMB Network Category --clean-network-folding-at-home : Remove "Life with PlayStation" icon from the XMB Network Category --clean-network-kensaku : Remove "Internet Search" icon from the XMB Network Category --clean-network-manual : Remove "Online Instruction Manuals" icon from the XMB Network Category --clean-network-premo : Remove "Remote Play" icon from the XMB Network Category
    • clean_photo.tcl (0.1) - Clean unwanted icons from the XMB Photo Category. Modifies dev_flash/vsh/resource/explore/xmb/category_photo.xml file --clean-photo-dlna-device : Remove "Network Media Servers" icon from the XMB Photo Category --clean-photo-dlna-scan : Remove "Search for Media Servers" icon from the XMB Photo Category --clean-photo-hakoniwa : Remove "Photo Gallery" icon from the XMB Photo Category --clean-photo-screenshot : Remove "Screenshot" icon from the XMB Photo Category
    • clean_psn.tcl (0.1) - Clean unwanted icons from the XMB PlayStation Network Category Modifies dev_flash/vsh/resource/explore/xmb/category_psn.xml file --clean-psn-commerce-new : Remove "What's New" icon from the XMB PlayStation Network Category --clean-psn-home : Remove "PlayStation Home" icon from the XMB PlayStation Network Category --clean-psn-regist : Remove "Sign In" icon from the XMB PlayStation Network Category --clean-psn-welcome : Remove "PlayStation Store" icon from the XMB PlayStation Network Category
    • clean_sysconf.tcl
    • clean_tv.tcl
    • clean_video.tcl (0.1) - Clean unwanted icons from the XMB Video Category. Modifies dev_flash/vsh/resource/explore/xmb/category_video.xml file --clean-video-bddata-mgmt : Remove "BD Data Utility" icon from the XMB Video Category --clean-video-dlna-device : Remove "Network Media Servers" icon from the XMB Video Category --clean-video-dlna-scan : Remove "Search for Media Servers" icon from the XMB Video Category --clean-video-editingvideo-mgmt : Remove "Video Editor & Uploader" icon from the XMB Video Category --clean-video-netflix : Remove "Netflix" icon from the XMB Video Category --clean-video-welcome : Remove "PlayStation Store" icon from the XMB Video Category
    • patch_category_game.tcl (0.1) - Add new icons to the XMB Game category. Modifies dev_flash/vsh/resource/explore/xmb/category_game.xml file --patch-package-files : Add "Install Package Files" icon to the XMB Game Category --patch-app-home : Add "/app_home" icon to the XMB Game Category
    • patch_lv1.tcl (0.1) - Patch LV1 hypervisor. Modifies CORE OS lv1.self --patch-lv1-mmap : Allow mapping of any memory area (Needed for LV2 Poke)
    • patch_lv2.tcl (0.1) - Patch LV2 kernel. Modifies CORE OS lv1.self --patch-lv2-peek-poke : Patch to add Peek&Poke system calls to LV2
    • patch_nas_plugin.tcl (0.1) - Patch package installer Modifies dev_flash/vsh/module/nas_plugin.sprx --allow-debug-pkg : Patch to allow installation of debug packages --allow-pseudoretail-pkg : Patch to allow installation of pseudo-retail packages
    • patch_privacy.tcl (0.2) – PS3 collects a large amount of personal information while it’s operating. Additionally personal information is sent to many domain names when internet access is enabled (unrelated to PSN access). This task prevents PS3 from sending any data to the domain names you select.
    • patch_shop.tcl (0.2) – Creates firmware to transform demo PS3s (the units used in stores) into full retail PS3s, without the need for service mode!
    • patch_translations.tcl
    • patch_vsh.tcl (0.1) - Patch Application launcher. Modifies dev_flash/vsh/module/vsh.self --allow-unsigned-app : Patch to allow running of unsigned applications
    • patch_xmb_plugin.tcl
    • spoof_version.tcl (0.2) – Allows changing the firmware version the PS3 appears to be on, similar to the rebug spoofer.

Gitbrew OtherOS++[edit | edit source]

  • Gitbrew OtherOS++ *

Same as 0.2 unless state otherwise below:

  • patch_emer_init.tcl
    • 4 GameOS/OtherOS Sizes: Create GameOS HDD region of size half / quarter / eight of installed HDD or 22GB smaller than default
    • Disable searching for update packages in GAME disc.
  • patch_lv1.tcl
    • peek/poke support (unused lv1 calls 182 and 183)
    • Allow mapping of HTAB with write protection
    • Allow to set all bits of SPE register MFC_SR1 with lv1_set_spe_privilege_state_area_1_register
    • Allow setting data access breakpoints in hypervisor state with lv1_set_dabr
    • Allow ENCDEC IOCTL command 0x85
    • Allow access to all SS services (Needed for ps3dm-utils)
    • Allow access to all services of Indi Info Manager
    • Allow extracting for all package types
    • Allow enabling product mode by using Update Manager Write EPROM
    • Allow deleting of all ENCDEC keys
    • Allow creating/modifying/deleting of repository nodes in any LPAR
    • Disable integrity check in System Manager
    • Allow access to all System Manager services of GameOS
    • Enable GuestOS mode 1 for GameOS
    • Skip ACL checks for all storage devices
    • OtherOS++ support
  • patch_lv2.tcl
    • Patch to add LV1 Peek&Poke system calls to LV2 3.55 (LV1 peek/poke patch necessary)
    • Patch to add LV1 Call system call to LV2 3.55
  • patch_profile.tcl - Increase boot memory size of GameOS (Needed for OtherOS++)
  • spoof_version.tcl - Simplified spoof up to 3.60
  • ps3mfw_base.tcl - Added support for SPP (needed for patch_profile.tcl)

Rebug OtherOS++[edit | edit source]

..


Alternate XMB Languages[edit | edit source]

  • Greek (ErMaK86's Translation for 4.80/4.81)
    • Language Pack: [2]

Guide for adding other translations / building languagepacks[edit | edit source]

This guide will explain you how to translate the XMB and use language_pack.tcl PS3MFW task.

LP structure:

font/name_of_the_font_file_to_replace.TTF
replace/name_of_the_rco_file.xml
edit/name_of_the_rco_file/language_name.xml

1. Create a folder – this will be our working directory.

2. If the language you want to translate XMB to is using unsupported font glyphs, you’ll have to include a modified PS3 font.

How to add glyphs to fonts?
I personally use font creator, open 2 fonts: the one I want to modify, and another one that contains the glyphs that I want to add.
Than all I need to do is to copy & paste the glyphs from one font to the other, and assign any glyph to it’s letter.
  • I modify “SCE-PS3-DH-R-CGB.TTF”, but this should work with any font.
When you finished modifying your font, create the folder “font” inside your working directory, and put you modified font in there.

3. Extract language XML files from RCO files

Here you have two options:
1) Extract them one by one using RCOmage (CLI or GUI).
2) Using LP_RCO to automatically extract language XML files from all RCO files (or writing your own script).
  • For those who doesn’t use LP_RCO:
You should extract only one language file from each RCO file (for example “English.XML”).
name each language file by the RCO file it was extracted from.
Now create a folder named “replace” in your working directory, and place all the extracted language files in it.

4. The translation itself

This is the exhausting stage, where you should just translate any string in the language files you extracted in charter 3.
  • You should translate only the string between the and tags.
You could let Google to translate it for you, but then you’ll have to fix formatting and all Sony’s “special” glyphs (such as the “cross” symbol), and of course to correct all the typos.

5. Packing everything into LP

Use any tar compression tool, and compress the root of your working directory, and named it “name.LP”.

6. The “edit option”:

There is also the “edit” option in language_pack.tcl task, which allow you to fix typos in several RCOs and languages.
Create a folder named “edit” inside you working directory.
Extract the language XML files you want to edit, and put them inside a directory named by the RCO file they extracted from.
Now all you got to do is to edit the language files.

7. All you need now is to build your MFW with your new language pack!

Take attention that you don’t have to include any of those folders inside your LP – include them only if you want to use their function.

source: http://www.ps3hax.net/2011/08/xmb-translation-guide/ (thanks to DanyL for this fine explaination :) )

more Spoof[edit | edit source]

Copypaste and save as spoof_version.tcl in tasks folder (make sure you use proper ps3mfw_base.tcl from 0.2 or unofficial v0.2.1 OtherOS++ and not the glevand or rebug version that reduced/castrated the spoof method):

#!/usr/bin/tclsh
#
# ps3mfw -- PS3 MFW creator
#
# Copyright (C) Anonymous Developers (Code Monkeys)
#
# This software is distributed under the terms of the GNU General Public
# License ("GPL") version 3, as published by the Free Software Foundation.
#

# Priority: 2600
# Description: Spoof firmware build / version

# Option --spoof: Select firmware version to spoof
# Type --spoof: combobox { {1.02 1788 001:CEX-ww 20061021} {1.10 2120 001:CEX-ww 20061109} {1.11 2232 001:CEX-ww 20061121} {1.30 2400 001:CEX-ww 20061205} {1.31 2494 001:CEX-ww 20061212} {1.32 2587 001:CEX-ww 20061218} {1.50 3014 001:CEX-ww 20070119} {1.51 3229 001:CEX-ww 20070201} {1.54 3563 001:CEX-ww 20070222} {1.60 3940 001:CEX-ww 20070321} {1.70 4540 001:CEX-ww 20070416} {1.80 5354 001:CEX-ww 20070523} {1.81 5746 001:CEX-ww 20070612} {1.82 5986 001:CEX-ww 20070624} {1.90 6591 001:CEX-ww 20070721} {1.92 7272 001:CEX-ww 20070828} {1.93 7444 001:CEX-ww 20070909} {1.94 7510 001:CEX-ww 20070912} {2.00 8237 001:CEX-ww 20071030} {2.01 8426 001:CEX-ww 20071115} {2.10 9181 001:CEX-ww 20071215} {2.16 10444 001:CEX-ww 20080131} {2.17 11729 001:CEX-ww 20080303} {2.20 12342 001:CEX-ww 20080317} {2.30 13778 001:CEX-ww 20080411} {2.35 15109 001:CEX-ww 20080512} {2.36 16093 001:CEX-ww 20080605} {2.40 17023 001:CEX-ww 20080625} {2.41 17362 001:CEX-ww 20080704} {3.00 34641 001:CEX-ww 20090829} {2.42 18467 001:CEX-ww 20080723} {2.43 19024 001:CEX-ww 20080903} {2.50 23368 001:CEX-ww 20081011} {2.52 24267 001:CEX-ww 20081028} {2.53 25075 001:CEX-ww 20081117} {2.60 28392 001:CEX-ww 20090116} {2.70 30429 001:CEX-ww 20090326} {2.76 31347 001:CEX-ww 20090427} {2.80 32582 001:CEX-ww 20090616} {3.00 34641 001:CEX-ww 20090829} {3.01 35108 001:CEX-ww 20090910} {3.10 37233 001:CEX-ww 20091113} {3.15 38031 001:CEX-ww 20091206} {3.20 39999 001:CEX-ww 20100128} {3.21 41486 001:CEX-ww 20100320} {3.30 42164 001:CEX-ww 20100414} {3.40 44261 001:CEX-ww 20100623} {3.41 45039 001:CEX-ww 20100721} {3.42 45831 001:CEX-ww 20100901} {3.50 46135 001:CEX-ww 20100913} {3.55 47516 001:CEX-ww 20101127} {3.56 48165 001:CEX-ww 20110125} {3.56 48247 001:CEX-ww 20110129} {3.60 48686 001:CEX-ww 20110304} {3.61 49561 001:CEX-ww 20110428} {3.65 49764 001:CEX-ww 20110513} {3.66 50527 001:CEX-ww 20110616} {3.70 51968 001:CEX-ww 20110805} {3.72 52565 001:CEX-ww 20110914} {3.73 52870 001:CEX-ww 20111004} {4.00 53642 001:CEX-ww 20111122} {4.10 54953 001:CEX-ww 20120206} {4.11 55054 001:CEX-ww 20120211} {4.20 57923 001:CEX-ww 20120615} {4.21 58071 001:CEX-ww 20120630} {4.25 58730 001:CEX-ww 20120907} {4.30 59178 001:CEX-ww 20121018} {4.31 59249 001:CEX-ww 20121027} {4.40 60156 001:CEX-ww 20130315} {4.41 60349 001:CEX-ww 20130419} {4.45 60695 001:CEX-ww 20130531} {4.46 60826 001:CEX-ww 20130620} {4.50 61890 001:CEX-ww 20130914} {4.55 62847 001:CEX-ww 20140129} {4.55 62850 001:CEX-ww 20140129} {4.60 63910 001:CEX-ww 20140618} {4.65 64266 001:CEX-ww 20140813} {4.66 64645 001:CEX-ww 20141113} }

namespace eval ::spoof_version {

    array set ::spoof_version::options {
      --spoof "4.66 64645 001:CEX-ww 20141113"
    }

    proc main {} {
      variable options

      set release [lindex $options(--spoof) 0]
      set build [lindex $options(--spoof) 1]
      set target [lindex $options(--spoof) 2]
      set auth [lindex $options(--spoof) 1]
      set bdate [lindex $options(--spoof) 3]

      if {$release != "" || $build != "" || $target != "" || $auth != ""} {
        log "Changing firmware version.txt & index.dat file"
        ::modify_devflash_file [file join dev_flash vsh etc version.txt] ::spoof_version::version_txt
      }
      if {$build != "" || $auth != ""} {
        log "Patching vsh.self"
        ::modify_devflash_file [file join dev_flash vsh module vsh.self] ::spoof_version::patch_self
      }
      if {$build != "" && $bdate != ""} {
        log "Patching UPL.xml"
        ::modify_upl_file ::spoof_version::upl_xml
      }
    }

    proc patch_self {self} {
      ::modify_self_file $self ::spoof_version::patch_elf
    }

    proc patch_elf {elf} {
      variable options

      set release [lindex $options(--spoof) 0]
      set build [lindex $options(--spoof) 1]

      log "Patching [file tail $elf] to spoof version and build"

      debug "Patching version number"
      set search "99.99"
      debug "search: $search"
      set major [lindex [split $release "."] 0]
      set minor [lindex [split $release "."] 1]
      set replace "[format %0.2d ${major}].[format %0.2d ${minor}]"
      debug "replace: $replace"
      catch_die {::patch_elf $elf $search 0 $replace} "Unable to patch self [file tail $elf]"

      debug "Patching build number"
      set search "[format %0.5d [::get_pup_build]]"
      debug "search: $search"
      set replace "[format %0.5d $build]"
      debug "replace: $replace"
      catch_die {::patch_elf $elf $search 0 $replace} "Unable to patch self [file tail $elf] with [::hexify $replace]"

# debug "Patching 0x31a7c0"
# set search "\x48\x00\x00\x38\xa0\x7f\x00\x04\x39\x60\x00\x01"
# set replace "\x38\x60\x00\x82"
# catch_die {::patch_elf $elf $search 4 $replace} "Unable to patch self [file tail $elf]"

# debug "Patching ..."
# set search "\x4b\xff\xfe\x80\xf8\x21\xff\x81\x7c\x08\x02\xa6\x38\x61\x00\x70"
# set replace "\x38\x60\x00\x01\x4e\x80\x00\x20"
# catch_die {::patch_elf $elf $search 4 $replace} "Unable to patch self [file tail $elf]"

      debug "Patching 0x48d030"
      set search "\xeb\xe1\x00\x80\x38\x21\x00\x90\x7c\x08\x03\xa6\x4e\x80\x00\x20"
      append search "\xf8\x21\xff\x61\x7c\x08\x02\xa6\xfb\xe1\x00\x98\xf8\x01\x00\xb0"
      append search "\x7c\x7f\x1b\x78\x38\x00\x00\x00\x38\x61\x00\x74\xfb\x81\x00\x80"
      set replace "\x38\x60\x00\x00\x4e\x80\x00\x20"
      catch_die {::patch_elf $elf $search 16 $replace} "Unable to patch self [file tail $elf]"
    }

    proc get_fw_release {filename} {
      debug "Getting firmware release from [file tail $filename]"
      set results [grep "^release:" $filename]
      set release [string trim [regsub "^release:" $results {}] ":"]
      return [string trim $release]
    }

    proc get_fw_build {filename} {
      debug "Getting firmware build from [file tail $filename]"
      set results [grep "^build:" $filename]
      set build [string trim [regsub "^build:" $results {}] ":"]
      return [string trim $build]
    }

    proc get_fw_target {filename} {
      debug "Getting firmware target from [file tail $filename]"
      set results [grep "^target:" $filename]
      set target [regsub "^target:" $results {}]
      return [string trim $target]
    }

    proc get_fw_auth {filename} {
      debug "Getting firmware auth from [file tail $filename]"
      set results [grep "^auth:" $filename]
      set auth [string trim [regsub "^auth:" $results {}] ":"]
      return [string trim $auth]
    }

    proc version_txt {filename} {
      variable options

      set release [lindex $options(--spoof) 0]
      set build [lindex $options(--spoof) 1]
      set target [lindex $options(--spoof) 2]
      set auth [lindex $options(--spoof) 1]

      set fd [open $filename r]
      set data [read $fd]
      close $fd

      if {$release != [get_fw_release $filename]} {
        debug "Setting firmware release to $release"
        set major [lindex [split $release "."] 0]
        set minor [lindex [split $release "."] 1]
        set nano "0"
        set data [regsub {release:[0-9]+\.[0-9]+:} $data "release:[format %0.2d ${major}].[format %0.2d ${minor}][format %0.2d ${nano}]:"]
      }

      if {$build != [get_fw_build $filename]} {
        debug "Setting firmware build in to $build"
        set build_num $build
        set build_date [lindex [split [lindex [split [::spoof_version::get_fw_build $filename] ":"] 1] ","] 1]
        set data [regsub {build:[0-9]+,[0-9]+:} $data "build:${build_num},${build_date}:"]
      }

      if {$target != [get_fw_target $filename]} {
        debug "Setting firmware target to $target"
        set target_num [lindex [split $target ":"] 0]
        set target_string [lindex [split $target ":"] 1]
        set data [regsub {target:[0-9]+:[A-Z]+-ww} $data "target:${target_num}:${target_string}"]
      }

      if {$auth != [get_fw_auth $filename]} {
        debug "Setting firmware auth to $auth"
        set data [regsub {auth:[0-9]+:} $data "auth:$auth:"]
      }

      set fd [open $filename w]
      puts -nonewline $fd $data
      close $fd

      set index_dat [file join [file dirname $filename] index.dat]
      shell "dat" [file nativename $filename] [file nativename $index_dat]
    }

    proc upl_xml {filename} {
      variable options

      set release [lindex $options(--spoof) 0]
      set build [lindex $options(--spoof) 1]
      set bdate [lindex $options(--spoof) 3]
      set major [lindex [split $release "."] 0]
      set minor [lindex [split $release "."] 1]
      set nano "0"

      debug "Setting UPL.xml.pkg :: release to ${release} :: build to ${build},${bdate}"

      set search [::get_header_key_upl_xml $filename Version Version]
      set replace "[format %0.2d ${major}].[format %0.2d ${minor}][format %0.2d ${nano}]:"
      if { $search != "" && $search != $replace } {
        set xml [::set_header_key_upl_xml $filename Version "${replace}" Version]
        if { $xml == "" } {
          die "spoof failed:: search: $search :: replace: $replace"
        }
      }

      set search [::get_header_key_upl_xml $filename Build Build]
      set replace "${build},${bdate}"
      if { $search != "" && $search != $replace } {
        set xml [::set_header_key_upl_xml $filename Build "${replace}" Build]
        if { $xml == "" } {
          die "spoof failed:: search: $search :: replace: $replace"
        }
      }

      if {$::change_version::options(--pup-build) == ""} {
        ::set_pup_build [incr build]
      }
    }
}

Note: there is good reason for including the date and not ommitting it like the simplified spoof as in gitbrew and danyL versions.

more GameOS/OtherOS++ sizes[edit | edit source]

Copypaste and save as patch_emer_init.tcl in tasks folder:

#!/usr/bin/tclsh
#
# ps3mfw -- PS3 MFW creator
#
# Copyright (C) Anonymous Developers (Code Monkeys)
# Copyright (C) glevand ([email protected])
#
# This software is distributed under the terms of the GNU General Public
# License ("GPL") version 3, as published by the Free Software Foundation.
#
 
# Priority: 300
# Description: Patch emergency init application
 
# Option --patch-pup-search-in-game-disc: Disable searching for update packages in GAME disc
# Option --patch-gameos-hdd-region-size: Create GameOS HDD region smaller than default
 
# Type --patch-pup-search-in-game-disc: boolean
# Type --patch-gameos-hdd-region-size: combobox {{1/eighth of drive} {1/quarter of drive} {1/half of drive} {22GB} {10GB} {20GB} {30GB} {40GB} {50GB} {60GB} {70GB} {80GB} {90GB} {100GB} {110GB} {120GB} {130GB} {140GB} {150GB} {160GB} {170GB} {180GB} {190GB} {200GB} {210GB} {220GB} {230GB} {240GB} {250GB} {260GB} {270GB} {280GB} {290GB} {300GB} {310GB} {320GB} {330GB} {340GB} {350GB} {360GB} {370GB} {380GB} {390GB} {400GB} {410GB} {420GB} {430GB} {440GB} {450GB} {460GB} {470GB} {480GB} {490GB} {500GB} {510GB} {520GB} {530GB} {540GB} {550GB} {560GB} {570GB} {580GB} {590GB} {600GB} {610GB} {620GB} {630GB} {640GB} {650GB} {660GB} {670GB} {680GB} {690GB} {700GB} {710GB} {720GB} {730GB} {740GB} {750GB} {760GB} {770GB} {780GB} {790GB} {800GB} {810GB} {820GB} {830GB} {840GB} {850GB} {860GB} {870GB} {880GB} {890GB} {900GB} {910GB} {920GB} {930GB} {940GB} {950GB} {960GB} {970GB} {980GB} {990GB} {1000GB}}
 
namespace eval ::patch_emer_init {
 
    array set ::patch_emer_init::options {
        --patch-pup-search-in-game-disc false
        --patch-gameos-hdd-region-size "1/quarter"
    }
 
    proc main {} {
        set self "emer_init.self"
 
        ::modify_coreos_file $self ::patch_emer_init::patch_self
    }
 
    proc patch_self {self} {
        ::modify_self_file $self ::patch_emer_init::patch_elf
    }
 
    proc patch_elf {elf} {
        variable options
        set size $options(--patch-gameos-hdd-region-size)
        set pup $options(--patch-pup-search-in-game-disc)
 
        if {$size != ""} {
            log "Patching [file tail $elf] to create GameOS HDD region of size $size of installed HDD"
 
            set search    "\xe9\x21\x00\xa0\x79\x4a\x00\x20\xe9\x1b\x00\x00\x38\x00\x00\x00"
            append search "\x7d\x26\x48\x50\x7d\x49\x03\xa6\x39\x40\x00\x00\x38\xe9\xff\xf8"
 
            if {[string equal ${size} "1/eighth of drive"] == 1} {
                set replace "\x79\x27\xe8\xc2"
            } elseif {[string equal ${size} "1/quarter of drive"] == 1} {
                set replace "\x79\x27\xf0\x82"
            } elseif {[string equal ${size} "1/half of drive"] == 1} {
                set replace "\x79\x27\xf8\x42"
            } elseif {[string equal ${size} "22GB"] == 1} {
                set replace "\x3c\xe9\xfd\x40"
            } elseif {[string equal ${size} "10GB"] == 1} {
                set replace "\x3c\xe9\xfe\xc0"
            } elseif {[string equal ${size} "20GB"] == 1} {
                set replace "\x3c\xe9\xfd\x80"
            } elseif {[string equal ${size} "30GB"] == 1} {
                set replace "\x3c\xe9\xfc\x40"
            } elseif {[string equal ${size} "40GB"] == 1} {
                set replace "\x3c\xe9\xfb\x00"
            } elseif {[string equal ${size} "50GB"] == 1} {
                set replace "\x3c\xe9\xf9\xc0"
            } elseif {[string equal ${size} "60GB"] == 1} {
                set replace "\x3c\xe9\xf8\x80"
            } elseif {[string equal ${size} "70GB"] == 1} {
                set replace "\x3c\xe9\xf7\x40"
            } elseif {[string equal ${size} "80GB"] == 1} {
                set replace "\x3c\xe9\xf6\x00"
            } elseif {[string equal ${size} "90GB"] == 1} {
                set replace "\x3c\xe9\xf4\xc0"
            } elseif {[string equal ${size} "100GB"] == 1} {
                set replace "\x3c\xe9\xf3\x80"
            } elseif {[string equal ${size} "110GB"] == 1} {
                set replace "\x3c\xe9\xf2\x40"
            } elseif {[string equal ${size} "120GB"] == 1} {
                set replace "\x3c\xe9\xf1\x00"
            } elseif {[string equal ${size} "130GB"] == 1} {
                set replace "\x3c\xe9\xef\xc0"
            } elseif {[string equal ${size} "140GB"] == 1} {
                set replace "\x3c\xe9\xee\x80"
            } elseif {[string equal ${size} "150GB"] == 1} {
                set replace "\x3c\xe9\xed\x40"
            } elseif {[string equal ${size} "160GB"] == 1} {
                set replace "\x3c\xe9\xec\x00"
            } elseif {[string equal ${size} "170GB"] == 1} {
                set replace "\x3c\xe9\xea\xc0"
            } elseif {[string equal ${size} "180GB"] == 1} {
                set replace "\x3c\xe9\xe9\x80"
            } elseif {[string equal ${size} "190GB"] == 1} {
                set replace "\x3c\xe9\xe8\x40"
            } elseif {[string equal ${size} "200GB"] == 1} {
                set replace "\x3c\xe9\xe7\x00"
            } elseif {[string equal ${size} "210GB"] == 1} {
                set replace "\x3c\xe9\xe5\xc0"
            } elseif {[string equal ${size} "220GB"] == 1} {
                set replace "\x3c\xe9\xe4\x80"
            } elseif {[string equal ${size} "230GB"] == 1} {
                set replace "\x3c\xe9\xe3\x40"
            } elseif {[string equal ${size} "240GB"] == 1} {
                set replace "\x3c\xe9\xe2\x00"
            } elseif {[string equal ${size} "250GB"] == 1} {
                set replace "\x3c\xe9\xe0\xc0"
            } elseif {[string equal ${size} "260GB"] == 1} {
                set replace "\x3c\xe9\xdf\x80"
            } elseif {[string equal ${size} "270GB"] == 1} {
                set replace "\x3c\xe9\xde\x40"
            } elseif {[string equal ${size} "280GB"] == 1} {
                set replace "\x3c\xe9\xdd\x00"
            } elseif {[string equal ${size} "290GB"] == 1} {
                set replace "\x3c\xe9\xdb\xc0"
            } elseif {[string equal ${size} "300GB"] == 1} {
                set replace "\x3c\xe9\xda\x80"
            } elseif {[string equal ${size} "310GB"] == 1} {
                set replace "\x3c\xe9\xd9\x40"
            } elseif {[string equal ${size} "320GB"] == 1} {
                set replace "\x3c\xe9\xd8\x00"
            } elseif {[string equal ${size} "330GB"] == 1} {
                set replace "\x3c\xe9\xd6\xc0"
            } elseif {[string equal ${size} "340GB"] == 1} {
                set replace "\x3c\xe9\xd5\x80"
            } elseif {[string equal ${size} "350GB"] == 1} {
                set replace "\x3c\xe9\xd4\x40"
            } elseif {[string equal ${size} "360GB"] == 1} {
                set replace "\x3c\xe9\xd3\x00"
            } elseif {[string equal ${size} "370GB"] == 1} {
                set replace "\x3c\xe9\xd1\xc0"
            } elseif {[string equal ${size} "380GB"] == 1} {
                set replace "\x3c\xe9\xd0\x80"
            } elseif {[string equal ${size} "390GB"] == 1} {
                set replace "\x3c\xe9\xcf\x40"
            } elseif {[string equal ${size} "400GB"] == 1} {
                set replace "\x3c\xe9\xce\x00"
            } elseif {[string equal ${size} "410GB"] == 1} {
                set replace "\x3c\xe9\xcc\xc0"
            } elseif {[string equal ${size} "420GB"] == 1} {
                set replace "\x3c\xe9\xcb\x80"
            } elseif {[string equal ${size} "430GB"] == 1} {
                set replace "\x3c\xe9\xca\x40"
            } elseif {[string equal ${size} "440GB"] == 1} {
                set replace "\x3c\xe9\xc9\x00"
            } elseif {[string equal ${size} "450GB"] == 1} {
                set replace "\x3c\xe9\xc7\xc0"
            } elseif {[string equal ${size} "460GB"] == 1} {
                set replace "\x3c\xe9\xc6\x80"
            } elseif {[string equal ${size} "470GB"] == 1} {
                set replace "\x3c\xe9\xc5\x40"
            } elseif {[string equal ${size} "480GB"] == 1} {
                set replace "\x3c\xe9\xc4\x00"
            } elseif {[string equal ${size} "490GB"] == 1} {
                set replace "\x3c\xe9\xc2\xc0"
            } elseif {[string equal ${size} "500GB"] == 1} {
                set replace "\x3c\xe9\xc1\x80"
            } elseif {[string equal ${size} "510GB"] == 1} {
                set replace "\x3c\xe9\xc0\x40"
            } elseif {[string equal ${size} "520GB"] == 1} {
                set replace "\x3c\xe9\xbf\x00"
            } elseif {[string equal ${size} "530GB"] == 1} {
                set replace "\x3c\xe9\xbd\xc0"
            } elseif {[string equal ${size} "540GB"] == 1} {
                set replace "\x3c\xe9\xbc\x80"
            } elseif {[string equal ${size} "550GB"] == 1} {
                set replace "\x3c\xe9\xbb\x40"
            } elseif {[string equal ${size} "560GB"] == 1} {
                set replace "\x3c\xe9\xba\x00"
            } elseif {[string equal ${size} "570GB"] == 1} {
                set replace "\x3c\xe9\xb8\xc0"
            } elseif {[string equal ${size} "580GB"] == 1} {
                set replace "\x3c\xe9\xb7\x80"
            } elseif {[string equal ${size} "590GB"] == 1} {
                set replace "\x3c\xe9\xb6\x40"
            } elseif {[string equal ${size} "600GB"] == 1} {
                set replace "\x3c\xe9\xb5\x00"
            } elseif {[string equal ${size} "610GB"] == 1} {
                set replace "\x3c\xe9\xb3\xc0"
            } elseif {[string equal ${size} "620GB"] == 1} {
                set replace "\x3c\xe9\xb2\x80"
            } elseif {[string equal ${size} "630GB"] == 1} {
                set replace "\x3c\xe9\xb1\x40"
            } elseif {[string equal ${size} "640GB"] == 1} {
                set replace "\x3c\xe9\xb0\x00"
            } elseif {[string equal ${size} "650GB"] == 1} {
                set replace "\x3c\xe9\xae\xc0"
            } elseif {[string equal ${size} "660GB"] == 1} {
                set replace "\x3c\xe9\xad\x80"
            } elseif {[string equal ${size} "670GB"] == 1} {
                set replace "\x3c\xe9\xac\x40"
            } elseif {[string equal ${size} "680GB"] == 1} {
                set replace "\x3c\xe9\xab\x00"
            } elseif {[string equal ${size} "690GB"] == 1} {
                set replace "\x3c\xe9\xa9\xc0"
            } elseif {[string equal ${size} "700GB"] == 1} {
                set replace "\x3c\xe9\xa8\x80"
            } elseif {[string equal ${size} "710GB"] == 1} {
                set replace "\x3c\xe9\xa7\x40"
            } elseif {[string equal ${size} "720GB"] == 1} {
                set replace "\x3c\xe9\xa6\x00"
            } elseif {[string equal ${size} "730GB"] == 1} {
                set replace "\x3c\xe9\xa4\xc0"
            } elseif {[string equal ${size} "740GB"] == 1} {
                set replace "\x3c\xe9\xa3\x80"
            } elseif {[string equal ${size} "750GB"] == 1} {
                set replace "\x3c\xe9\xa2\x40"
            } elseif {[string equal ${size} "760GB"] == 1} {
                set replace "\x3c\xe9\xa1\x00"
            } elseif {[string equal ${size} "770GB"] == 1} {
                set replace "\x3c\xe9\x9f\xc0"
            } elseif {[string equal ${size} "780GB"] == 1} {
                set replace "\x3c\xe9\x9e\x80"
            } elseif {[string equal ${size} "790GB"] == 1} {
                set replace "\x3c\xe9\x9d\x40"
            } elseif {[string equal ${size} "800GB"] == 1} {
                set replace "\x3c\xe9\x9c\x00"
            } elseif {[string equal ${size} "810GB"] == 1} {
                set replace "\x3c\xe9\x9a\xc0"
            } elseif {[string equal ${size} "820GB"] == 1} {
                set replace "\x3c\xe9\x99\x80"
            } elseif {[string equal ${size} "830GB"] == 1} {
                set replace "\x3c\xe9\x98\x40"
            } elseif {[string equal ${size} "840GB"] == 1} {
                set replace "\x3c\xe9\x97\x00"
            } elseif {[string equal ${size} "850GB"] == 1} {
                set replace "\x3c\xe9\x95\xc0"
            } elseif {[string equal ${size} "860GB"] == 1} {
                set replace "\x3c\xe9\x94\x80"
            } elseif {[string equal ${size} "870GB"] == 1} {
                set replace "\x3c\xe9\x93\x40"
            } elseif {[string equal ${size} "880GB"] == 1} {
                set replace "\x3c\xe9\x92\x00"
            } elseif {[string equal ${size} "890GB"] == 1} {
                set replace "\x3c\xe9\x90\xc0"
            } elseif {[string equal ${size} "900GB"] == 1} {
                set replace "\x3c\xe9\x8f\x80"
            } elseif {[string equal ${size} "910GB"] == 1} {
                set replace "\x3c\xe9\x8e\x40"
            } elseif {[string equal ${size} "920GB"] == 1} {
                set replace "\x3c\xe9\x8d\x00"
            } elseif {[string equal ${size} "930GB"] == 1} {
                set replace "\x3c\xe9\x8b\xc0"
            } elseif {[string equal ${size} "940GB"] == 1} {
                set replace "\x3c\xe9\x8a\x80"
            } elseif {[string equal ${size} "950GB"] == 1} {
                set replace "\x3c\xe9\x89\x40"
            } elseif {[string equal ${size} "960GB"] == 1} {
                set replace "\x3c\xe9\x88\x00"
            } elseif {[string equal ${size} "970GB"] == 1} {
                set replace "\x3c\xe9\x86\xc0"
            } elseif {[string equal ${size} "980GB"] == 1} {
                set replace "\x3c\xe9\x85\x80"
            } elseif {[string equal ${size} "990GB"] == 1} {
                set replace "\x3c\xe9\x84\x40"
            } elseif {[string equal ${size} "1000GB"] == 1} {
                set replace "\x3c\xe9\x83\x00"
            }
 
            catch_die {::patch_elf $elf $search 28 $replace} \
                "Unable to patch self [file tail $elf]"
        }
 
        if {$pup} {
            log "Patching [file tail $elf] to disable searching for update packages in GAME disc"
 
            set search  "\x80\x01\x00\x74\x2f\x80\x00\x00\x40\x9e\x00\x14\x7f\xa3\xeb\x78"
            set replace "\x38\x00\x00\x01"
 
            catch_die {::patch_elf $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
}

broken_bluetooth task[edit | edit source]

save as broken_bluetooth.tcl in task folder

Allows you to remove Bluetooth firmware installation so that the MFW can be installed without a working Bluetooth board (circumventing errorcode 0x8002F1F9). This is potentially dangerous if used on a PS3 with a working BT/Wifi board, and should only be used if the BT/Wifi is broken (or abcent, like on Arcade consoles).

#!/usr/bin/tclsh
#
# ps3mfw -- PS3 MFW creator
#
# Copyright (C) Anonymous Developers (Code Monkeys)
#
# This software is distributed under the terms of the GNU General Public
# License ("GPL") version 3, as published by the Free Software Foundation.
#
    
# Priority: 2100
# Description: Allow firmware update of console with broken bluetooth
    
# Option --remove-bt-firmware: remove Bluetooth firmware (ENABLING THIS WILL REMOVE BLUETOOTH FIRMWARE)

# Type --remove-bt-firmware: boolean

namespace eval ::broken_bluetooth {

    array set ::broken_bluetooth::options {
        --remove-bt-firmware false
    }
    
    proc main {} {
        ::modify_upl_file ::broken_bluetooth::callback
    }
    
    proc callback { file } {
        log "Modifying XML file [file tail ${file}]"
    
        if {[package provide Tk] != "" } {
           tk_messageBox -default ok -message "Removing bluetooth firmware packages press ok to continue" -icon warning
        }

        set xml [::xml::LoadFile $file]

        if {$::broken_bluetooth::options(--remove-bt-firmware)} {
          set xml [::remove_pkgs_from_upl_xml $xml "BT" "bluetooth firmware"]
        }
    
        ::xml::SaveToFile $xml $file
    }
}

Patch package installer for older (2.70) version support[edit | edit source]

save as patch_nas_plugin.tcl in task folder and only select 1 allow-debug-pkg or allow-debug-pkg-270 subtask at the same time, depending on target firmware.

#!/usr/bin/tclsh
#
# ps3mfw -- PS3 MFW creator
#
# Copyright (C) Anonymous Developers (Code Monkeys)
#
# This software is distributed under the terms of the GNU General Public
# License ("GPL") version 3, as published by the Free Software Foundation.
#

# Priority: 500
# Description: Patch package installer

# Option --allow-pseudoretail-pkg: Patch to allow installation of pseudo-retail packages
# Option --allow-debug-pkg: Patch to allow installation of debug packages
# Option --allow-debug-pkg-270: Patch to allow installation of debug packages (old versions, like 2.70)

# Type --allow-pseudoretail-pkg: boolean
# Type --allow-debug-pkg: boolean
# Type --allow-debug-pkg-270: boolean

namespace eval ::patch_nas_plugin {

    array set ::patch_nas_plugin::options {
        --allow-pseudoretail-pkg true
        --allow-debug-pkg true
        --allow-debug-pkg-270 false
    }

    proc main {} {
        set self [file join dev_flash vsh module nas_plugin.sprx]

        ::modify_devflash_file $self ::patch_nas_plugin::patch_self
    }

    proc patch_self { self } {
        if {!$::patch_nas_plugin::options(--allow-pseudoretail-pkg)} {
            log "WARNING: Enabled task has no enabled option" 1
        } elseif {!$::patch_nas_plugin::options(--allow-debug-pkg)} {
            log "WARNING: Enabled task 'patch_nas_plugin --allow-debug-pkg' has no enabled option" 1
        } elseif {!$::patch_nas_plugin::options(--allow-debug-pkg-270)} {
            log "WARNING: Enabled task 'patch_nas_plugin --allow-debug-pkg-270' has no enabled option" 1          
        } else {
            ::modify_self_file $self ::patch_nas_plugin::patch_elf
        }
    }

    proc patch_elf { elf } {
        if {$::patch_nas_plugin::options(--allow-pseudoretail-pkg) } {
            log "Patching [file tail $elf] to allow pseudo-retail pkg installs"

            set search "\x7c\x60\x1b\x78\xf8\x1f\x01\x80"
            set replace "\x38\x00\x00\x00"

            catch_die {::patch_elf $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }

        if {$::patch_nas_plugin::options(--allow-debug-pkg) } {
            log "Patching [file tail $elf] to allow debug pkg installs"

            set search "\x2f\x89\x00\x00\x41\x9e\x00\x4c\x38\x00\x00\x00"
            set replace "\x60\x00\x00\x00"

            catch_die {::patch_elf $elf $search 4 $replace} \
                "Unable to patch self [file tail $elf]"
        }
        
        if {$::patch_nas_plugin::options(--allow-debug-pkg-270) } {
            log "Patching [file tail $elf] to allow debug pkg installs"

            set search "\x2f\x89\x00\x00\x41\x9e\x00\x70\x38\x00\x00\x00"
            set replace "\x60\x00\x00\x00"

            catch_die {::patch_elf $elf $search 4 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
}

http://pastie.org/3901935

disable epilepsy warning[edit | edit source]

Copypaste and save as patch_epilepsy.tcl

#!/usr/bin/tclsh
#
# ps3mfw -- PS3 MFW creator
#
# Copyright (C) Anonymous Developers (Code Monkeys)
# Copyright (C) Ezio (For adding disabler for epilepsy message!)
# Copyright (C) mysis (For reversing and patches!)
#
# This software is distributed under the terms of the GNU General Public
# License ("GPL") version 3, as published by the Free Software Foundation.
#

# Priority: 2
# Description: [4.xx] Patch to disable epilepsy message

# Option --patch-epilepsy-cex: [4.xx] Patch to disable the epilepsy message on cex cfw!
# Option --patch-epilepsy-dex: [4.xx] Patch to disable the epilepsy message on dex cfw!
# Option --patch-epilepsy-rebug: [4.xx] Patch to disable the epilepsy message on rebug cfw!

# Type --patch-epilepsy-cex: boolean
# Type --patch-epilepsy-dex: boolean
# Type --patch-epilepsy-rebug: boolean

namespace eval ::patch_epilepsy {

    array set ::patch_epilepsy::options {
        --patch-epilepsy-cex true
		--patch-epilepsy-dex false
		--patch-epilepsy-rebug false
    }

    proc main { } {
		variable options

        if {$::patch_epilepsy::options(--patch-epilepsy-cex)} {
            set selfs {vsh.self}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_epilepsy::patch_epilepsy_cex_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_epilepsy::patch_epilepsy_cex_self
			}
		}
        if {$::patch_epilepsy::options(--patch-epilepsy-dex)} {
            set selfs {vsh.self}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_epilepsy::patch_epilepsy_dex_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_epilepsy::patch_epilepsy_dex_self
			}
		}
		if {$::patch_epilepsy::options(--patch-epilepsy-rebug)} {
            set selfs1 {vsh.self vsh.self.swp}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs1 ::patch_epilepsy::patch1_epilepsy_rebug_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs1 ::patch_epilepsy::patch1_epilepsy_rebug_self
			}
			set selfs2 {vsh.self.cexsp}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs2 ::patch_epilepsy::patch2_epilepsy_rebug_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs2 ::patch_epilepsy::patch2_epilepsy_rebug_self
			}
		}
    }
	
	proc patch_epilepsy_cex_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_epilepsy::patch_epilepsy_cex_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_epilepsy::patch_epilepsy_cex_elf
			}
    }
    proc patch_epilepsy_cex_elf {elf} {
        if {$::patch_epilepsy::options(--patch-epilepsy-cex)} {
            log "Patching [file tail $elf] to disable epilepsy message on cex cfw"
			log "Added by Ezio"
            set search  "\x00\x00\x00\x02\x00\x00\x00\x01\x02\x01\x01\x01\xff\xff\xff\xff"
			set replace "\x00\x00\x00\x02\x00\x00\x00\x01\x02\x00\x01\x01\xff\xff\xff\xff"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
	
	proc patch_epilepsy_dex_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_epilepsy::patch_epilepsy_dex_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_epilepsy::patch_epilepsy_dex_elf
			}
    }
    proc patch_epilepsy_dex_elf {elf} {
        if {$::patch_epilepsy::options(--patch-epilepsy-dex)} {
            log "Patching [file tail $elf] to disable epilepsy message on dex cfw"
			log "Added by Ezio"
			set search  "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x00\xff\xff\xff\xff"
			set replace "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\xff\xff\xff\xff"
            catch_die {::patch_elf $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
	
	proc patch1_epilepsy_rebug_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_epilepsy::patch1_epilepsy_rebug_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_epilepsy::patch1_epilepsy_rebug_elf
			}
    }
    proc patch1_epilepsy_rebug_elf {elf} {
        if {$::patch_epilepsy::options(--patch-epilepsy-rebug)} {
            log "Patching [file tail $elf] to disable epilepsy message on rebug cfw"
			log "Added by Ezio"
			set search  "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x00\xff\xff\xff\xff"
			set replace "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\xff\xff\xff\xff"
            catch_die {::patch_elf $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
	
	proc patch2_epilepsy_rebug_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_epilepsy::patch2_epilepsy_rebug_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_epilepsy::patch2_epilepsy_rebug_elf
			}
    }
    proc patch2_epilepsy_rebug_elf {elf} {
        if {$::patch_epilepsy::options(--patch-epilepsy-rebug)} {
            log "Patching [file tail $elf] to disable epilepsy message on rebug cfw"
			log "Added by Ezio"
			set search  "\x00\x00\x00\x02\x00\x00\x00\x01\x02\x01\x01\x01\xff\xff\xff\xff"
			set replace "\x00\x00\x00\x02\x00\x00\x00\x01\x02\x00\x01\x01\xff\xff\xff\xff"
            catch_die {::patch_elf $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
}

http://www.psdevwiki.com/ps3/Patches#disable_epilepsy_message

http://www.psx-place.com/forum/ps3-news/4-75-cfw-ferrox-standard-cex-alexander-2075-7.html#post15999

https://www.sendspace.com/file/c8sj2z

http://pastebin.com/NULiKT5j

Patch all self/sprx to secure privacy[edit | edit source]

Copypaste and save as patch_privacy_all.tcl

#!/usr/bin/tclsh
#
# ps3mfw -- PS3 MFW creator
#
# Copyright (C) Anonymous Developers (Code Monkeys)
#
# This software is distributed under the terms of the GNU General Public
# License ("GPL") version 3, as published by the Free Software Foundation.
#

# Modified and fixed by Ezio

# Priority: 105
# Description: Patch all self/sprx to secure privacy

# Option --patch-playstati0n-net: Patch additional communication with playstation.net - [Warning]: use it only on 3.40-3.66 fw
# Option --patch-playstation-net: Patch all communications with playstation.net
# Option --patch-playstation-org: Patch all communications with playstation.org
# Option --patch-sony-com: Patch all communications with sony.com - [Warning]: use it only on 3.40-4.11 fw
# Option --patch-sony-co-jp: Patch all communications with sony.co.jp - [Warning]: use it only on 4.50 and lower fw
# Option --patch-bitwallet: Patch all communications with bitwallet.co.jp
# Option --patch-qriocity: Patch all communications with qriocity.com - [Warning]: use it only on 3.10-4.26 fw
# Option --patch-trendmicro: Patch all communications with trendmicro.com
# Option --patch-allmusic: Patch all communications with allmusic.com
# Option --patch-intertrust: Patch all communications with intertrust.com
# Option --patch-marlin-drm: Patch all communications with marlin-drm.com
# Option --patch-marlin-tmo: Patch all communications with marlin-tmo.com
# Option --patch-oasis-open: Patch all communications with oasis-open.org
# Option --patch-octopus-drm: Patch all communications with octopus-drm.com
# Option --patch-facebook: Patch all communications with facebook.com
# Option --patch-dtcp: Patch all communications with dtcp.com
# Option --patch-purl: Patch all communications with purl.org 
# Option --patch-xmlsoap: Patch all communications with xmlsoap.org 

# Type --patch-playstati0n-net: boolean
# Type --patch-playstation-net: boolean
# Type --patch-playstation-org: boolean
# Type --patch-sony-com: boolean
# Type --patch-sony-co-jp: boolean
# Type --patch-bitwallet: boolean
# Type --patch-qriocity: boolean
# Type --patch-trendmicro: boolean
# Type --patch-allmusic: boolean
# Type --patch-intertrust: boolean
# Type --patch-marlin-drm: boolean
# Type --patch-marlin-tmo: boolean
# Type --patch-oasis-open: boolean
# Type --patch-octopus-drm: boolean
# Type --patch-facebook: boolean
# Type --patch-dtcp: boolean
# Type --patch-purl: boolean
# Type --patch-xmlsoap: boolean

namespace eval ::patch_privacy_all {

    array set ::patch_privacy_all::options {
        --patch-allmusic true
        --patch-bitwallet true
		--patch-dtcp true
		--patch-facebook true
        --patch-intertrust true
        --patch-marlin-drm true
        --patch-marlin-tmo true
        --patch-oasis-open true
        --patch-octopus-drm true
        --patch-playstation-net true
		--patch-playstati0n-net false
        --patch-playstation-org true
		--patch-purl true
        --patch-qriocity false
        --patch-sony-com false
		--patch-sony-co-jp false
        --patch-trendmicro true
		--patch-xmlsoap true
    }

    proc main { } {
		variable options

        if {$::patch_privacy_all::options(--patch-allmusic)} {
            set selfs {x3_amgsdk.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_allmusic_com_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_allmusic_com_self
			}
		}
        if {$::patch_privacy_all::options(--patch-bitwallet)} {
            set selfs {edy_plugin.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_bitwallet_co_jp_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_bitwallet_co_jp_self
			}
		}
		if {$::patch_privacy_all::options(--patch-dtcp)} {
            set selfs {mintx_client.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_dtcp_com_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_dtcp_com_self
			}
		}
		if {$::patch_privacy_all::options(--patch-facebook)} {
            set selfs {eula_net_plugin.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_facebook_com_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_facebook_com_self
			}
		}
        if {$::patch_privacy_all::options(--patch-intertrust)} {
            set selfs {mcore.self msmw2.sprx}
            if { ${::OLDROUTINE} == "1" } {
		    ::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_intertrust_com_self
            } elseif { ${::OLDROUTINE} == "0" } {
	        ::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_intertrust_com_self
			}
		}
        if {$::patch_privacy_all::options(--patch-marlin-drm)} {
            set selfs {mcore.self}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_marlin_drm_com_self
            } elseif { ${::OLDROUTINE} == "0" } {
		    ::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_marlin_drm_com_self
			}
		}
        if {$::patch_privacy_all::options(--patch-marlin-tmo)} {
            set selfs {mcore.self msmw2.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_marlin_tmo_com_self
            } elseif { ${::OLDROUTINE} == "0" } {
		    ::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_marlin_tmo_com_self
			}
		}
        if {$::patch_privacy_all::options(--patch-oasis-open)} {
            set selfs {mcore.self msmw2.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_oasis_open_org_self
            } elseif { ${::OLDROUTINE} == "0" } {
		    ::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_oasis_open_org_self
			}
		}
        if {$::patch_privacy_all::options(--patch-octopus-drm)} {
            set selfs {mcore.self msmw2.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_octopus_drm_com_self
            } elseif { ${::OLDROUTINE} == "0" } {
		    ::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_octopus_drm_com_self
			}
		}
		if {$::patch_privacy_all::options(--patch-playstati0n-net)} {
        set selfs {sysconf_plugin.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch0_playstation_net_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch0_playstation_net_self
			}
		}
        if {$::patch_privacy_all::options(--patch-playstation-net)} {
        set selfs1 {libad_core.sprx libmedi.sprx libsysutil_np_commerce2.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash sys external] $selfs1 ::patch_privacy_all::patch1_playstation_net_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash sys external] $selfs1 ::patch_privacy_all::patch1_playstation_net_self
			}
        set selfs2 {game_ext_plugin.sprx np_eula_plugin.sprx photo_network_sharing_plugin.sprx x3_mdimp11.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs2 ::patch_privacy_all::patch1_playstation_net_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs2 ::patch_privacy_all::patch1_playstation_net_self
			}
		}
		if {$::patch_privacy_all::options(--patch-playstation-net)} {
        set selfs1 {libsysutil_np_clans.sprx libsysutil_np_util.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash sys external] $selfs1 ::patch_privacy_all::patch2_playstation_net_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash sys external] $selfs1 ::patch_privacy_all::patch2_playstation_net_self
			}
        set selfs2 {autodownload_plugin.sprx download_plugin.sprx esehttp.sprx eula_cddb_plugin.sprx eula_hcopy_plugin.sprx eula_net_plugin.sprx explore_category_friend.sprx explore_category_game.sprx explore_category_music.sprx explore_category_network.sprx explore_category_photo.sprx explore_category_psn.sprx explore_category_sysconf.sprx explore_category_tv.sprx explore_category_user.sprx explore_category_video.sprx explore_plugin.sprx explore_plugin_ft.sprx explore_plugin_np.sprx friendtrophy_plugin.sprx hknw_plugin.sprx nas_plugin.sprx newstore_plugin.sprx np_trophy_plugin.sprx np_trophy_util.sprx profile_plugin.sprx regcam_plugin.sprx videoeditor_plugin.sprx videoplayer_plugin.sprx videoplayer_util.sprx vsh.self x3_mdimp7.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs2 ::patch_privacy_all::patch2_playstation_net_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs2 ::patch_privacy_all::patch2_playstation_net_self
			}
		}
        if {$::patch_privacy_all::options(--patch-playstation-org)} {
            set selfs {netconf_plugin.sprx sysconf_plugin.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_playstation_org_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_playstation_org_self
			}
		}
		if {$::patch_privacy_all::options(--patch-purl)} {
            set selfs {mintx_client.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_purl_org_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_purl_org_self
			}
		}
        if {$::patch_privacy_all::options(--patch-qriocity)} {
            set selfs {regcam_plugin.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_qriocity_com_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_qriocity_com_self
			}
		}
        if {$::patch_privacy_all::options(--patch-sony-com)} {
            set selfs {eula_net_plugin.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_sony_com_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_sony_com_self
			}
		}
        if {$::patch_privacy_all::options(--patch-sony-co-jp)} {
            set selfs {videodownloader_plugin.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_sony_co_jp_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_sony_co_jp_self
			}
		}
        if {$::patch_privacy_all::options(--patch-trendmicro)} {
            set selfs {silk.sprx silk_nas.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_trendmicro_com_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_trendmicro_com_self
			}
		}
		if {$::patch_privacy_all::options(--patch-xmlsoap)} {
            set selfs {mintx_client.sprx}
            if { ${::OLDROUTINE} == "1" } {
			::modify_devflash_files [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_xmlsoap_org_self
            } elseif { ${::OLDROUTINE} == "0" } {
			::modify_devflash_files2 [file join dev_flash vsh module] $selfs ::patch_privacy_all::patch_xmlsoap_org_self
			}
		}
    }
	
	proc patch0_playstation_net_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch0_playstation_net_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch0_playstation_net_elf
			}
    }
    proc patch0_playstation_net_elf {elf} {
        if {$::patch_privacy_all::options(--patch-playstati0n-net)} {
            log "Patching [file tail $elf] to disable communication with playstation.net"
#           playstation.net
            set search  "\x70\x6c\x61\x79\x73\x74\x61\x74\x69\x6f\x6e\x2e\x6e\x65\x74"
#           aaaaaaaaaaa.net
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x6e\x65\x74"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
	
	proc patch1_playstation_net_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch1_playstation_net_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch1_playstation_net_elf
			}
    }
    proc patch1_playstation_net_elf {elf} {
        if {$::patch_privacy_all::options(--patch-playstation-net)} {
            log "Patching [file tail $elf] to disable communication with playstation.net"
#           playstation.net
            set search  "\x70\x6c\x61\x79\x73\x74\x61\x74\x69\x6f\x6e\x2e\x6e\x65\x74"
#           aaaaaaaaaaa.net
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x6e\x65\x74"
            catch_die {::patch_elf $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
	
	proc patch2_playstation_net_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch2_playstation_net_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch2_playstation_net_elf
			}
    }
    proc patch2_playstation_net_elf {elf} {
        if {$::patch_privacy_all::options(--patch-playstation-net)} {
            log "Patching [file tail $elf] to disable communication with playstation.net"
#           playstation.net
            set search  "\x70\x6c\x61\x79\x73\x74\x61\x74\x69\x6f\x6e\x2e\x6e\x65\x74"
#           aaaaaaaaaaa.net
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x6e\x65\x74"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }

	proc patch_playstation_org_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_playstation_org_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_playstation_org_elf
			}
    }
    proc patch_playstation_org_elf {elf} {
        if {$::patch_privacy_all::options(--patch-playstation-org)} {
            log "Patching [file tail $elf] to disable communication with playstation.org"
#           playstation.org
            set search  "\x70\x6c\x61\x79\x73\x74\x61\x74\x69\x6f\x6e\x2e\x6f\x72\x67"
#           aaaaaaaaaaa.org
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x6f\x72\x67"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }

	proc patch_sony_com_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_sony_com_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_sony_com_elf
			}
    }
    proc patch_sony_com_elf {elf} {
        if {$::patch_privacy_all::options(--patch-sony-com)} {
            log "Patching [file tail $elf] to disable communication with sony.com"
#           sony.com
            set search  "\x73\x6f\x6e\x79\x2e\x63\x6f\x6d"
#           aaaa.com
            set replace "\x61\x61\x61\x61\x2e\x63\x6f\x6d"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }

	proc patch_sony_co_jp_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_sony_co_jp_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_sony_co_jp_elf
			}
    }
    proc patch_sony_co_jp_elf {elf} {
        if {$::patch_privacy_all::options(--patch-sony-co-jp)} {
            log "Patching [file tail $elf] to disable communication with sony.co.jp"
#           sony.co.jp
            set search  "\x73\x6f\x6e\x79\x2e\x63\x6f\x2e\x6a\x70"
#           aaaa.co.jp
            set replace "\x61\x61\x61\x61\x2e\x63\x6f\x2e\x6a\x70"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }

	proc patch_bitwallet_co_jp_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_bitwallet_co_jp_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_bitwallet_co_jp_elf
			}
    }
    proc patch_bitwallet_co_jp_elf {elf} {
        if {$::patch_privacy_all::options(--patch-bitwallet)} {
            log "Patching [file tail $elf] to disable communication with bitwallet.co.jp"
#           bitwallet.co.jp
            set search  "\x62\x69\x74\x77\x61\x6c\x6c\x65\x74\x2e\x63\x6f\x2e\x6a\x70"
#           aaaaaaaaa.co.jp
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x63\x6f\x2e\x6a\x70"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }

	proc patch_qriocity_com_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_qriocity_com_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_qriocity_com_elf
			}
    }
    proc patch_qriocity_com_elf {elf} {
        if {$::patch_privacy_all::options(--patch-qriocity)} {
            log "Patching [file tail $elf] to disable communication with qriocity.com"
#           qriocity.com
            set search  "\x71\x72\x69\x6f\x63\x69\x74\x79\x2e\x63\x6f\x6d"
#           aaaaaaaa.com
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x63\x6f\x6d"
            catch_die {::patch_elf $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }

	proc patch_trendmicro_com_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_trendmicro_com_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_trendmicro_com_elf
			}
    }
    proc patch_trendmicro_com_elf {elf} {
        if {$::patch_privacy_all::options(--patch-trendmicro)} {
            log "Patching [file tail $elf] to disable communication with trendmicro.com"
#           trendmicro.com
            set search  "\x74\x72\x65\x6e\x64\x6d\x69\x63\x72\x6f\x2e\x63\x6f\x6d"
#           aaaaaaaaaa.com
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x63\x6f\x6d"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }

	proc patch_allmusic_com_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_allmusic_com_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_allmusic_com_elf
			}
    }
    proc patch_allmusic_com_elf {elf} {
        if {$::patch_privacy_all::options(--patch-allmusic)} {
            log "Patching [file tail $elf] to disable communication with allmusic.com"
#           allmusic.com
            set search  "\x61\x6c\x6c\x6d\x75\x73\x69\x63\x2e\x63\x6f\x6d"
#           aaaaaaaa.com
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x63\x6f\x6d"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }

	proc patch_intertrust_com_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_intertrust_com_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_intertrust_com_elf
			}
    }
    proc patch_intertrust_com_elf {elf} {
        if {$::patch_privacy_all::options(--patch-intertrust)} {
            log "Patching [file tail $elf] to disable communication with intertrust.com"
#           intertrust.com
            set search  "\x69\x6e\x74\x65\x72\x74\x72\x75\x73\x74\x2e\x63\x6f\x6d"
#           aaaaaaaaaa.com
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x63\x6f\x6d"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }

	proc patch_marlin_tmo_com_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_marlin_tmo_com_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_marlin_tmo_com_elf
			}
    }
    proc patch_marlin_tmo_com_elf {elf} {
        if {$::patch_privacy_all::options(--patch-marlin-tmo)} {
            log "Patching [file tail $elf] to disable communication with marlin-tmo.com"
#           marlin-tmo.com
            set search  "\x6d\x61\x72\x6c\x69\x6e\x2d\x74\x6d\x6f\x2e\x63\x6f\x6d"
#           aaaaaaaaaa.com
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x63\x6f\x6d"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }

	proc patch_marlin_drm_com_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_marlin_drm_com_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_marlin_drm_com_elf
			}
    }
    proc patch_marlin_drm_com_elf {elf} {
        if {$::patch_privacy_all::options(--patch-marlin-drm)} {
            log "Patching [file tail $elf] to disable communication with marlin-drm.com"
#           marlin-drm.com
            set search  "\x6d\x61\x72\x6c\x69\x6e\x2d\x64\x72\x6d\x2e\x63\x6f\x6d"
#           aaaaaaaaaa.com
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x63\x6f\x6d"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }

	proc patch_oasis_open_org_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_oasis_open_org_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_oasis_open_org_elf
			}
    }
    proc patch_oasis_open_org_elf {elf} {
        if {$::patch_privacy_all::options(--patch-oasis-open)} {
            log "Patching [file tail $elf] to disable communication with oasis-open.org"
#           oasis-open.org
            set search  "\x6f\x61\x73\x69\x73\x2d\x6f\x70\x65\x6e\x2e\x6f\x72\x67"
#           aaaaaaaaaa.org
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x6f\x72\x67"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }

	proc patch_octopus_drm_com_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_octopus_drm_com_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_octopus_drm_com_elf
			}
    }
    proc patch_octopus_drm_com_elf {elf} {
        if {$::patch_privacy_all::options(--patch-octopus-drm)} {
            log "Patching [file tail $elf] to disable communication with octopus-drm.com"
#           octopus-drm.com
            set search  "\x6f\x63\x74\x6f\x70\x75\x73\x2d\x64\x72\x6d\x2e\x63\x6f\x6d"
#           aaaaaaaaaaa.com
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x63\x6f\x6d"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
	
	proc patch_facebook_com_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_facebook_com_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_facebook_com_elf
			}
    }
    proc patch_facebook_com_elf {elf} {
        if {$::patch_privacy_all::options(--patch-facebook)} {
            log "Patching [file tail $elf] to disable communication with facebook.com"
#           facebook.com
            set search  "\x66\x61\x63\x65\x62\x6f\x6f\x6b\x2e\x63\x6f\x6d"
#           aaaaaaaa.com
            set replace "\x61\x61\x61\x61\x61\x61\x61\x61\x2e\x63\x6f\x6d"
            catch_die {::patch_elf $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
	
    proc patch_dtcp_com_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_dtcp_com_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_dtcp_com_elf
			}
    }
    proc patch_dtcp_com_elf {elf} {
		if {$::patch_privacy_all::options(--patch-dtcp)} {
            log "Patching [file tail $elf] to disable communication with dtcp.com"
#           dtcp.com
            set search  "\x64\x74\x63\x70\x2e\x63\x6f\x6d"
#           aaaa.com
            set replace "\x61\x61\x61\x61\x2e\x63\x6f\x6d"
            catch_die {::patch_elf $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
	
	proc patch_purl_org_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_purl_org_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_purl_org_elf
			}
    }
    proc patch_purl_org_elf {elf} {
		if {$::patch_privacy_all::options(--patch-purl)} {
            log "Patching [file tail $elf] to disable communication with purl.org"
#           purl.org
            set search  "\x70\x75\x72\x6c\x2e\x6f\x72\x67"
#           aaaa.com
            set replace "\x61\x61\x61\x61\x2e\x63\x6f\x6d"
            catch_die {::patch_elf $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
	
	proc patch_xmlsoap_org_self {self} {
			if { ${::OLDROUTINE} == "1" } {
			::modify_self_file $self ::patch_privacy_all::patch_xmlsoap_org_elf
			} elseif { ${::OLDROUTINE} == "0" } {
			::modify_self_file2 $self ::patch_privacy_all::patch_xmlsoap_org_elf
			}
    }
    proc patch_xmlsoap_org_elf {elf} {
		if {$::patch_privacy_all::options(--patch-xmlsoap)} {
            log "Patching [file tail $elf] to disable communication with xmlsoap.org"
#           xmlsoap.org
            set search  "\x78\x6d\x6c\x73\x6f\x61\x70\x2e\x6f\x72\x67"
#           aaaaaaa.com
            set replace "\x61\x61\x61\x61\x61\x61\x61\x2e\x63\x6f\x6d"
            catch_die {::patch_file_multi $elf $search 0 $replace} \
                "Unable to patch self [file tail $elf]"
        }
    }
}

Using console / shellscript[edit | edit source]

By using commandline switches you can preset every task there is, plus the source PUP, destination PUP and debug settings.

Example of PS3MFW Builder 0.2 tasks[edit | edit source]

Type This
ps3mfw.exe %1 "Y:\PS3-Firmwares" "Z:/PS3MFW-out/test.pup" --change_version --add_license_msg --patch_lv1 --patch_lv2 --patch_nas_plugin --patch_privacy --patch_vsh --patch_category_game --spoof_version --debug true

Example of PS3MFW Builder with OtherOS++ tasks[edit | edit source]

(in this case tasks that fail with FW 3.15 are disabled/not selected)

Type This
ps3mfw.exe %1 "Y:\PS3-Firmwares\" "Z:/MFWOtherOS-out/test.pup" --change_version --add_license_msg --patch_lv1 --patch-lv1-dispmgr-access false --patch-lv1-otheros-plus-plus false --patch_lv2 --patch-emer-init --patch_category_game --patch-package-files true --patch-app-home true --patch_nas_plugin --allow-pseudoretail-pkg true --allow-debug-pkg true --patch_vsh --allow-unsigned-app true --patch_privacy --debug true

Example of PS3MFW Builder using shell file[edit | edit source]

https://github.com/euss/mfw/blob/master/build_cfw_355.sh

Example of PS3MFW Builder 0.2.3 tasks[edit | edit source]

Type This
ps3mfw.exe %1 "Y:\PS3-Firmwares\OFW430.PUP" ""Z:/MFWOtherOS-out/MFW430.PUP" --gui false --debug true --patch_pup --pup-build "" --version-string "" --version-suffix "PSDEVWIKI" --patch_lv1 	--patch-lv1-peek-poke true --patch-lv1-remove-lv2-protection true --patch-lv1-sysmgr-disable-integrity-check-4x true --patch-lv1-coreos-hash-check true --patch_cos --patch-lv0-coreos-ecdsa-check true --patch-spkg-ecdsa-check true --patch-pup-search-in-game-disc true --patch-lv2-peek-poke-4x true --patch-lv2-lv1-peek-poke-4x true --patch-lv2-npdrm-ecdsa-check true --patch-lv2-payload-hermes-4x true --patch-lv2-SC36-4x true --patch_xmb --add-install-pkg true --patch-act-pkg true --add-hb-seg true --patch-app-home true --patch-ren-apphome true --patch-alpha-sort true --patch-rape-sfo true --patch_vsh --allow-pseudoretail-pkg true --allow-debug-pkg true --patch-vsh-react-psn-v2-4x true

FAQ[edit | edit source]

  • Error: User wants an /insert well known 'CFW' e.g. Kmeaw/ like MFW firmware or use that as source PUP
Solution: Take official firmware and select the following tasks accordingly to your target requirements:
- Patched LV1 hypervisor to allow mapping of any needed memory area (Wutangrza, Waninkoko, Kmeaw, graf_chokolo)
- Patched LV2 kernel to add Peek&Poke system calls to LV2 (Wutangrza, Waninkoko, Kmeaw, graf_chokolo)
- Patched PKG installer to allow installation of pseudo-retail + debug PKGs (geohot, Waninkoko, kmeaw)
- Patched Application launcher to allow running of unsigned applications (Waninkoko)
- Add new icons to XMB to add Install PKGs + /app_home (KaKaRoTo, geohot Waninkoko, Kmeaw)
  • Error: Error running script: invalid command name "34" and/or Error running script: invalid command name "35" (when using Kmeaw, Rebug etc as input PUP and selecting privacy [34] and/or spoof [35])
Solution: Take official firmware and use the solution mentioned above

Road beyond 3.55[edit | edit source]

Reference[edit | edit source]

Downloads / precompiled & source[edit | edit source]