Blame


1 a84cbb2a 2004-04-19 devnull #include <u.h>
2 a84cbb2a 2004-04-19 devnull #include <libc.h>
3 a84cbb2a 2004-04-19 devnull #include <bio.h>
4 a84cbb2a 2004-04-19 devnull #include <mach.h>
5 a84cbb2a 2004-04-19 devnull
6 a84cbb2a 2004-04-19 devnull static struct
7 a84cbb2a 2004-04-19 devnull {
8 a84cbb2a 2004-04-19 devnull ulong magic;
9 a84cbb2a 2004-04-19 devnull int (*fn)(int, Fhdr*);
10 a84cbb2a 2004-04-19 devnull } cracktab[] = {
11 a84cbb2a 2004-04-19 devnull 0x7F454C46, crackelf,
12 a84cbb2a 2004-04-19 devnull 0xFEEDFACE, crackmacho,
13 a84cbb2a 2004-04-19 devnull };
14 a84cbb2a 2004-04-19 devnull
15 a84cbb2a 2004-04-19 devnull Fhdr*
16 a84cbb2a 2004-04-19 devnull crackhdr(char *name, int mode)
17 a84cbb2a 2004-04-19 devnull {
18 a84cbb2a 2004-04-19 devnull uchar buf[4];
19 a84cbb2a 2004-04-19 devnull ulong magic;
20 a84cbb2a 2004-04-19 devnull int i, fd;
21 a84cbb2a 2004-04-19 devnull Fhdr *hdr;
22 a84cbb2a 2004-04-19 devnull
23 a84cbb2a 2004-04-19 devnull if((fd = open(name, mode)) < 0)
24 a84cbb2a 2004-04-19 devnull return nil;
25 a84cbb2a 2004-04-19 devnull
26 a84cbb2a 2004-04-19 devnull if(seek(fd, 0, 0) < 0 || readn(fd, buf, 4) != 4){
27 a84cbb2a 2004-04-19 devnull close(fd);
28 a84cbb2a 2004-04-19 devnull return nil;
29 a84cbb2a 2004-04-19 devnull }
30 a84cbb2a 2004-04-19 devnull
31 a84cbb2a 2004-04-19 devnull hdr = mallocz(sizeof(Fhdr), 1);
32 a84cbb2a 2004-04-19 devnull if(hdr == nil){
33 a84cbb2a 2004-04-19 devnull close(fd);
34 a84cbb2a 2004-04-19 devnull return nil;
35 a84cbb2a 2004-04-19 devnull }
36 a84cbb2a 2004-04-19 devnull hdr->filename = strdup(name);
37 a84cbb2a 2004-04-19 devnull magic = beload4(buf);
38 a84cbb2a 2004-04-19 devnull werrstr("magic doesn't match");
39 a84cbb2a 2004-04-19 devnull for(i=0; i<nelem(cracktab); i++)
40 a84cbb2a 2004-04-19 devnull if(cracktab[i].magic == magic && seek(fd, 0, 0) == 0 && cracktab[i].fn(fd, hdr) >= 0){
41 a84cbb2a 2004-04-19 devnull _addhdr(hdr);
42 a84cbb2a 2004-04-19 devnull return hdr;
43 a84cbb2a 2004-04-19 devnull }
44 a84cbb2a 2004-04-19 devnull werrstr("unknown file type: %r");
45 a84cbb2a 2004-04-19 devnull free(hdr);
46 a84cbb2a 2004-04-19 devnull close(fd);
47 a84cbb2a 2004-04-19 devnull return nil;
48 a84cbb2a 2004-04-19 devnull }
49 a84cbb2a 2004-04-19 devnull
50 a84cbb2a 2004-04-19 devnull void
51 a84cbb2a 2004-04-19 devnull uncrackhdr(Fhdr *hdr)
52 a84cbb2a 2004-04-19 devnull {
53 a84cbb2a 2004-04-19 devnull close(hdr->fd);
54 a84cbb2a 2004-04-19 devnull _delhdr(hdr);
55 a84cbb2a 2004-04-19 devnull free(hdr);
56 a84cbb2a 2004-04-19 devnull }
57 a84cbb2a 2004-04-19 devnull
58 a84cbb2a 2004-04-19 devnull int
59 a84cbb2a 2004-04-19 devnull mapfile(Fhdr *fp, ulong base, Map *map, Regs **regs)
60 a84cbb2a 2004-04-19 devnull {
61 a84cbb2a 2004-04-19 devnull if(fp == nil){
62 a84cbb2a 2004-04-19 devnull werrstr("no file");
63 a84cbb2a 2004-04-19 devnull return -1;
64 a84cbb2a 2004-04-19 devnull }
65 a84cbb2a 2004-04-19 devnull if(map == nil){
66 a84cbb2a 2004-04-19 devnull werrstr("no map");
67 a84cbb2a 2004-04-19 devnull return -1;
68 a84cbb2a 2004-04-19 devnull }
69 a8763864 2004-07-09 devnull if(fp->map == 0){
70 a84cbb2a 2004-04-19 devnull werrstr("cannot load map for this file type");
71 a84cbb2a 2004-04-19 devnull return -1;
72 a84cbb2a 2004-04-19 devnull }
73 a84cbb2a 2004-04-19 devnull return fp->map(fp, base, map, regs);
74 a84cbb2a 2004-04-19 devnull }
75 a84cbb2a 2004-04-19 devnull
76 a84cbb2a 2004-04-19 devnull void
77 a84cbb2a 2004-04-19 devnull unmapfile(Fhdr *fp, Map *map)
78 a84cbb2a 2004-04-19 devnull {
79 a84cbb2a 2004-04-19 devnull int i;
80 a84cbb2a 2004-04-19 devnull
81 a84cbb2a 2004-04-19 devnull if(map == nil || fp == nil)
82 a84cbb2a 2004-04-19 devnull return;
83 a84cbb2a 2004-04-19 devnull
84 a84cbb2a 2004-04-19 devnull for(i=0; i<map->nseg; i++){
85 a84cbb2a 2004-04-19 devnull while(i<map->nseg && map->seg[i].fd == fp->fd){
86 a84cbb2a 2004-04-19 devnull map->nseg--;
87 a84cbb2a 2004-04-19 devnull memmove(&map->seg[i], &map->seg[i+1],
88 a84cbb2a 2004-04-19 devnull (map->nseg-i)*sizeof(map->seg[0]));
89 a84cbb2a 2004-04-19 devnull }
90 a84cbb2a 2004-04-19 devnull }
91 a84cbb2a 2004-04-19 devnull }