outil_d_analyse_des_fichiers_nanoreseau
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
outil_d_analyse_des_fichiers_nanoreseau [2019/07/01 16:10] – created fool-duplex | outil_d_analyse_des_fichiers_nanoreseau [2019/07/01 16:12] (current) – fool-duplex | ||
---|---|---|---|
Line 1: | Line 1: | ||
Cet outil décode les entêtes des fichiers Nanoréseau et permet d'en extraire les sections binaires. | Cet outil décode les entêtes des fichiers Nanoréseau et permet d'en extraire les sections binaires. | ||
+ | |||
+ | Exemple d' | ||
< | < | ||
+ | $ nrfile -e NRDOS.MO5 | ||
+ | |||
+ | NRFile, version 1.0 | ||
+ | |||
+ | File: NRDOS.MO5 (7552 bytes) | ||
+ | |||
+ | Header: | ||
+ | | ||
+ | File type: binary | ||
+ | File mode: binary | ||
+ | File status: read/write | ||
+ | | ||
+ | | ||
+ | Last modification date: 27/05/85 | ||
+ | | ||
+ | | ||
+ | File attributes: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ||
+ | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ||
+ | |||
+ | Binary contents: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Code section 1: | ||
+ | Size: 7373 bytes | ||
+ | Load address: 00-5000 (do not switch RAM page) | ||
+ | |||
+ | Section has been dumped to NRDOS.MO5-00-5000.bin. | ||
+ | |||
+ | | ||
+ | </ | ||
+ | |||
+ | Code source : | ||
+ | < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | // Undefine this for Unix-like systems | ||
+ | #define PATH_WINDOWS | ||
+ | |||
+ | int gExtract = 0; | ||
+ | |||
+ | FILE *gSource = NULL; | ||
+ | unsigned char *gBuffer = NULL; | ||
+ | char *gFilename = NULL; | ||
+ | long gSize = 0; | ||
+ | |||
+ | char gIdentifier[9] = {0}; | ||
+ | unsigned char gFileType = 0; | ||
+ | |||
+ | void TargetApp(unsigned char xByte) | ||
+ | { | ||
+ | switch (xByte) | ||
+ | { | ||
+ | case 0: | ||
+ | printf(" | ||
+ | break; | ||
+ | case 1: | ||
+ | printf(" | ||
+ | break; | ||
+ | case 2: | ||
+ | printf(" | ||
+ | break; | ||
+ | case 3: | ||
+ | printf(" | ||
+ | break; | ||
+ | default: | ||
+ | printf(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | void TargetComputer(unsigned char xByte) | ||
+ | { | ||
+ | | ||
+ | { | ||
+ | case 0: | ||
+ | printf(" | ||
+ | break; | ||
+ | case 1: | ||
+ | printf(" | ||
+ | break; | ||
+ | case 2: | ||
+ | printf(" | ||
+ | break; | ||
+ | default: | ||
+ | printf(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void PageSwitch(unsigned char xPage) | ||
+ | { | ||
+ | switch (xPage) | ||
+ | { | ||
+ | case 0: | ||
+ | printf(" | ||
+ | break; | ||
+ | |||
+ | case 0x40: | ||
+ | case 0x41: | ||
+ | case 0x42: | ||
+ | case 0x43: | ||
+ | case 0x44: | ||
+ | case 0x45: | ||
+ | printf(" | ||
+ | break; | ||
+ | |||
+ | case 0x80: | ||
+ | case 0x81: | ||
+ | case 0x82: | ||
+ | case 0x83: | ||
+ | printf(" | ||
+ | break; | ||
+ | |||
+ | case 0xff: | ||
+ | printf(" | ||
+ | break; | ||
+ | |||
+ | default: | ||
+ | printf(" | ||
+ | } | ||
+ | printf(" | ||
+ | } | ||
+ | |||
+ | void AnalyseBinExt(unsigned char *xpBuffer) | ||
+ | { | ||
+ | long lOffset = 38; | ||
+ | unsigned int lSection = 1, lSize = 0, lAddress = 0; | ||
+ | char lBuffer[33] = {0}; | ||
+ | char *lFilename = NULL; | ||
+ | unsigned char lPage = 0; | ||
+ | FILE *lDump = NULL; | ||
+ | |||
+ | printf(" | ||
+ | TargetComputer(xpBuffer[1]); | ||
+ | printf(" | ||
+ | |||
+ | printf(" | ||
+ | TargetApp(xpBuffer[2]); | ||
+ | printf(" | ||
+ | |||
+ | printf(" | ||
+ | if (xpBuffer[3]& | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | if (xpBuffer[3]& | ||
+ | { | ||
+ | if (xpBuffer[3]& | ||
+ | { | ||
+ | printf(", | ||
+ | } | ||
+ | printf(" | ||
+ | } | ||
+ | printf(" | ||
+ | |||
+ | strncpy(lBuffer, | ||
+ | printf(" | ||
+ | |||
+ | while (xpBuffer[lOffset]!=3) | ||
+ | { | ||
+ | printf(" | ||
+ | lSize = xpBuffer[lOffset+1]*256+xpBuffer[lOffset+2]; | ||
+ | lPage = xpBuffer[lOffset+5]; | ||
+ | printf(" | ||
+ | lAddress = xpBuffer[lOffset+3]*256+xpBuffer[lOffset+4]; | ||
+ | printf(" | ||
+ | |||
+ | PageSwitch(lPage); | ||
+ | printf(" | ||
+ | |||
+ | if (gExtract) | ||
+ | { | ||
+ | lFilename = (char*)malloc(strlen(gFilename+11)); | ||
+ | sprintf(lFilename," | ||
+ | lDump = fopen(lFilename," | ||
+ | fwrite(xpBuffer+lOffset+6, | ||
+ | fclose(lDump); | ||
+ | printf(" | ||
+ | free(lFilename); | ||
+ | } | ||
+ | |||
+ | lOffset += 6+lSize; | ||
+ | |||
+ | lSection++; | ||
+ | } | ||
+ | |||
+ | lPage = xpBuffer[lOffset+5]; | ||
+ | printf(" | ||
+ | PageSwitch(lPage); | ||
+ | } | ||
+ | |||
+ | void AnalyseBinSimple(unsigned char *xpBuffer) | ||
+ | { | ||
+ | long lOffset = 0; | ||
+ | unsigned int lSection = 1, lSize = 0, lAddress = 0; | ||
+ | char *lFilename = NULL; | ||
+ | FILE *lDump = NULL; | ||
+ | |||
+ | while (xpBuffer[lOffset]==0) | ||
+ | { | ||
+ | printf(" | ||
+ | lSize = xpBuffer[lOffset+1]*256+xpBuffer[lOffset+2]; | ||
+ | printf(" | ||
+ | lAddress = xpBuffer[lOffset+3]*256+xpBuffer[lOffset+4]; | ||
+ | printf(" | ||
+ | printf(" | ||
+ | |||
+ | if (gExtract) | ||
+ | { | ||
+ | lFilename = (char*)malloc(strlen(gFilename+11)); | ||
+ | sprintf(lFilename," | ||
+ | lDump = fopen(lFilename," | ||
+ | fwrite(xpBuffer+lOffset+6, | ||
+ | fclose(lDump); | ||
+ | printf(" | ||
+ | free(lFilename); | ||
+ | } | ||
+ | |||
+ | lOffset += 5+lSize; | ||
+ | lSection++; | ||
+ | } | ||
+ | |||
+ | printf(" | ||
+ | } | ||
+ | |||
+ | void AnalyseBin(unsigned char *xpBuffer) | ||
+ | { | ||
+ | printf(" | ||
+ | if (xpBuffer[0] == 1) | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } else | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void ExtractFilename(char *xSrcStr, char **xStrDst) | ||
+ | { | ||
+ | char *lPtr = strrchr(xSrcStr, | ||
+ | #ifdef PATH_WINDOWS | ||
+ | ' | ||
+ | #else | ||
+ | '/' | ||
+ | #endif // PATH_WINDOWS | ||
+ | ); | ||
+ | |||
+ | if (lPtr==NULL) | ||
+ | { | ||
+ | *xStrDst = (char*) malloc(strlen(xSrcStr)); | ||
+ | strcpy(*xStrDst, | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | *xStrDst = (char*) malloc(strlen(lPtr)); | ||
+ | strcpy(*xStrDst, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void usage() | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | |||
+ | int main(int argc, char *argv[]) | ||
+ | { | ||
+ | long i; | ||
+ | |||
+ | printf(" | ||
+ | if ((argc!=2)&& | ||
+ | { | ||
+ | usage(); | ||
+ | return -1; | ||
+ | } | ||
+ | |||
+ | if (argv[1][0]==' | ||
+ | { | ||
+ | if (argc!=3) | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | if (argv[1][1] == ' | ||
+ | { | ||
+ | gExtract = 1; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } else if (argc!=2) | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | if (gExtract) | ||
+ | { | ||
+ | ExtractFilename(argv[2],& | ||
+ | gSource = fopen(argv[2]," | ||
+ | } else | ||
+ | { | ||
+ | ExtractFilename(argv[1],& | ||
+ | gSource = fopen(argv[1]," | ||
+ | } | ||
+ | |||
+ | if (gSource == NULL) | ||
+ | { | ||
+ | printf(" | ||
+ | free(gFilename); | ||
+ | return -2; | ||
+ | } | ||
+ | |||
+ | fseek(gSource, | ||
+ | gSize = ftell(gSource); | ||
+ | fseek(gSource, | ||
+ | |||
+ | gBuffer = malloc(gSize); | ||
+ | if (gBuffer == NULL) | ||
+ | { | ||
+ | printf(" | ||
+ | free(gFilename); | ||
+ | fclose(gSource); | ||
+ | return -3; | ||
+ | } | ||
+ | memset(gBuffer, | ||
+ | |||
+ | fread(gBuffer, | ||
+ | fclose(gSource); | ||
+ | |||
+ | if (strnicmp((char*)gBuffer," | ||
+ | { | ||
+ | printf(" | ||
+ | free(gBuffer); | ||
+ | free(gFilename); | ||
+ | return -4; | ||
+ | } | ||
+ | |||
+ | printf(" | ||
+ | printf(" | ||
+ | |||
+ | strncpy(gIdentifier, | ||
+ | printf(" | ||
+ | if (strncmp(gIdentifier," | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | printf(" | ||
+ | |||
+ | gFileType = gBuffer[17]; | ||
+ | printf(" | ||
+ | switch (gFileType) | ||
+ | { | ||
+ | case 0: | ||
+ | printf(" | ||
+ | break; | ||
+ | case 1: | ||
+ | printf(" | ||
+ | break; | ||
+ | case 2: | ||
+ | printf(" | ||
+ | break; | ||
+ | case 3: | ||
+ | printf(" | ||
+ | break; | ||
+ | case 5: | ||
+ | printf(" | ||
+ | break; | ||
+ | default: | ||
+ | printf(" | ||
+ | } | ||
+ | printf(" | ||
+ | |||
+ | printf(" | ||
+ | switch (gBuffer[18]) | ||
+ | { | ||
+ | case 0: | ||
+ | printf(" | ||
+ | break; | ||
+ | case 0xff: | ||
+ | printf(" | ||
+ | break; | ||
+ | default: | ||
+ | printf(" | ||
+ | } | ||
+ | printf(" | ||
+ | |||
+ | printf(" | ||
+ | switch (gBuffer[23]) | ||
+ | { | ||
+ | case 0: | ||
+ | printf(" | ||
+ | break; | ||
+ | case 0xff: | ||
+ | printf(" | ||
+ | break; | ||
+ | default: | ||
+ | printf(" | ||
+ | } | ||
+ | printf(" | ||
+ | |||
+ | printf(" | ||
+ | |||
+ | printf(" | ||
+ | printf(" | ||
+ | if ((gBuffer[29] == 0)&& | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | printf(" | ||
+ | |||
+ | printf(" | ||
+ | TargetComputer(gBuffer[32]); | ||
+ | printf(" | ||
+ | |||
+ | printf(" | ||
+ | TargetApp(gBuffer[33]); | ||
+ | printf(" | ||
+ | |||
+ | printf(" | ||
+ | for (i=80; | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | for (i=96; | ||
+ | { | ||
+ | if (i%16==0) | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | printf(" | ||
+ | |||
+ | } | ||
+ | printf(" | ||
+ | |||
+ | if (gFileType == 2) | ||
+ | { | ||
+ | AnalyseBin(gBuffer+128); | ||
+ | } | ||
+ | |||
+ | free(gBuffer); | ||
+ | free(gFilename); | ||
+ | return 0; | ||
+ | } | ||
</ | </ |
outil_d_analyse_des_fichiers_nanoreseau.1561990253.txt.gz · Last modified: 2019/07/01 16:10 by fool-duplex