53w ago - Following up on the
MA BD Tool v0.8 for PS3 JFW DH 3.56 MA CFW, today
JaicraB has updated the
previous PS3 Preloader Advance 2 to version 3 followed by bugfix 3.1 alongside a guide by
Chekco via
DemonHades below.
Download:
PS3 Preloader Advance 3.1 /
PS3 Preloader Advance 3.1 (Mirror) /
PS3 Preloader Advance 3.0 /
PS3 Preloader Advance 3.0 (Mirror)
To quote, roughly translated: Hi all, as many know, when it published the JFW 3.56 MA-DH commented on the possibility of creating a virtual flasher to downgrade to 3.55 or less, well today is a fact that possibility so from now no one is "prisoner of MA", however it is a dangerous process, it is recommended to keep things clear and know what we are doing responsible are misuse said this. Let's begin:
The first is dump the data vital to our PS3, Aegean and we will use a configuration file download from the link below the pre3 (jaicrab.blogspot.com.es) and put in the root of the pen Archivo advanced.cfg, then rename the Lv2Diag.self to egea.self, create the following directory PS3/UPGRADE/egea.self.
Connecting to the USB port on the right and hope while reading the data from our ps3 "the process are between 3/5 minutes depending on the pen", when finished we will create the Backuprflash.bin. There are flash drives that are not compatible with egea, if we see that the ps3 starts normally change pendrive...
Good, the configuration file that will do is dump the rflash and flash1, flash2, flash3 once the reading process will turn off the ps3 and begins one of the most dangerous steps, we now have to patch the rflash with 3.55 core_os not chek, patch is recommended to follow the tutorials to dowgrades with physical flasher, but if you look confused or not know how. To be continued...
Thanks to:
JaiCraB, to create preloader 3 and include the MAD.
Varicela test this tool and give me a PS3 and which I used for this tool and other future purposes.
Kike for sacrificing your PS3.
Checko, to try all options.
Demonhades by atosigarme to do it.
M * D ** for the knowledge transmitted.
Black, to add the improvement of Service Mode
Sorry for my bad English
PS3 Preloader Advance 3 by
JaicraB
I decided to make improvements to the previous Advance Preloader 2. A major improvement is the virtual controller (MAD). Can directly manipulate the NOR or NAND memories of our consoles without having a physical developer. This leads to a high risk of running out of console.
A bad patch and you would be required to settle a physical developer. It has been tested successfully in several models. This does not mean that there is any model that fails. I hope you will heap up head. I am not responsible for any damage. Another use is to make copies of data unique to each console.
This tool has been developed for systems and lower JFW 3.55 3.56 MA. It requires no external libraries. It works even without the dev_flash in the system. It can be launched as Lv2Diag.self, as in JFW EGEA MA SELF 3.56 or releasing from any FileManager that supports it. May soon be published as PKG.
1. Copy of rflash:
For systems with NOR (16MB) and NAND (256MB) (no bootloader). Available two ways to copy. The first 16MB, 256MB or whole (for NAND) The process takes 50 sec (16MB NOR), 15 sec (16MB NAND), 1 min (256MB NAND). In rflash entire system is stored on the PS3. There we find:
- Asecure_loader
- EEID
- CISD
- CCSD
- Trvk_prg
- Trvk_pkg
- Ros (CoreOS)
- Cvtrm
- Bootloader (NOR models only)
It will create a file called "Backuprflash.bin" in the USB000.
2. Restoring the rflash (MAD):
This step is dangerous, a bad change in the original can cause rflash BRICK. A bad usage can only be repaired only with physical developer. Also available in two modes (16MB, 256MB). Designed primarily for downgrading systems with "JFW MA" and for systems with problems downgrader. Has option to restore only different sectors. (Experimental). The process can take NOR, auque See not work on USB not quench. The "rflash" must be copied to the USB as "rflash.bin" But this safe to do so ... Do not!
3. Copy and Restore "/ dev_flashX"
To safely handle the file system used in GameOS. It will create a file called "Backupflash1.bin", "Backupflash2.bin", "Backupflash3.bin" USB000 depending on the number of dev_flash chosen. You can mount that image in your PC so you can change and then restore it. It is also useful when the system downgrade option 2 "Restoring rflash" and change your firmware with the file system. To restore is to copy the image of the "dev_flash" USB000 named the "flashX.bin".
4. Dump LV2, LV1
It is an extra unimportant. You just have to be installed in the system SC 6, 7, 11 for the process. The file created will be named on USB000 "DumpLv2.bin", "DumpLv1.bin".
5. Service Mode
We can enter / exit the service mode. To enter service mode from the pre3 need patched systems with LV1.
6. Out mode
When you finish the processes indicated in advance.cfg can do is shut down or reboot the system.
Configuration file
The tool will locate the file "advance.cfg" in "/ dev_usb000/advance.cfg" (Port closer to the reader) You can do all the actions triggered sequentially. That is, you can program the rflash and dev_flash at a time, out of service mode and reboot. In the configuration file is detailed the activation of each action. Flashing green LED means you are working.
Where it is that Red is complete. Writing in NOR models will seem to be blocked. But the led usb flash every 20 seconds so slightly. Do not put out until you do one or put the red LED.
JFW 3.56 downgrade MA:
The process will be detailed demonhades.org community.
Easy change version:
With well patched the rflash (CoreOS not check) with their respective "dev_flashX" can be changed in a matter of 4 minutes (NAND) of any firmware using this tool. Will address the issue soon on demonhades.org
Thanks to:
Chickenpox test this tool and give me a PS3 and which I used for this purpose and other future purposes.
Kike for sacrificing your PS3.
Checko, to test all future tutorials opciones.Y use of that tool.
Demonhades by atosigarme to do it.
M * D ** for the knowledge transmitted.
Black, to add the improvement of Service Mode.
Hey people. I've just heard you posted this here, and I just said to myself, let's post too. Atm I'm working on OpenPStore, which is part of the JFW. I've been working on it for many many hours, as all devs which are working on JFW, and it is just disgusting to read people saying JFW is a fake.
I've seen pics of JFW running, not all of its features though, so it's not fake. There is a whole team working hard every day to bring this to you, and I've actually talked to all of them and I do know their work is real. Just for you to know, now it is 2 am where I live, I've been working till now just to have it all ready for the beta test and not to delay it anymore.
We want to verify everything is working without any problems before releasing it, to avoid things such as bricks or weird bugs. That's why the beta and further release will take so long. So far it is all progressing fine, and I do have proofs of, at least, my work.
Here I bring you 2 proofs of how hard we are working (OpenPStore).
1- We had a problem with a pre-made library to read .xml files (mxml), which was solved by manually coding a new .xml parser.
xml_parser.h : http://pastebin.com/bqQr1YG5
//XML PARSER BY BLIPI
//Feel free to distribute and use it on any plattform and projects
#ifndef XMLPARSER_H
#define XMLPARSER_H
#include
#include
#include
#include
typedef struct xml_node_attr{
char *name;
char *value;
struct xml_node_attr *next;
}xml_node_attr;
typedef struct xml_node{
char *name;
char *value;
int level;
long start_pos;
long end_pos;
char closed;
struct xml_node_attr *attrs;
struct xml_node *next;
struct xml_node *last;
struct xml_node *child;
struct xml_node *parent;
}xml_node;
int XML_Open(char *path);
struct xml_node *XML_ParseAll();
struct xml_node *XML_SearchNodeFrom(char *name, struct xml_node *start);
struct xml_node *XML_SearchNode(char *name);
struct xml_node *XML_GetChild(struct xml_node *node);
struct xml_node *XML_GetNextNode(struct xml_node *node);
struct xml_node_attr *XML_GetNodeAttr(struct xml_node *node, char *name);
char *XML_GetNodeValue(struct xml_node *node);
void XML_EndParse(char free_tree);
#endif
xml_parser.c : http://pastebin.com/A7DsysUJ
#include "xmlparser.h"
// ----- DEFINES ----- //
#define XML_UNKNOW -1
#define XML_DUNNOHANDLE -2
#define XML_OPEN_NODE 1
#define XML_CLOSE_NODE 2
#define XML_NODE_NAME 3
#define XML_SPECIAL_NODE 4
#define XML_NAME_DELIMITER 5
#define XML_ATTR_START 6
#define XML_ATTR_DELIMITER 7
#define XML_NODE_END 8
#define XML_CLOSE_END_NODE 9
// ----- STRUCTS ----- //
typedef struct xml_reader_{
char reading_tag;
char quote_read;
char node_ending;
int lvl;
long cur_pos;
char read_buffer[1024];
char name_buffer[1024];
}xml_reader_;
xml_reader_ xml_reader = {0};
typedef struct ret_{
int ret;
char ch;
}ret_;
// ----- PROTOTYPES ----- //
void XML_FreeList( void );
struct ret_ XML_GetChar( void );
struct xml_node *XML_RecursiveSearchNode(char *name, struct xml_node *node);
// ----- VARIABLES -----//
char xml_path[1024];
char *xml_buffer = NULL;
long xml_size = 0;
struct xml_node *main_tree = NULL;
struct xml_node *current_node = NULL;
// ----- CODE ----- //
//! Abrir el archivo para parsear posteriormente
//! path: Ruta relativa o hard coded hacia el xml
//TODO: No guardar en buffer, leer char a char!
int XML_Open(char *path){
FILE *fp = fopen(path, "r");
if(!fp)
return -1;
strcpy(xml_path, path);
fseek(fp, 0, SEEK_END);
xml_size = ftell(fp);
rewind(fp);
xml_buffer = (char*)malloc(xml_size+1);
if(!xml_buffer)
return -2;
fread(xml_buffer, 1, xml_size, fp);
fclose(fp);
return 0;
}
struct ret_ XML_GetChar(){
char ch = xml_buffer[xml_reader.cur_pos++];
struct ret_ ret;
ret.ch = ch;
if(xml_reader.quote_read == 1 && ch != '"'){
ret.ret = XML_NODE_NAME;
goto endfunc;
}
if(xml_reader.reading_tag == 0){
switch(ch){
case '':
xml_reader.reading_tag = 0;
if(xml_buffer[xml_reader.cur_pos-2] == '/')
ret.ret = XML_CLOSE_END_NODE;
else
ret.ret = XML_CLOSE_NODE;
goto endfunc;
case '?':
ret.ret = XML_SPECIAL_NODE;
goto endfunc;
case ' ':
ret.ret = XML_NAME_DELIMITER;
goto endfunc;
case '=':
ret.ret = XML_ATTR_START;
goto endfunc;
case '"':
xml_reader.quote_read = !xml_reader.quote_read;
ret.ret = XML_ATTR_DELIMITER;
goto endfunc;
}
}
}
endfunc:
return ret;
}
struct xml_node *XML_ParseAll(){
char action = 0;
char ignore = 0;
int buffer_pos = 0;
memset(xml_reader.read_buffer, 0, 1024);
memset(xml_reader.name_buffer, 0, 1024);
xml_reader.reading_tag = 0;
xml_reader.quote_read = 0;
struct xml_node_attr *last_attr = NULL;
struct xml_node_attr *first_attr = NULL;
while(xml_reader.cur_pos < xml_size){
struct ret_ ret = XML_GetChar();
if(ignore && ret.ret != XML_SPECIAL_NODE)
continue;
switch(ret.ret){
case XML_SPECIAL_NODE:
ignore = !ignore;
break;
case XML_OPEN_NODE:
if(!main_tree){
main_tree = current_node = (struct xml_node*)malloc(sizeof(struct xml_node));
memset(current_node, 0, sizeof(struct xml_node));
}else if(current_node->closed){
current_node->next = (struct xml_node*)malloc(sizeof(struct xml_node));
memset(current_node->next, 0, sizeof(struct xml_node));
current_node->next->parent = current_node->parent;
current_node->next->last = current_node;
current_node = current_node->next;
}else{
current_node->child = (struct xml_node*)malloc(sizeof(struct xml_node));
memset(current_node->child, 0, sizeof(struct xml_node));
current_node->child->parent = current_node;
current_node = current_node->child;
}
action = 0;
break;
case XML_NODE_NAME:
xml_reader.read_buffer[buffer_pos++] = ret.ch;
break;
case XML_NAME_DELIMITER:{
if(buffer_pos > 0){
if(action == 0)
strcpy(xml_reader.name_buffer, xml_reader.read_buffer);
memset(xml_reader.read_buffer, 0, 1024);
buffer_pos = 0;
}
}break;
case XML_ATTR_START:{
struct xml_node_attr *temp_attr = (struct xml_node_attr*)malloc(sizeof(struct xml_node_attr));
memset(temp_attr, 0, sizeof(struct xml_node_attr));
temp_attr->name = (char*)malloc(buffer_pos);
strcpy(temp_attr->name, xml_reader.read_buffer);
if(last_attr != NULL)
last_attr->next = temp_attr;
last_attr = temp_attr;
if(first_attr == NULL)
first_attr = last_attr;
memset(xml_reader.read_buffer, 0, 1024);
buffer_pos = 0;
}break;
case XML_ATTR_DELIMITER:
if(xml_reader.quote_read == 0){
last_attr->value = (char*)malloc(buffer_pos);
strcpy(last_attr->value, xml_reader.read_buffer);
memset(xml_reader.read_buffer, 0, 1024);
buffer_pos = 0;
}
break;
case XML_CLOSE_END_NODE:
case XML_CLOSE_NODE:
if(xml_reader.node_ending == 0){
current_node->name = (char*)malloc(buffer_pos);
if(strlen(xml_reader.name_buffer) > 0)
strcpy(current_node->name, xml_reader.name_buffer);
else
strcpy(current_node->name, xml_reader.read_buffer);
current_node->level = xml_reader.lvl;
current_node->attrs = first_attr;
current_node->start_pos = xml_reader.cur_pos;
}
memset(xml_reader.name_buffer, 0, 1024);
memset(xml_reader.read_buffer, 0, 1024);
buffer_pos = 0;
first_attr = NULL;
last_attr = NULL;
if(ret.ret == XML_CLOSE_END_NODE){
current_node->closed = 1;
current_node->end_pos = xml_reader.cur_pos;
}
break;
case XML_NODE_END:
while(current_node->closed == 1)
current_node = current_node->parent;
current_node->closed = 1;
current_node->end_pos = xml_reader.cur_pos;
memset(xml_reader.name_buffer, 0, 1024);
memset(xml_reader.read_buffer, 0, 1024);
buffer_pos = 0;
break;
default:
break;
}
}
return main_tree;
}
struct xml_node *XML_RecursiveSearchNode(char *name, struct xml_node *node){
if(strcmp(name, node->name) == 0)
return node;
struct xml_node *ret = NULL;
if(node->child)
ret = XML_RecursiveSearchNode(name, node->child);
if(ret)
return ret;
if(node->next)
ret = XML_RecursiveSearchNode(name, node->next);
if(ret)
return ret;
return NULL;
}
struct xml_node *XML_SearchNodeFrom(char *name, struct xml_node *start){
return XML_RecursiveSearchNode(name, start);
}
struct xml_node *XML_SearchNode(char *name){
return XML_RecursiveSearchNode(name, main_tree);
}
struct xml_node *XML_GetChild(struct xml_node *node){
return node->child;
}
struct xml_node *XML_GetNextNode(struct xml_node *node){
return node->next;
}
struct xml_node_attr *XML_GetNodeAttr(struct xml_node *node, char *name){
struct xml_node_attr *iterator = node->attrs;
while(iterator != NULL){
if(strcmp(iterator->name, name) == 0)
return iterator;
iterator = iterator->next;
}
return NULL;
}
char *XML_GetNodeValue(struct xml_node *node){
if(node->value == NULL){
int len = node->end_pos - node->start_pos - 1;
char *buffer =(char*)malloc(len);
memcpy(buffer, &xml_buffer[node->start_pos], len);
buffer[len] = '\0';
node->value = buffer;
}
return node->value;
}
void XML_RecursiveFreeNode(xml_node *node){
if(node->child)
XML_RecursiveFreeNode(node->child);
if(node->next)
XML_RecursiveFreeNode(node->next);
free(node);
node = NULL;
}
//! Liberar la memoria ocupada por xml_buffer
void XML_EndParse(char free_tree){
free(xml_buffer);
if(free_tree)
XML_RecursiveFreeNode(main_tree);
main_tree = current_node = NULL;
}
(Don't expect to find any OpenPStore here, as it is only a .xml parser)
2- Final GUI design of OpenPStore (Not a pic of a ps3, but from a PC. Though PS3 is exactly the same):
It will come in multiple colors, with an autochanger (to random color) feature.
If you want to I can keep you updated. JFW is real, and we are putting all our effort into it. Do not trust any fake release/leak! I don't know if the brick thing is true, but having seen all the work which has been done here, I would just trust it and not mess around.
Nobody is going to brick nobody's console unless someone leaks the JFW. And, even if it is leaked, if you don't use the leaked beta, you dont' have to worry about anything. And ofcourse, the final release won't have this anti-leak feature.
I also have to say thanks to everyone of you who do trust in us and give us support, as support and opinions is our only pay back for the work
Blipi
PS: If it was for me, I would translate JFW and it's homebrew to English and more languages, but as I am not the only one who works in this project, I don't know when English support will come or whether it will come or not. Sorry.
PS2: For those claiming evidence... Beta will be here soon, just wait. You cant trust us or not. I know what I'm doing, and I do know that it is real. I don't even have a ps3 to test OpenPStore too, and I have to keep asking for testers. More than 5 people have already tried OpenPStore, and every one of them could tell you that it is real.