1 | /* |
---|
2 | * $Id$ |
---|
3 | */ |
---|
4 | |
---|
5 | |
---|
6 | #include <stdio.h> |
---|
7 | #include <stdlib.h> |
---|
8 | |
---|
9 | /* |
---|
10 | * This function will patch binary file |
---|
11 | */ |
---|
12 | |
---|
13 | |
---|
14 | static char buf[512]; |
---|
15 | |
---|
16 | static void |
---|
17 | usage(void) |
---|
18 | { |
---|
19 | printf("usage: binpatch [-h] <ofile> <ifile> <reloc> <off> <byte0> " |
---|
20 | "[<byte1> [<byte2> [<byte3>]]]\n"); |
---|
21 | printf("this function patches binary file at specified offset with\n"); |
---|
22 | printf("up to 4 bytes provided on command line \n"); |
---|
23 | printf("-h - prints this message\n\n"); |
---|
24 | printf("<ofile> - output file\n"); |
---|
25 | printf("<ifile> - input ifile\n"); |
---|
26 | printf("<reloc> - relocation address of image\n"); |
---|
27 | printf("<off> - offset of patch, offset in file is at off - reloc\n"); |
---|
28 | printf("<byte0> - byte 0 of patch\n"); |
---|
29 | printf("<byte1> - byte 1 of patch\n"); |
---|
30 | printf("<byte2> - byte 1 of patch\n"); |
---|
31 | printf("<byte3> - byte 1 of patch\n"); |
---|
32 | |
---|
33 | return; |
---|
34 | } |
---|
35 | |
---|
36 | int |
---|
37 | main(int argc, char **argv) |
---|
38 | { |
---|
39 | int c; |
---|
40 | FILE *ofp, *ifp; |
---|
41 | char patch[4], *end; |
---|
42 | int patchLen, tmp, i, off, cnt, patched, len, reloc; |
---|
43 | |
---|
44 | |
---|
45 | /* parse command line options */ |
---|
46 | while ((c = getopt(argc, argv, "h")) >= 0) |
---|
47 | { |
---|
48 | switch (c) |
---|
49 | { |
---|
50 | case 'h': |
---|
51 | usage(); |
---|
52 | return 0; |
---|
53 | default: |
---|
54 | usage(); |
---|
55 | return 1; |
---|
56 | } |
---|
57 | } |
---|
58 | |
---|
59 | if(argc < 6) |
---|
60 | { |
---|
61 | usage(); |
---|
62 | return 1; |
---|
63 | } |
---|
64 | |
---|
65 | /* Let us get offset in file */ |
---|
66 | reloc = strtol(argv[3], &end, 0); |
---|
67 | if(end == argv[3] || off < 0) |
---|
68 | { |
---|
69 | fprintf(stderr, "bad reloc value %s\n", argv[3]); |
---|
70 | return 1; |
---|
71 | } |
---|
72 | |
---|
73 | off = strtol(argv[4], &end, 0); |
---|
74 | if(end == argv[4] || off < 0 || off < reloc) |
---|
75 | { |
---|
76 | fprintf(stderr, "bad offset value %s\n", argv[4]); |
---|
77 | return 1; |
---|
78 | } |
---|
79 | |
---|
80 | off -= reloc; |
---|
81 | |
---|
82 | /* Let us get patch */ |
---|
83 | patchLen = argc - 5; |
---|
84 | |
---|
85 | for(i=0; i<patchLen; i++) |
---|
86 | { |
---|
87 | tmp = strtol(argv[5+i], &end, 0); |
---|
88 | |
---|
89 | if(end == argv[4+i] || tmp < 0 || tmp > 0xff) |
---|
90 | { |
---|
91 | fprintf(stderr, "bad byte value %s\n", argv[5+i]); |
---|
92 | return 1; |
---|
93 | } |
---|
94 | patch[i] = tmp; |
---|
95 | } |
---|
96 | |
---|
97 | ifp = fopen(argv[2], "r"); |
---|
98 | if(ifp == NULL) |
---|
99 | { |
---|
100 | fprintf(stderr, "unable to open file %s\n", argv[2]); |
---|
101 | return 1; |
---|
102 | } |
---|
103 | |
---|
104 | ofp = fopen(argv[1], "w"); |
---|
105 | if(ofp == NULL) |
---|
106 | { |
---|
107 | fprintf(stderr, "unable to open file %s\n", argv[1]); |
---|
108 | return 1; |
---|
109 | } |
---|
110 | |
---|
111 | cnt = 0; |
---|
112 | patched = 0; |
---|
113 | for(;;) |
---|
114 | { |
---|
115 | len = fread(buf, 1, sizeof(buf), ifp); |
---|
116 | |
---|
117 | if(len == 0) |
---|
118 | { |
---|
119 | break; |
---|
120 | } |
---|
121 | |
---|
122 | if(cnt <= off && (cnt + len) > off) |
---|
123 | { |
---|
124 | /* Perform patch */ |
---|
125 | for(i=0; i<patchLen && (off+i)<(cnt+len); i++) |
---|
126 | { |
---|
127 | buf[off-cnt+i] = patch[i]; |
---|
128 | } |
---|
129 | patched = 1; |
---|
130 | } |
---|
131 | else if(cnt > off && cnt < (off + patchLen)) |
---|
132 | { |
---|
133 | /* Perform patch */ |
---|
134 | for(i=cnt-off; i<patchLen; i++) |
---|
135 | { |
---|
136 | buf[off-cnt+i] = patch[i]; |
---|
137 | } |
---|
138 | patched = 1; |
---|
139 | } |
---|
140 | |
---|
141 | fwrite(buf, 1, len, ofp); |
---|
142 | |
---|
143 | cnt += len; |
---|
144 | } |
---|
145 | |
---|
146 | fclose(ifp); |
---|
147 | fclose(ofp); |
---|
148 | |
---|
149 | if(!patched) |
---|
150 | { |
---|
151 | fprintf(stderr, "warning: offset is beyond input file length\n"); |
---|
152 | fprintf(stderr, " no patch is performed\n"); |
---|
153 | } |
---|
154 | |
---|
155 | return 0; |
---|
156 | } |
---|