› Foros › Xbox 360 › Modificación de lectores
popoff escribió:Siento ser de los que da una respuesta de las que no quieres, pero como se ve que entiendes y conoces perfectamente el tema ya sabes de antemano que con los recursos computacionales a tu alcance es practicamente imposible que consigas nada en un plazo razonable .... digamos que razonable sería menos de un año.
Aunque posible es. Hace tiempo en unos foros muy conocidos sobre crackeo de sistemas sat, en la sección para averiguar la CW de NBATV que usaba el sistema BISS, con una clave infinitamente más simple que esta que hablas, nos juntamos unos 60 foreros machacando claves con fuerza bruta en nuestros equipos, asignándonos rangos a cada uno.
Yo por aquella época pude dedicar un chasis blade del curro aun sin estar en explotación con 14 equipos, cada uno con 2 CPU's de 4 cores (112 hilos de ejecución simultáneos) trabajando las 24 horas. Como es lógico fui yo quien encontró la CW al cabo de unos 21 días, y cuando fuimos a probarla los tios cachondos de NBATV ya la habían cambiado ....
Pero vamos, ánimo en el intento. Yo como soy muy bruto le veo pocos visos de éxito.
Saludos.
c0d3m4st4 escribió:Supongo que habrás echado un vistazo a esto:
http://en.wikipedia.org/wiki/RSA#Using_ ... _algorithm
draqen escribió:robeweb hace tempo me tope con este hilo de eol exale un ojo tambien hablan de la clave publica
hilo_se-sabe-la-clave-publica-de-ms-usada-en-la-firma-de-xex_777639
draqen escribió:me podrias pasar algun link donde se deca eso ara ver mas info y tal, ya tengo time libre me gustaria revisar google d arriba abajo pero no se como buscar o con que palabras buscar xd
mirastes tambien la app Wxpirs es para ver el contenido de los archivos live y CON
http://gael360.free.fr/wxPirs.php
draqen escribió:algo nuevo??
ciberdim escribió:Primero hola a todos, llevo tiempo leyendo este foro pero es la primera vez que me animo a postear.
Primero lo negativo. Una RSA de 2048 es una RSA fuerte fuerte y no sabes si está en conjunción con otro tipo de cifrado como una triple DES u otra (algo al estilo PGP). Ahora bien, creo que una posible solución (quitando el tiempo de desarrollo que desde luego no sería trivial, la capacidad matemática para crear un algoritmo elegante y la imprescindible dosis de potra) pasaría por aumentar exponencialmente tu capacidad de computación. Si conoces los sistemas que utiliza el SETI (plataforma BOINC) se podría escribir algo parecido (sin un GUI tan elaborado y partiendo de código ya existente) para que cada cliente se encargara de una parte del problema. Muchos usuarios participarían en cuanto supieran para que se está usando. Por supuesto el envío debería ser redundante para así cotejar resultados pero creo que sería la única manera de tener una mínima posibilidad de reventar una RSA a lo bestia.
En otro orden de cosas me preguntaba si te has planteado alguna variante de birthday attack para firmas...
Un saludo
#if secret_1BL is None:
# secret_1BL = open("key_1BL.bin", "rb").read()
# Import Psyco if available
try:
import psyco
psyco.full()
except ImportError:
pass
# first, unpack base input image. We are ignoring any updates here
import hmac, sha, struct, sys, binascii
try:
import Crypto.Cipher.ARC4 as RC4
except ImportError:
print "Error importing Crypto.Cipher.ARC4 - please install python-crypto!"
print "You can get it from http://www.dlitz.net/software/pycrypto/"
sys.exit(-1)
def unpack_base_image(image):
global SMC, CB_A, CB_B, CD, CE, Keyvault
if image[0x205] == "\xFF" or image[0x415] == "\xFF" or image[0x200] == "\xFF":
print "ECC'ed - will unecc."
res = ""
for s in range(0, len(image), 528):
res += image[s:s+512]
image = res
unpackstring = "!HHLLL64s5LLLLLLLL"
(id1, build, flags, bloffset, size0, copyright, z0, z1, z2, z3, r7, size1, r3, r4, z5, z6, smc_len, smc_start) = struct.unpack(unpackstring, image[:struct.calcsize(unpackstring)])
#assert not (z0 or z1 or z2 or z3 or z5 or z6), "zeros are not zero."
block_offset = bloffset
SMC = image[smc_start:smc_start+smc_len]
Keyvault = image[0x4000:0x8000]
assert smc_len == 0x3000, "never saw an SMC != 0x3000 bytes"
semi = 0
for block in range(30):
(block_id, block_build, block_flags, block_entry_point, block_size) = struct.unpack("!2sHLLL", image[block_offset:block_offset+16])
block_size += 0xF
block_size &= ~0xF
id = ord(block_id[1]) & 0xF
print "Found %dBL (build %d) at %08x" % (id, block_build, block_offset)
data = image[block_offset:block_offset+block_size]
if id == 2:
if semi == 0:
CB_A = data
semi = 1
elif semi ==1:
CB_B = data
semi = 0
elif id == 4:
CD = data
elif id == 5:
CE = data
block_offset += block_size
if id == 5:
break
assert CB_A and CD
def unpack_update(image):
global CF, CG
block_offset = 0
for block in range(30):
(block_id, block_build, block_flags, block_entry_point, block_size) = struct.unpack("!2sHLLL", image[block_offset:block_offset+16])
block_size += 0xF
block_size &= ~0xF
id = ord(block_id[1]) & 0xF
print "Found %dBL (build %d) at %08x" % (id, block_build, block_offset)
data = image[block_offset:block_offset+block_size]
if id == 6:
CF = data
elif id == 7:
CG = data
block_offset += block_size
if id == 7:
break
def build(data):
return struct.unpack(">H", data[2:4])[0]
def decrypt_CB(CB):
secret = secret_1BL
key = hmac.new(secret, CB[0x10:0x20], sha).digest()[0:0x10]
CB = CB[0:0x10] + key + RC4.new(key).decrypt(CB[0x20:])
return CB
def decrypt_CB_Cpu(CB):
assert cpukey
secret = CB_A[0x10:0x20]
h = hmac.new(secret,None, sha);
h.update(CB[0x10:0x20]);
h.update(cpukey);
key = h.digest()[0:0x10]
CB = CB[0:0x10] +key+ RC4.new(key).decrypt(CB[0x20:])
return CB
def decrypt_CD(CD, CB):
# enable this code if you want to extract CD from a flash image and you know the cup key.
# disable this when this is a zero-paired image.
# assert cpukey or build(CD) < 1920
secret = CB[0x10:0x20]
key = hmac.new(secret, CD[0x10:0x20], sha).digest()[0:0x10]
# if build(CD) >= 1920:
# key = hmac.new(cpukey, key, sha).digest()[0:0x10]
CD = CD[0:0x10] + key + RC4.new(key).decrypt(CD[0x20:])
return CD
def decrypt_CE(CE, CD):
secret = CD[0x10:0x20]
key = hmac.new(secret, CE[0x10:0x20], sha).digest()[0:0x10]
CE = CE[0:0x10] + key + RC4.new(key).decrypt(CE[0x20:])
return CE
def decrypt_CF(CF):
secret = secret_1BL
key = hmac.new(secret, CF[0x20:0x30], sha).digest()[0:0x10]
CF = CF[0:0x20] + key + RC4.new(key).decrypt(CF[0x30:])
return CF
def decrypt_CG(CG, CF):
secret = CF[0x330:0x330+0x10]
key = hmac.new(secret, CG[0x10:0x20], sha).digest()[0:0x10]
CG = CG[:0x10] + key + RC4.new(key).decrypt(CG[0x20:])
return CG
def decrypt_SMC(SMC):
key = [0x42, 0x75, 0x4e, 0x79]
res = ""
for i in range(len(SMC)):
j = ord(SMC[i])
mod = j * 0xFB
res += chr(j ^ (key[i&3] & 0xFF))
key[(i+1)&3] += mod
key[(i+2)&3] += mod >> 8
return res
def encrypt_CB(CB, random):
secret = secret_1BL
key = hmac.new(secret, random, sha).digest()[0:0x10]
CB = CB[0:0x10] + random + RC4.new(key).encrypt(CB[0x20:])
return CB, key
def encrypt_CB_Cpu(CB):
assert cpukey
secret = CB_A[0x10:0x20]
h = hmac.new(secret,None, sha);
h.update(CB[0x10:0x20]);
h.update(cpukey);
key = h.digest()[0:0x10]
CB = CB[0:0x20] + RC4.new(key).encrypt(CB[0x20:])
return CB, key
def encrypt_CD(CD, CB_key, random):
secret = CB_key
key = hmac.new(secret, random, sha).digest()[0:0x10]
CD = CD[0:0x10] + random + RC4.new(key).encrypt(CD[0x20:])
return CD, key
def encrypt_CE(CE, CD_key, random):
secret = CD_key
key = hmac.new(secret, random, sha).digest()[0:0x10]
CE = CE[0:0x10] + random + RC4.new(key).encrypt(CE[0x20:])
return CE
def encrypt_CF(CF, random):
secret = secret_1BL
key = hmac.new(secret, random, sha).digest()[0:0x10]
CF_key = CF[0x330:0x330+0x10]
CF = CF[0:0x20] + random + RC4.new(key).encrypt(CF[0x30:])
return CF, CF_key
def encrypt_CG(CG, CF_key, random):
secret = CF_key
key = hmac.new(secret, random, sha).digest()[0:0x10]
CG = CG[:0x10] + random + RC4.new(key).encrypt(CG[0x20:])
return CG
def encrypt_SMC(SMC):
key = [0x42, 0x75, 0x4e, 0x79]
res = ""
for i in range(len(SMC)):
j = ord(SMC[i]) ^ (key[i&3] & 0xFF)
mod = j * 0xFB
res += chr(j)
key[(i+1)&3] += mod
key[(i+2)&3] += mod >> 8
return res
draqen escribió:aqui esta una parte del archivo build.py usado en el reset glitch dice como desencrypta y encrypta partes de la nand como el CD el CB_B y toda la leche dice que usa Rc4 cmbinada creo con el cpu key asi saca la secret 1BL y con eso deberia de sacar creo que la public key supongo.#if secret_1BL is None:
# secret_1BL = open("key_1BL.bin", "rb").read()
# Import Psyco if available
try:
import psyco
psyco.full()
except ImportError:
pass
# first, unpack base input image. We are ignoring any updates here
import hmac, sha, struct, sys, binascii
try:
import Crypto.Cipher.ARC4 as RC4
except ImportError:
print "Error importing Crypto.Cipher.ARC4 - please install python-crypto!"
print "You can get it from http://www.dlitz.net/software/pycrypto/"
sys.exit(-1)
def unpack_base_image(image):
global SMC, CB_A, CB_B, CD, CE, Keyvault
if image[0x205] == "\xFF" or image[0x415] == "\xFF" or image[0x200] == "\xFF":
print "ECC'ed - will unecc."
res = ""
for s in range(0, len(image), 528):
res += image[s:s+512]
image = res
unpackstring = "!HHLLL64s5LLLLLLLL"
(id1, build, flags, bloffset, size0, copyright, z0, z1, z2, z3, r7, size1, r3, r4, z5, z6, smc_len, smc_start) = struct.unpack(unpackstring, image[:struct.calcsize(unpackstring)])
#assert not (z0 or z1 or z2 or z3 or z5 or z6), "zeros are not zero."
block_offset = bloffset
SMC = image[smc_start:smc_start+smc_len]
Keyvault = image[0x4000:0x8000]
assert smc_len == 0x3000, "never saw an SMC != 0x3000 bytes"
semi = 0
for block in range(30):
(block_id, block_build, block_flags, block_entry_point, block_size) = struct.unpack("!2sHLLL", image[block_offset:block_offset+16])
block_size += 0xF
block_size &= ~0xF
id = ord(block_id[1]) & 0xF
print "Found %dBL (build %d) at %08x" % (id, block_build, block_offset)
data = image[block_offset:block_offset+block_size]
if id == 2:
if semi == 0:
CB_A = data
semi = 1
elif semi ==1:
CB_B = data
semi = 0
elif id == 4:
CD = data
elif id == 5:
CE = data
block_offset += block_size
if id == 5:
break
assert CB_A and CD
def unpack_update(image):
global CF, CG
block_offset = 0
for block in range(30):
(block_id, block_build, block_flags, block_entry_point, block_size) = struct.unpack("!2sHLLL", image[block_offset:block_offset+16])
block_size += 0xF
block_size &= ~0xF
id = ord(block_id[1]) & 0xF
print "Found %dBL (build %d) at %08x" % (id, block_build, block_offset)
data = image[block_offset:block_offset+block_size]
if id == 6:
CF = data
elif id == 7:
CG = data
block_offset += block_size
if id == 7:
break
def build(data):
return struct.unpack(">H", data[2:4])[0]
def decrypt_CB(CB):
secret = secret_1BL
key = hmac.new(secret, CB[0x10:0x20], sha).digest()[0:0x10]
CB = CB[0:0x10] + key + RC4.new(key).decrypt(CB[0x20:])
return CB
def decrypt_CB_Cpu(CB):
assert cpukey
secret = CB_A[0x10:0x20]
h = hmac.new(secret,None, sha);
h.update(CB[0x10:0x20]);
h.update(cpukey);
key = h.digest()[0:0x10]
CB = CB[0:0x10] +key+ RC4.new(key).decrypt(CB[0x20:])
return CB
def decrypt_CD(CD, CB):
# enable this code if you want to extract CD from a flash image and you know the cup key.
# disable this when this is a zero-paired image.
# assert cpukey or build(CD) < 1920
secret = CB[0x10:0x20]
key = hmac.new(secret, CD[0x10:0x20], sha).digest()[0:0x10]
# if build(CD) >= 1920:
# key = hmac.new(cpukey, key, sha).digest()[0:0x10]
CD = CD[0:0x10] + key + RC4.new(key).decrypt(CD[0x20:])
return CD
def decrypt_CE(CE, CD):
secret = CD[0x10:0x20]
key = hmac.new(secret, CE[0x10:0x20], sha).digest()[0:0x10]
CE = CE[0:0x10] + key + RC4.new(key).decrypt(CE[0x20:])
return CE
def decrypt_CF(CF):
secret = secret_1BL
key = hmac.new(secret, CF[0x20:0x30], sha).digest()[0:0x10]
CF = CF[0:0x20] + key + RC4.new(key).decrypt(CF[0x30:])
return CF
def decrypt_CG(CG, CF):
secret = CF[0x330:0x330+0x10]
key = hmac.new(secret, CG[0x10:0x20], sha).digest()[0:0x10]
CG = CG[:0x10] + key + RC4.new(key).decrypt(CG[0x20:])
return CG
def decrypt_SMC(SMC):
key = [0x42, 0x75, 0x4e, 0x79]
res = ""
for i in range(len(SMC)):
j = ord(SMC[i])
mod = j * 0xFB
res += chr(j ^ (key[i&3] & 0xFF))
key[(i+1)&3] += mod
key[(i+2)&3] += mod >> 8
return res
def encrypt_CB(CB, random):
secret = secret_1BL
key = hmac.new(secret, random, sha).digest()[0:0x10]
CB = CB[0:0x10] + random + RC4.new(key).encrypt(CB[0x20:])
return CB, key
def encrypt_CB_Cpu(CB):
assert cpukey
secret = CB_A[0x10:0x20]
h = hmac.new(secret,None, sha);
h.update(CB[0x10:0x20]);
h.update(cpukey);
key = h.digest()[0:0x10]
CB = CB[0:0x20] + RC4.new(key).encrypt(CB[0x20:])
return CB, key
def encrypt_CD(CD, CB_key, random):
secret = CB_key
key = hmac.new(secret, random, sha).digest()[0:0x10]
CD = CD[0:0x10] + random + RC4.new(key).encrypt(CD[0x20:])
return CD, key
def encrypt_CE(CE, CD_key, random):
secret = CD_key
key = hmac.new(secret, random, sha).digest()[0:0x10]
CE = CE[0:0x10] + random + RC4.new(key).encrypt(CE[0x20:])
return CE
def encrypt_CF(CF, random):
secret = secret_1BL
key = hmac.new(secret, random, sha).digest()[0:0x10]
CF_key = CF[0x330:0x330+0x10]
CF = CF[0:0x20] + random + RC4.new(key).encrypt(CF[0x30:])
return CF, CF_key
def encrypt_CG(CG, CF_key, random):
secret = CF_key
key = hmac.new(secret, random, sha).digest()[0:0x10]
CG = CG[:0x10] + random + RC4.new(key).encrypt(CG[0x20:])
return CG
def encrypt_SMC(SMC):
key = [0x42, 0x75, 0x4e, 0x79]
res = ""
for i in range(len(SMC)):
j = ord(SMC[i]) ^ (key[i&3] & 0xFF)
mod = j * 0xFB
res += chr(j)
key[(i+1)&3] += mod
key[(i+2)&3] += mod >> 8
return res
draqen escribió:Here are some keys that you use for decrypting filesystem and Cx sections in a NAND dump.
These keys were taken out of a Xenon console, but should work on other mobos too.
1BL: DD88AD0C9ED669E7B56794FB68563EFA
CPU: Unique on each console, you need to dump your own.
XEX1: A26C10F71FD935E98B99922CE9321572
XEX2: 20B185A59D28FDC340583FBB0896BF91
kvnkain escribió:draqen escribió:Here are some keys that you use for decrypting filesystem and Cx sections in a NAND dump.
These keys were taken out of a Xenon console, but should work on other mobos too.
1BL: DD88AD0C9ED669E7B56794FB68563EFA
CPU: Unique on each console, you need to dump your own.
XEX1: A26C10F71FD935E98B99922CE9321572
XEX2: 20B185A59D28FDC340583FBB0896BF91
ok logramos arrancar el sistema, pero dio E78 , esas key son para descifrar partes de la nand, el 1BL descifra el 2BL, y los dos XEX son para los xex de microsoft
kvnkain escribió:Creo que mejor se deveria tratar de hacer arrancar el freeboot con el Glitch hack, ahi que lograr que el CD arranque, y tiene comprobaciones de SHA1
acost91 escribió:Wow menudo trabajo y menudas claves, 617 caracteres.. Si lo he entendido bien (la mitad de esto para mi es chino) esto serviría para firmar los dlc que se bajan del online y poderlos meter en el disco, y así sin tener rgh poder instalar con una consola flasheada (imagino que tendrá que estarlo para leer ese disco) cualquier dlc y no solo los que vienen en dvd. Y aparte también para modificar esos dlc a gusto de cada uno..
acost91 escribió:Claro! Ibamos a salir en las noticias. Miles de personas se unen compartiendo sus ordenadores para hackear las claves de la xbox 360.
DrackeM escribió: [...], no te desanimes si existe alguno que que te hecha tierra, creeme que esto es un paso gigante en la scence [...]