Emunand self patching; found solution for some hard coded stuff/FS more flexible; got rid of screenShot; implemented PoC RAM dumper using txt file; changed location of arm9 thread; fixed ver string; tons of organization and cleaning up for easier to read and modify code.
This commit is contained in:
@@ -6,7 +6,7 @@ ENTRY(_start)
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x0801A7E0;
|
||||
. = 0x08006070;
|
||||
start_addr = .;
|
||||
.text.start : { *(.text.start) }
|
||||
.text : { *(.text) *(.text*) }
|
||||
|
||||
@@ -13,8 +13,8 @@ _start:
|
||||
ldr r1, =thread @ thread_addr
|
||||
mov r2, #0x0 @ arg
|
||||
ldr r3, =0x08000c00 @ StackTop
|
||||
ldr r4, =0x1
|
||||
ldr r4, =0xFFFFFFFE
|
||||
svc 0x8
|
||||
pop {r0-r12 , lr}
|
||||
ldr r0, =0x80E3408
|
||||
ldr r0, =0x080E3408
|
||||
ldr pc, =0x0808519C
|
||||
@@ -31,6 +31,24 @@ int memcmp(void* buf1, void* buf2, int size){
|
||||
return equal;
|
||||
}
|
||||
|
||||
int atoi(const char* nptr){
|
||||
int result = 0,
|
||||
position = 1;
|
||||
const char* p = nptr;
|
||||
|
||||
while(*p) ++p;
|
||||
|
||||
for(--p; p >= nptr; p--){
|
||||
if(*p < 0x30 || *p > 0x39) break;
|
||||
else{
|
||||
result += (position) * (*p - 0x30);
|
||||
position *= 10;
|
||||
}
|
||||
}
|
||||
result = ((nptr[0] == '-')? -result : result);
|
||||
return result;
|
||||
}
|
||||
|
||||
unsigned isPressed(unsigned bitfield){
|
||||
return ((~*(unsigned *)0x10146000) & 0xFFF) == (bitfield & 0xFFF) ? 1 : 0;
|
||||
}
|
||||
@@ -20,6 +20,7 @@ void* memset(void * ptr, int value, unsigned int num);
|
||||
int strcomp(char* s1, char*s2, unsigned int size);
|
||||
void strcopy(char* dest, char* source, unsigned int size);
|
||||
int memcmp(void* buf1, void* buf2, int size);
|
||||
int atoi(const char* nptr);
|
||||
unsigned isPressed(unsigned bitfield);
|
||||
|
||||
#endif
|
||||
@@ -10,78 +10,48 @@
|
||||
#include "lib.h"
|
||||
#include "FS.h"
|
||||
|
||||
//ram stuff
|
||||
#define VRAM (unsigned char*)0x18000000
|
||||
#define FCRAM (unsigned char*)0x20000000
|
||||
#define FCRAM_EXT (unsigned char*)0x28000000
|
||||
#define ARM9_MEM (unsigned char*)0x8000000
|
||||
#define AXIWRAM (unsigned char*)0x1FF80000
|
||||
#define TOP_FRAME 0
|
||||
#define BOT_FRAME 1
|
||||
|
||||
//file stuff
|
||||
#define READ 0
|
||||
#define WRITE 1
|
||||
|
||||
unsigned char handle[32];
|
||||
unsigned char bmpHead[] = {
|
||||
0x42, 0x4D, 0x36, 0x65, 0x04, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
|
||||
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xF0, 0x00,
|
||||
0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x65, 0x04, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
void fileReadWrite(void *buf, void *path, int size, char rw){
|
||||
unsigned int br = 0;
|
||||
memset(&handle, 0, 32);
|
||||
fopen9(&handle, path, 6);
|
||||
if(rw == 0) fread9(&handle, &br, buf, size);
|
||||
else fwrite9(&handle, &br, buf, size);
|
||||
fclose9(&handle);
|
||||
}
|
||||
|
||||
void memdump(void* filename, void* buf, unsigned int size){
|
||||
unsigned int br = 0;
|
||||
memset(&handle, 0, 32);
|
||||
fopen9(&handle, filename, 6);
|
||||
fwrite9(&handle, &br, buf, size);
|
||||
fclose9(&handle);
|
||||
fileReadWrite(buf, filename, size, WRITE);
|
||||
memset(VRAM+0x1E6000, 0xFF, 0x46500);
|
||||
}
|
||||
|
||||
void transpose (void * dst, const void * src, unsigned dim1, unsigned dim2, unsigned item_length) {
|
||||
char * ptr_write;
|
||||
const char * ptr_read;
|
||||
unsigned x, y, z;
|
||||
for (x = 0; x < dim1; x ++) for (y = 0; y < dim2; y ++) {
|
||||
ptr_write = ((char *) dst) + item_length * (y * dim1 + x);
|
||||
ptr_read = ((const char *) src) + item_length * (x * dim2 + y);
|
||||
for (z = 0; z < item_length; z ++) *(ptr_write ++) = *(ptr_read ++);
|
||||
}
|
||||
}
|
||||
|
||||
void screenShot(int frame){
|
||||
unsigned int br;
|
||||
short width = frame == 0 ? 400 : 320;
|
||||
short height = 240;
|
||||
int frameOff = frame == 0 ? 0x1E6000 : 0x48F000; //<- Defaults
|
||||
int length = frame == 0 ? 0x46500 : 0x38400;
|
||||
memset(&handle, 0, 32);
|
||||
fopen9(&handle, frame == 0 ? L"sdmc:/screen_top.bmp" : L"sdmc:/screen_bot.bmp", 6);
|
||||
transpose(FCRAM+0xF80000, VRAM+frameOff, width, height, 3);
|
||||
bmpHead[18] = frame == 0 ? 0x90 : 0x40;
|
||||
fwrite9(&handle, &br, bmpHead, 0x36);
|
||||
fwrite9(&handle, &br, FCRAM+0xF80000, length);
|
||||
fclose9(&handle);
|
||||
memset(VRAM+frameOff, 0xFF, 0x46500);
|
||||
}
|
||||
|
||||
void patches(void){
|
||||
//Change version string
|
||||
for(int i = 0; i < 0x600000; i+=4){
|
||||
if(strcomp((void*)0x27B00000 - i, (void*)L"Ver.", 4)){
|
||||
if(strcomp((void*)0x27B00000 - i + 0x28, (void*)"T_ver_00", 4)) strcopy((void*)0x27B00000 - i, (void*)L"\uE024Rei", 4);
|
||||
if(strcomp((void*)0x27B00000 - i + 0x0A, (void*)L"%d.%d.%d-%d", 11)) strcopy((void*)0x27B00000 - i, (void*)L"\uE024Rei", 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void thread(void){
|
||||
while(1){
|
||||
if(isPressed(BUTTON_SELECT | BUTTON_X)){
|
||||
screenShot(TOP_FRAME);
|
||||
screenShot(BOT_FRAME);
|
||||
}
|
||||
if(isPressed(BUTTON_START | BUTTON_X)){
|
||||
memdump(L"sdmc:/FCRAM.bin", (void*)0x27500000, 0x600000);
|
||||
if(isPressed(BUTTON_START | BUTTON_X)){
|
||||
unsigned char buf[0x10] = {0};
|
||||
int loc = 0;
|
||||
fileReadWrite(buf, L"sdmc:/rei/RAM.txt", 0x20, READ);
|
||||
loc = atoi(buf);
|
||||
memdump(L"sdmc:/RAMdmp.bin", (void*)loc, 0x500000);
|
||||
}
|
||||
patches();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user