123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- #include <stdio.h>
- #include <stdlib.h>
- static unsigned char *ptr[100];
- static int ptrc;
- #define M 256
- static struct
- {
- int pos;
- int cnt;
- } max[M];
- static int active[100];
- static int activec;
- static int active_pos;
- static void
- fill_max(void)
- {
- int i, n, b, c, u;
- memset(max, 0, sizeof(max));
- for (b = 0; b < 0x800; b++)
- {
- c = 0;
- for (i = 0; i < activec; i++)
- {
- for (u = i + 1; u < activec; u++)
- {
- if (ptr[active[i]][b] == ptr[active[u]][b])
- {
- goto bad;
- }
- }
- c ++;
- bad:;
- }
- for (i = 0; i < M; i ++)
- {
- if (max[i].cnt < c)
- {
- max[i].pos = b;
- max[i].cnt = c;
- break;
- }
- }
- }
- }
- static void
- select_max(void)
- {
- int i, m, c;
- m = max[0].cnt;
- if (max[0].cnt == 1)
- {
- printf("no solution!\n");
- exit(1);
- }
- c = 0;
- for (i = 0; i < M; i++)
- {
- if (m == max[i].cnt)
- {
- c++;
- }
- }
- i = random() % c;
- active_pos = max[i].pos;
- printf("0x%03X (%d) ", active_pos, max[i].cnt);
- }
- static void
- search_active(void)
- {
- int i, j, a;
- int tmpa[100];
- a = 0;
- for (i = 0; i < activec; i++)
- {
- for (j = 0; j < activec; j++)
- {
- if (i == j)
- {
- continue;
- }
- if (ptr[active[i]][active_pos] ==
- ptr[active[j]][active_pos])
- {
- tmpa[a] = active[i];
- a++;
- break;
- }
- }
- }
- printf("(%d) ", a);
- for (i = 0; i < activec; i++)
- {
- printf("%02X ", ptr[active[i]][active_pos]);
- }
- printf("\n");
- memcpy(active, tmpa, sizeof(active));
- activec = a;
- }
- int
- main(int argc, char *argv[])
- {
- int i, u, b, c;
- FILE *f;
- srandom(time(NULL));
- ptrc = argc - 1;
- /*
- * read data
- */
- for (i = 0; i < ptrc; i++)
- {
- ptr[i] = malloc(0x800);
- f = fopen(argv[i + 1], "rb");
- fread(ptr[i], 1, 0x800, f);
- fclose(f);
- active[i] = i;
- }
- activec = ptrc;
- while (activec > 0)
- {
- fill_max();
- select_max();
- search_active();
- }
- return 0;
- }
|