begin implementing similarity comparison tool.
This commit is contained in:
1 parent
924a8c9568
commit
2391e74bd2
2 files changed
+85
No files matched your search
@@ -6,6 +6,9 @@ src/collect_data: src/collect_data.c Makefile
|
|||||||
src/preprocess: src/preprocess.c Makefile
|
src/preprocess: src/preprocess.c Makefile
|
||||||
gcc -g -Wall -o src/preprocess src/preprocess.c
|
gcc -g -Wall -o src/preprocess src/preprocess.c
|
||||||
|
|
||||||
|
src/similarity: src/similarity.c Makefile
|
||||||
|
gcc -g -Wall -o src/similarity src/similarity.c
|
||||||
|
|
||||||
src/make_error_tables: src/make_error_tables.c Makefile
|
src/make_error_tables: src/make_error_tables.c Makefile
|
||||||
gcc -g -Wall -o src/make_error_tables src/make_error_tables.c
|
gcc -g -Wall -o src/make_error_tables src/make_error_tables.c
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
Simple program to find matching strings between two binaries
|
||||||
|
and report on the statistics of their lengths, and show the
|
||||||
|
longer ones. Used to defend against copyright infringement
|
||||||
|
claims.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define MAX_SIZE 8192
|
||||||
|
int matches[MAX_SIZE];
|
||||||
|
|
||||||
|
int main(int argc,char **argv)
|
||||||
|
{
|
||||||
|
if (argc!=3) {
|
||||||
|
fprintf(stderr,"usage: similarity <file1> <file2>\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i=0;i<MAX_SIZE;i++) matches[i]=0;
|
||||||
|
|
||||||
|
unsigned char *f1,*f2;
|
||||||
|
int s1,s2;
|
||||||
|
struct stat st;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = open(argv[1], O_RDONLY, 0);
|
||||||
|
if (fd==-1) {
|
||||||
|
fprintf(stderr,"Could not read '%s'\n",argv[1]);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
stat(argv[1], &st);
|
||||||
|
s1=st.st_size;
|
||||||
|
f1 = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE | MAP_POPULATE, fd, 0);
|
||||||
|
if (f1== MAP_FAILED) {
|
||||||
|
fprintf(stderr,"Could not mmap '%s'\n",argv[1]);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
fd = open(argv[2], O_RDONLY, 0);
|
||||||
|
if (fd==-1) {
|
||||||
|
fprintf(stderr,"Could not read '%s'\n",argv[2]);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
stat(argv[2], &st);
|
||||||
|
s2=st.st_size;
|
||||||
|
f2 = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE | MAP_POPULATE, fd, 0);
|
||||||
|
if (f2 == MAP_FAILED) {
|
||||||
|
fprintf(stderr,"Could not mmap '%s'\n",argv[2]);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr,"Searching files for similarities...\n");
|
||||||
|
|
||||||
|
for(int i=0;i<s1;i++) {
|
||||||
|
for(int j=0;j<s2;j++) {
|
||||||
|
int k,l;
|
||||||
|
for(k=0;((i+k)<s1)&&((j+k)<s2);k++)
|
||||||
|
if (f1[i+k]!=f2[j+k]) break;
|
||||||
|
// Ignore matches that are all the same byte
|
||||||
|
for(l=1;l<k;l++) if (f1[i+l]!=f1[i]) break;
|
||||||
|
if (l<k) {
|
||||||
|
if (k) matches[k]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i=0;i<MAX_SIZE;i++) {
|
||||||
|
if (matches[i])
|
||||||
|
printf("%6d matches of %d bytes\n",matches[i],i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in new issue
Block a user