Compare commits
No commits in common. "7868b86e48d053a4ddec90c4562bf26022b8be16" and "6ab4de1ddbaf5a1813d19fe23488bc89f98626f7" have entirely different histories.
7868b86e48
...
6ab4de1ddb
4 changed files with 0 additions and 150 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,4 +0,0 @@
|
||||||
fk98
|
|
||||||
*.core
|
|
||||||
obj/
|
|
||||||
misc/
|
|
23
Makefile
23
Makefile
|
@ -1,23 +0,0 @@
|
||||||
CC := gcc
|
|
||||||
.ifdef DEBUG
|
|
||||||
CFLAGS := -DDEBUG -ggdb
|
|
||||||
.else
|
|
||||||
CFLAGS :=
|
|
||||||
.endif
|
|
||||||
|
|
||||||
.PHONY: all
|
|
||||||
all: config.o corrupt.o dosfs.o main.o
|
|
||||||
$(CC) $(CFLAGS) -o fk98 obj/config.o obj/corrupt.o obj/dosfs.o obj/main.o
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
rm -r ${.CURDIR}/obj
|
|
||||||
rm ${.CURDIR}/fk98
|
|
||||||
|
|
||||||
.SUFFIXES: .o
|
|
||||||
.PATH: src
|
|
||||||
.c.o: obj
|
|
||||||
$(CC) $(CFLAGS) -o obj/${.TARGET} -c ${.IMPSRC}
|
|
||||||
|
|
||||||
obj:
|
|
||||||
mkdir obj
|
|
113
src/corrupt.c
113
src/corrupt.c
|
@ -1,113 +0,0 @@
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "corrupt.h"
|
|
||||||
#include "debug.h"
|
|
||||||
#include "dosfs.h"
|
|
||||||
|
|
||||||
static uint32_t xs_rand(uint32_t);
|
|
||||||
static uint32_t xs_randb(uint32_t *, uint32_t, uint32_t);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Finds the rule (if any) that matches the given file. If no rule
|
|
||||||
* matches, the function returns NULL.
|
|
||||||
*/
|
|
||||||
config_t *
|
|
||||||
match_rule(config_t *conf, dosfile_t *file)
|
|
||||||
{
|
|
||||||
config_t *cur;
|
|
||||||
int match;
|
|
||||||
|
|
||||||
for (cur = conf; cur != NULL; cur = cur->next) {
|
|
||||||
match = 0;
|
|
||||||
match += ((cur->filename[0] == '*' && cur->filename[1] == 0) ||
|
|
||||||
(!strncmp(cur->filename, file->fname, 8)));
|
|
||||||
|
|
||||||
match += ((cur->ext[0] == '*' && cur->ext[1] == 0) ||
|
|
||||||
(!strncmp(cur->ext, file->fext, 3)));
|
|
||||||
|
|
||||||
if (match >= 2)
|
|
||||||
return cur;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Corrupts the given dosfile_t according to conf.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
corrupt_file(dosfs_t *fsd, dosfile_t *file, config_t *conf, uint32_t *state)
|
|
||||||
{
|
|
||||||
uint32_t off;
|
|
||||||
int real_off;
|
|
||||||
unsigned char c;
|
|
||||||
struct conf_opts_t opts;
|
|
||||||
|
|
||||||
opts = conf->opts;
|
|
||||||
for (off = conf->start; (off < conf->end) && (off < file->ent.size);
|
|
||||||
off += xs_randb(state, conf->skip_a, conf->skip_b)) {
|
|
||||||
real_off = get_byte_offset(fsd, file, off);
|
|
||||||
if (real_off < 0) {
|
|
||||||
DPRINTF(("get_byte_offset returned %s", strerror(real_off * -1)));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pread(fsd->ifd, &c, 1, real_off) == -1) {
|
|
||||||
perror("file read failed");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The fun part! Originally the plan was to check for each
|
|
||||||
* function (i.e., "is it zero or not") before running the
|
|
||||||
* operations, but zero shift, add, and xor should be just as
|
|
||||||
* efficient as a bunch of if statements. Might be flawed
|
|
||||||
* logic, let me know if it is!
|
|
||||||
*/
|
|
||||||
c = c >> opts.shr;
|
|
||||||
c = c << opts.shl;
|
|
||||||
c += opts.add;
|
|
||||||
c ^= opts.bit_xor;
|
|
||||||
|
|
||||||
if (pwrite(fsd->ifd, &c, 1, real_off) == -1) {
|
|
||||||
perror("file write failed");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Generates a random number within two bounds.
|
|
||||||
*/
|
|
||||||
static uint32_t
|
|
||||||
xs_randb(uint32_t *state, uint32_t lower, uint32_t upper)
|
|
||||||
{
|
|
||||||
*state = xs_rand(*state);
|
|
||||||
/* if we're already between, just roll with it */
|
|
||||||
if (*state <= upper && *state >= lower) {
|
|
||||||
return *state;
|
|
||||||
}
|
|
||||||
return ((*state % (upper - lower)) + lower);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Implement xorshift for randomness
|
|
||||||
*/
|
|
||||||
static uint32_t
|
|
||||||
xs_rand(uint32_t in)
|
|
||||||
{
|
|
||||||
uint32_t out;
|
|
||||||
|
|
||||||
out = in;
|
|
||||||
out ^= in << 13;
|
|
||||||
out ^= out >> 17;
|
|
||||||
out ^= out << 5;
|
|
||||||
return out;
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
#ifndef _CORRUPT_H
|
|
||||||
#define _CORRUPT_H
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "dosfs.h"
|
|
||||||
|
|
||||||
config_t *match_rule(config_t *, dosfile_t *);
|
|
||||||
int corrupt_file(dosfs_t *, dosfile_t *, config_t *, uint32_t *);
|
|
||||||
|
|
||||||
#endif /* !_CORRUPT_H */
|
|
Loading…
Reference in a new issue