[360] Ayuda con fuente para extraer unos bytes un archivo

Un saludo a todos, no suelo preguntar cosas por aqui porque aunque tenga nociones de programacion, lo que sabia apenas me acuerdo y solo era en Ensablador y de C, aunque si hacer scripts en bat lo considerais programar, en esto domino mas. XD

El caso es que necesito verificar si los Firmwares (archivos de 256 KB) disponen del checksum o esta a 00000000, este ocupa 4 Bytes y se encuentra desde el offset 3E7FC hasta el 3E7FF.

Estos datos tengo que buscarlos en hexadecimal y el comando find no me sirve porque no son caracteres.

Mi intencion es generar un archivo de texto (checksum.txt) que tenga el valor del checksum de manera que el txt se vea "D5941510" y no "....".

Como tengo el fuente en C#, del identificador de firmwares que hizo Xisko, en el cual he colaborado, basicamente solo tenia que quitar bastantes trozos y cambiar 4 direcciones para que funcione.

Os estaria muy agradecido si pudierais ayudarme. Como su funcion es para la 360 despues de mirarme las normas espero que no sea problema. Dejo el fuente y la lista de errores que me da el DJGPP.

Un saludo.

pd: No me deis una colleja si veis cualquier cosa rara.

Errores:

checksum.c:12: error: conflicting types for `key'
checksum.c:11: error: previous declaration of `key'
checksum.c:12: warning: data definition has no type or storage class
checksum.c:13: warning: parameter names (without types) in function declaration
checksum.c:13: warning: conflicting types for built-in function `fprintf'
checksum.c:13: warning: data definition has no type or storage class
checksum.c:14: warning: parameter names (without types) in function declaration
checksum.c:14: error: conflicting types for `checksumdata'
checksum.c:5: error: previous declaration of `checksumdata'
checksum.c:14: warning: data definition has no type or storage class
checksum.c:15: warning: parameter names (without types) in function declaration
checksum.c:15: error: conflicting types for `printkey'
checksum.c:7: error: previous declaration of `printkey'
checksum.c:15: warning: data definition has no type or storage class
checksum.c:16: warning: parameter names (without types) in function declaration
checksum.c:16: warning: data definition has no type or storage class
checksum.c:17: error: syntax error before "return"
checksum.c:20: error: conflicting types for `checksumdata'
checksum.c:14: error: previous declaration of `checksumdata'
checksum.c:38: error: conflicting types for `printkey'
checksum.c:15: error: previous declaration of `printkey'
checksum.c: In function `printkey':
checksum.c:48: error: syntax error at end of input

Adjuntos

Te faltan cosillas en el programa (la funcion main, abrir el fichero del firmware y detalles asi), pero creo que lo entiendo y voy a tratar de arreglartelo :)

Lo unico malo, es que yo ahora mismo, no tengo el Visual C instalado, debido a que se me jodió la partición del Windows y estoy usando el compilador gcc desde MinGW y el exe te tocara compilarlo a ti, pero vamos, veras que facil te va a resultar :)


EDITADO:

Bueno, ya te lo he hecho y parece que rula como debe :).

Te subo el fichero checksum.c para que lo compiles como mas te guste. Con los compiladores gcc, puedes usar este comando:

gcc -o checksum.exe checksum.c

El programa funciona asi:

checksum firmware.bin

y el se encarga de ir añadiendo los resultados en el fichero checksum.txt de esta forma:

Checksum en basura.bin:
5FACAB63


Bien, he añadido algo más que a lo mejor te resulta util (o no)

checksum firmware.bin -r

Esto crearia un fichero checksum.txt nuevo en el que solo tendrias el checksum de firmware.bin, eliminando los resultados anteriores

Adjuntos

Hermes, muchas gracias por todo la ayuda. Incluso has comentado las funciones.

Al compilar siguen dando errores . :?

errores:

checksum.c:3: error: syntax error before '*' token
checksum.c:4: error: syntax error before '*' token
checksum.c:5: error: syntax error before '*' token
checksum.c:10: error: syntax error before '*' token
checksum.c: In function `checksumdata':
checksum.c:12: error: `file' undeclared (first use in this function)
checksum.c:12: error: (Each undeclared identifier is reported only onc
checksum.c:12: error: for each function it appears in.)
checksum.c:12: error: `SEEK_SET' undeclared (first use in this functio
checksum.c: At top level:
checksum.c:19: error: syntax error before '*' token
checksum.c: In function `leerKey':
checksum.c:21: error: `result' undeclared (first use in this function)
checksum.c: At top level:
checksum.c:29: error: syntax error before '*' token
checksum.c: In function `printkey':
checksum.c:35: error: `key' undeclared (first use in this function)
checksum.c: In function `main':
checksum.c:45: error: `FILE' undeclared (first use in this function)
checksum.c:45: error: `file' undeclared (first use in this function)
checksum.c:45: error: `key' undeclared (first use in this function)
checksum.c:75: error: `NULL' undeclared (first use in this function)
Bajatelo de nuevo, que ahora esta en formato zip

Por alguna razon, se han perdido los include al subir el fichero [+risas]

¿como puede ser que yo suba un fichero que tiene los includes y desaparezcan al subir? Que me expliquen [agggtt]
Hermes escribió:Bajatelo de nuevo, que ahora esta en formato zip

Por alguna razon, se han perdido los include al subir el fichero [+risas]

¿como puede ser que yo suba un fichero que tiene los includes y desaparezcan al subir? Que me expliquen [agggtt]


Genia, funciona perfecto. Que mal estoy que ni me he dado cuenta que faltaban los include. [bye]
Flash78 escribió:
Genia, funciona perfecto. Que mal estoy que ni me he dado cuenta que faltaban los include. [bye]


Lo de los include, me tiene flipado, no se como han desaparecido, pero en cuanto he visto los errores que me listabas, me he supuesto que era un problema de ese tipo.

Te he añadido algo de código 'superfluo' porque pienso que te será util en el futuro: añadir parametros que te permitan usar el mismo programa para obtener diferentes resultados o lo de "acortar" el nombre del fichero para eliminar el path, cosas que podrias necesitar en el futuro :)

En fin, suerte con lo que estás haciendo y animate con el C que está chupado ;)
He detectado un caso concreto donde no se guarda el checksum. Concretamente es cuando el archivo tiene el valor 00000000, Esto pasaba con el verificador de firmwares y se que un compañero lo corrigio cambiando una instruccion o añadiendo "02X" en el printf para que en vez de 0 se viese 00.

He probado a cambiarlo y tras unas cuantas compilaciones me he rendido.

Sabes como solucionarlo? Si es complicado ya me espero al lunes que podre preguntar en el trabajo.

Un saludo y gracias por todo como lo de acortar el path, cosa que me resulta util.
Flash78 escribió:He detectado un caso concreto donde no se guarda el checksum. Concretamente es cuando el archivo tiene el valor 00000000, Esto pasaba con el verificador de firmwares y se que un compañero lo corrigio cambiando una instruccion o añadiendo "02X" en el printf para que en vez de 0 se viese 00.

He probado a cambiarlo y tras unas cuantas compilaciones me he rendido.

Sabes como solucionarlo? Si es complicado ya me espero al lunes que podre preguntar en el trabajo.

Un saludo y gracias por todo como lo de acortar el path, cosa que me resulta util.


Esta chupando nen:

Mira en la funcion printkey, concretamente esto

if (skey[0] != 0 || skey[1] != 0)

Eso hace que el codigo que le sigue (la impresion de la key tanto en pantalla como en el fichero) no se haga si alguno de esos dos valores es igual a 0

Quita el if o sustituye eso por un if(1) y eso hara que siempre se imprima el resultado, sea cual sea
pozi, ahora ya ta. Ahora que lo dices me doi cuenta que estaba añadido originalmente a proposito para que no salieran las keys que estaban a 0000. [+risas]
8 respuestas