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 dd944ec7 2005-01-23 devnull #include "elf.h"
6 a84cbb2a 2004-04-19 devnull
7 a84cbb2a 2004-04-19 devnull static struct
8 a84cbb2a 2004-04-19 devnull {
9 a84cbb2a 2004-04-19 devnull ulong magic;
10 a84cbb2a 2004-04-19 devnull int (*fn)(int, Fhdr*);
11 a84cbb2a 2004-04-19 devnull } cracktab[] = {
12 a84cbb2a 2004-04-19 devnull 0x7F454C46, crackelf,
13 a84cbb2a 2004-04-19 devnull 0xFEEDFACE, crackmacho,
14 a84cbb2a 2004-04-19 devnull };
15 a84cbb2a 2004-04-19 devnull
16 a84cbb2a 2004-04-19 devnull Fhdr*
17 a84cbb2a 2004-04-19 devnull crackhdr(char *name, int mode)
18 a84cbb2a 2004-04-19 devnull {
19 a84cbb2a 2004-04-19 devnull uchar buf[4];
20 a84cbb2a 2004-04-19 devnull ulong magic;
21 a84cbb2a 2004-04-19 devnull int i, fd;
22 a84cbb2a 2004-04-19 devnull Fhdr *hdr;
23 a84cbb2a 2004-04-19 devnull
24 a84cbb2a 2004-04-19 devnull if((fd = open(name, mode)) < 0)
25 a84cbb2a 2004-04-19 devnull return nil;
26 a84cbb2a 2004-04-19 devnull
27 a84cbb2a 2004-04-19 devnull if(seek(fd, 0, 0) < 0 || readn(fd, buf, 4) != 4){
28 a84cbb2a 2004-04-19 devnull close(fd);
29 a84cbb2a 2004-04-19 devnull return nil;
30 a84cbb2a 2004-04-19 devnull }
31 a84cbb2a 2004-04-19 devnull
32 a84cbb2a 2004-04-19 devnull hdr = mallocz(sizeof(Fhdr), 1);
33 a84cbb2a 2004-04-19 devnull if(hdr == nil){
34 a84cbb2a 2004-04-19 devnull close(fd);
35 a84cbb2a 2004-04-19 devnull return nil;
36 a84cbb2a 2004-04-19 devnull }
37 a84cbb2a 2004-04-19 devnull hdr->filename = strdup(name);
38 a84cbb2a 2004-04-19 devnull magic = beload4(buf);
39 a84cbb2a 2004-04-19 devnull werrstr("magic doesn't match");
40 a84cbb2a 2004-04-19 devnull for(i=0; i<nelem(cracktab); i++)
41 a84cbb2a 2004-04-19 devnull if(cracktab[i].magic == magic && seek(fd, 0, 0) == 0 && cracktab[i].fn(fd, hdr) >= 0){
42 a84cbb2a 2004-04-19 devnull _addhdr(hdr);
43 a84cbb2a 2004-04-19 devnull return hdr;
44 a84cbb2a 2004-04-19 devnull }
45 a84cbb2a 2004-04-19 devnull werrstr("unknown file type: %r");
46 a84cbb2a 2004-04-19 devnull free(hdr);
47 a84cbb2a 2004-04-19 devnull close(fd);
48 a84cbb2a 2004-04-19 devnull return nil;
49 a84cbb2a 2004-04-19 devnull }
50 a84cbb2a 2004-04-19 devnull
51 a84cbb2a 2004-04-19 devnull void
52 a84cbb2a 2004-04-19 devnull uncrackhdr(Fhdr *hdr)
53 a84cbb2a 2004-04-19 devnull {
54 dd944ec7 2005-01-23 devnull int i;
55 dd944ec7 2005-01-23 devnull
56 dd944ec7 2005-01-23 devnull symclose(hdr);
57 dd944ec7 2005-01-23 devnull if(hdr->elf)
58 dd944ec7 2005-01-23 devnull elfclose(hdr->elf);
59 dd944ec7 2005-01-23 devnull if(hdr->fd >= 0)
60 dd944ec7 2005-01-23 devnull close(hdr->fd);
61 dd944ec7 2005-01-23 devnull free(hdr->cmdline);
62 dd944ec7 2005-01-23 devnull free(hdr->prog);
63 dd944ec7 2005-01-23 devnull for(i=0; i<hdr->nthread; i++)
64 dd944ec7 2005-01-23 devnull free(hdr->thread[i].ureg);
65 dd944ec7 2005-01-23 devnull free(hdr->thread);
66 a84cbb2a 2004-04-19 devnull free(hdr);
67 a84cbb2a 2004-04-19 devnull }
68 a84cbb2a 2004-04-19 devnull
69 a84cbb2a 2004-04-19 devnull int
70 a84cbb2a 2004-04-19 devnull mapfile(Fhdr *fp, ulong base, Map *map, Regs **regs)
71 a84cbb2a 2004-04-19 devnull {
72 a84cbb2a 2004-04-19 devnull if(fp == nil){
73 a84cbb2a 2004-04-19 devnull werrstr("no file");
74 a84cbb2a 2004-04-19 devnull return -1;
75 a84cbb2a 2004-04-19 devnull }
76 a84cbb2a 2004-04-19 devnull if(map == nil){
77 a84cbb2a 2004-04-19 devnull werrstr("no map");
78 a84cbb2a 2004-04-19 devnull return -1;
79 a84cbb2a 2004-04-19 devnull }
80 a8763864 2004-07-09 devnull if(fp->map == 0){
81 a84cbb2a 2004-04-19 devnull werrstr("cannot load map for this file type");
82 a84cbb2a 2004-04-19 devnull return -1;
83 a84cbb2a 2004-04-19 devnull }
84 dd944ec7 2005-01-23 devnull if(regs)
85 dd944ec7 2005-01-23 devnull *regs = nil;
86 a84cbb2a 2004-04-19 devnull return fp->map(fp, base, map, regs);
87 a84cbb2a 2004-04-19 devnull }
88 a84cbb2a 2004-04-19 devnull
89 a84cbb2a 2004-04-19 devnull void
90 a84cbb2a 2004-04-19 devnull unmapfile(Fhdr *fp, Map *map)
91 a84cbb2a 2004-04-19 devnull {
92 a84cbb2a 2004-04-19 devnull int i;
93 a84cbb2a 2004-04-19 devnull
94 a84cbb2a 2004-04-19 devnull if(map == nil || fp == nil)
95 a84cbb2a 2004-04-19 devnull return;
96 a84cbb2a 2004-04-19 devnull
97 a84cbb2a 2004-04-19 devnull for(i=0; i<map->nseg; i++){
98 a84cbb2a 2004-04-19 devnull while(i<map->nseg && map->seg[i].fd == fp->fd){
99 a84cbb2a 2004-04-19 devnull map->nseg--;
100 a84cbb2a 2004-04-19 devnull memmove(&map->seg[i], &map->seg[i+1],
101 a84cbb2a 2004-04-19 devnull (map->nseg-i)*sizeof(map->seg[0]));
102 a84cbb2a 2004-04-19 devnull }
103 a84cbb2a 2004-04-19 devnull }
104 a84cbb2a 2004-04-19 devnull }
105 dd944ec7 2005-01-23 devnull
106 dd944ec7 2005-01-23 devnull Regs*
107 dd944ec7 2005-01-23 devnull coreregs(Fhdr *fp, uint id)
108 dd944ec7 2005-01-23 devnull {
109 dd944ec7 2005-01-23 devnull UregRegs *r;
110 dd944ec7 2005-01-23 devnull int i;
111 dd944ec7 2005-01-23 devnull
112 dd944ec7 2005-01-23 devnull for(i=0; i<fp->nthread; i++){
113 dd944ec7 2005-01-23 devnull if(fp->thread[i].id == id){
114 dd944ec7 2005-01-23 devnull if((r = mallocz(sizeof *r, 1)) == nil)
115 dd944ec7 2005-01-23 devnull return nil;
116 dd944ec7 2005-01-23 devnull r->r.rw = _uregrw;
117 dd944ec7 2005-01-23 devnull r->ureg = fp->thread[i].ureg;
118 dd944ec7 2005-01-23 devnull return &r->r;
119 dd944ec7 2005-01-23 devnull }
120 dd944ec7 2005-01-23 devnull }
121 dd944ec7 2005-01-23 devnull werrstr("thread not found");
122 dd944ec7 2005-01-23 devnull return nil;
123 dd944ec7 2005-01-23 devnull }
124 dd944ec7 2005-01-23 devnull