Bienvenidos al nuevo foro de hackplayers. En caso de encontrarse cualquier tipo de error, contacte con cualquier administrador por mensaje privado.
Recuerda que, para incrementar tu privacidad, tambien puedes acceder al foro usando el dominio forohpysho2t5mjs.onion de la red tor.

personalizar mbr

Hola, miré varios vídeos sobre reescribir el mbr y se me ocurrió intentar lo mismo pero sin dañar el inicio del sistema operativo.
Casi como se muestra aca o aca pero en mi windows.
Como se ve en el siguiente codigo (payloads que incrustaria en PersonalMasterBootRecord ), me falta la función que retonaria el mbr original. Alguien tiene idea como completar este codigo, es decir, como una vez encontrado mi mbr lo ejecuto?.
Seguramente me falta informacion sobre el funcionamiento de la bios. Toda sugerencia es bienvenida. Gracias.

backup_magic equ 0x0DD03713
magic_addr	equ 0x7FFC
dest db ""
BITS    16
ORG     0x7c00
jmp start

start:
        call clear_screen
        mov ax,cs
        mov ds,ax
        mov si,msg

        call print

print:
        push ax
        cld
next:
        mov al,[si]
        cmp al,0
        je done
        call printchar
        inc si
        jmp next
done:
        jmp buscar

printchar:
        mov ah,0x0e
        int 0x10
        ret

clear_screen:
        mov ah, 0x07
        mov al, 0x00
        mov bh, 0x09 
        mov cx, 0x0000 
        mov dx, 0x184f
        int 0x10
        ret


buscar:
    	mov	si, DAPACK
	    mov	ah, 0x42
	    int	0x13
	    mov	ax, [d_lba]
	    add	ax, 1
	    mov	[d_lba], ax
	    mov	eax, [magic_addr]
	    mov	ebx, backup_magic
	    cmp	eax, ebx
	    jne	saltoalmbroriginal

msg:            db        "Aca escribiendo el mbr",13,10,"porque se me antoja pelotudear",13,10,"Yeah, MBR Overwrited :P ", 0
times 510 - ($-$$) db 0
dw        0xaa55
#include <stdio.h>
#include <windows.h>

#define BACKUP_MAGIC "\x13\x37\xd0\x0d"
#define MAX_PAYLOAD_LEN  0x1B8

typedef struct {
	BYTE status; // activo? 0=no, 128=yes
	BYTE chsFirst[3]; // starting sector number
	BYTE type; // OS type indicator code
	BYTE chsLast[3]; // ending sector number
	DWORD lbaStart; // first sector relative to start of disk
	DWORD size; // number of sectors in partition
} MBR_PARTITION_TABLE_ENTRY;

typedef struct {
	BYTE bootCode[446]; // space to hold actual boot code
	MBR_PARTITION_TABLE_ENTRY partitionTable[4];
	USHORT mbrSignature; // set to 0xAA55 to indicate PC MBR format
} MASTER_BOOT_RECORD;

int	main(
	HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR     lpCmdLine, int       nCmdShow
)
{	
	MASTER_BOOT_RECORD MBR;
	FILE* fp;
	unsigned int newMBROffset;
	const unsigned char PersonalMasterBootRecord[] = { 
};

	fp = fopen("\\\\.\\PhysicalDrive0", "r+b");
	fread(&MBR.bootCode, sizeof(BYTE), 446, fp);
	fread(&MBR.partitionTable, sizeof(MBR_PARTITION_TABLE_ENTRY), 4, fp);
	fread(&MBR.mbrSignature, sizeof(USHORT), 1, fp);
	if (MBR.mbrSignature == 0xaa55) {
		printf("aca termina el MBR\n");
	}

	static const int SECTOR_SIZE = sizeof(MBR) +sizeof(BACKUP_MAGIC);
	char readbuf[SECTOR_SIZE];
	printf("%i",SECTOR_SIZE);
	char isUsed = 1;
	while (isUsed) {
		fread(&readbuf, SECTOR_SIZE, 1, fp);
		for (int i = isUsed = 0; i < SECTOR_SIZE; isUsed |= readbuf[i++]);
	}
	newMBROffset = ftell(fp) - SECTOR_SIZE;
	/*aca escrbio el mbr original en la nueva posicion*/
	fseek(fp, newMBROffset, SEEK_SET);
	fwrite(BACKUP_MAGIC,sizeof(BACKUP_MAGIC),1,fp);
	fwrite(&MBR, sizeof(MBR), 1, fp);
	/*aca escribo mi mbr*/
	fseek(fp, 0, SEEK_SET);
	fwrite(&PersonalMasterBootRecord, 1, sizeof(PersonalMasterBootRecord), fp);
	return 0;
}

Accede o Regístrate para comentar.