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 [2025/03/19 14:22] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ==== Outil d' | ||
| + | |||
| 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: (external edit)
