Upx_Doxygen
https://github.com/upx/upx
p_vmlinz.h
1 /* p_vmlinz.h --
2 
3  This file is part of the UPX executable compressor.
4 
5  Copyright (C) 1996-2016 Markus Franz Xaver Johannes Oberhumer
6  Copyright (C) 1996-2016 Laszlo Molnar
7  All Rights Reserved.
8 
9  UPX and the UCL library are free software; you can redistribute them
10  and/or modify them under the terms of the GNU General Public License as
11  published by the Free Software Foundation; either version 2 of
12  the License, or (at your option) any later version.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program; see the file COPYING.
21  If not, write to the Free Software Foundation, Inc.,
22  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 
24  Markus F.X.J. Oberhumer Laszlo Molnar
25  <markus@oberhumer.com> <ezerotven+github@gmail.com>
26  */
27 
28 
29 #ifndef __UPX_P_VMLINZ_H
30 #define __UPX_P_VMLINZ_H 1
31 
32 
33 /*************************************************************************
34 // vmlinuz/i386 (gzip compressed Linux kernel image)
35 **************************************************************************/
36 
37 class PackVmlinuzI386 : public Packer
38 {
39  typedef Packer super;
40 public:
42  virtual int getVersion() const { return 13; }
43  virtual int getFormat() const { return UPX_F_VMLINUZ_i386; }
44  virtual const char *getName() const { return "vmlinuz/i386"; }
45  virtual const char *getFullName(const options_t *) const { return "i386-linux.kernel.vmlinuz"; }
46  virtual const int *getCompressionMethods(int method, int level) const;
47  virtual const int *getFilters() const;
48  virtual int getStrategy(Filter &);
49 
50  virtual void pack(OutputFile *fo);
51  virtual void unpack(OutputFile *fo);
52 
53  virtual bool canPack();
54  virtual int canUnpack();
55 
56 protected:
57  virtual int readFileHeader();
58  virtual int decompressKernel();
59  virtual void readKernel();
60 
61  virtual void buildLoader(const Filter *ft);
62  virtual Linker* newLinker() const;
63 
64 // virtual upx_byte *getLoader() const;
65 // virtual int getLoaderSize() const;
66 
67  __packed_struct(boot_sect_t)
68  char _[0x1f1];
69  unsigned char setup_sects;
70  char __[2];
71  LE32 sys_size;
72  char ___[6];
73  LE16 boot_flag; // 0xAA55
74  // 0x200
75  char ____[2];
76  unsigned char hdrs[4]; // "HdrS"
77  LE16 version; // boot protocol
78  char _____[9];
79  unsigned char load_flags;
80  char ______[2];
81  LE32 code32_start;
82  char _7[0x230 - (0x214 + 4)];
83  LE32 kernel_alignment;
84  char relocatable_kernel;
85  char _8[0x248 - (0x234 + 1)];
86  LE32 payload_offset;
87  LE32 payload_length;
88  // some more uninteresting fields here ...
89  // see /usr/src/linux/Documentation/i386/boot.txt
90  __packed_struct_end()
91 
92  boot_sect_t h;
93 
94  MemBuffer setup_buf;
95  int setup_size;
96  unsigned physical_start;
97  unsigned page_offset;
98  unsigned config_physical_align;
99  unsigned filter_len;
100 };
101 
102 
103 /*************************************************************************
104 // bvmlinuz/i386 (gzip compressed Linux kernel image)
105 **************************************************************************/
106 
108 {
109  typedef PackVmlinuzI386 super;
110 public:
111  PackBvmlinuzI386(InputFile *f) : super(f) { }
112  virtual int getFormat() const { return UPX_F_BVMLINUZ_i386; }
113  virtual const char *getName() const { return "bvmlinuz/i386"; }
114  virtual const char *getFullName(const options_t *) const { return "i386-linux.kernel.bvmlinuz"; }
115  virtual const int *getFilters() const;
116 
117  virtual void pack(OutputFile *fo);
118 
119 protected:
120  virtual void buildLoader(const Filter *ft);
121 };
122 
123 
124 /*************************************************************************
125 // elks/8086 (linux-8086 uncompressed kernel image)
126 **************************************************************************/
127 
129 {
130  typedef PackVmlinuzI386 super;
131 public:
132  PackElks8086(InputFile *f) : super(f) { }
133  virtual int getFormat() const { return UPX_F_ELKS_8086; }
134  virtual const char *getName() const { return "elks/i086"; }
135  virtual const char *getFullName(const options_t *) const { return "i086-elks ???"; }
136  virtual const int *getCompressionMethods(int method, int level) const;
137  virtual const int *getFilters() const;
138 
139  virtual void pack(OutputFile *fo);
140  virtual void unpack(OutputFile *fo);
141 
142  virtual int canUnpack();
143 
144 protected:
145  virtual int decompressKernel();
146  virtual void readKernel();
147 
148  virtual void buildLoader(const Filter *ft);
149 };
150 
151 
152 /*************************************************************************
153 // vmlinuz/armel (gzip compressed Linux kernel image)
154 **************************************************************************/
155 
156 class PackVmlinuzARMEL : public Packer
157 {
158  typedef Packer super;
159 public:
161  virtual int getVersion() const { return 13; }
162  virtual int getFormat() const { return UPX_F_VMLINUZ_ARMEL; }
163  virtual const char *getName() const { return "vmlinuz/arm"; }
164  virtual const char *getFullName(const options_t *) const { return "arm-linux.kernel.vmlinuz"; }
165  virtual const int *getCompressionMethods(int method, int level) const;
166  virtual const int *getFilters() const;
167  virtual int getStrategy(Filter &);
168 
169  virtual void pack(OutputFile *fo);
170  virtual void unpack(OutputFile *fo);
171 
172  virtual bool canPack();
173  virtual int canUnpack();
174 
175 protected:
176  virtual int readFileHeader();
177  virtual int decompressKernel();
178  virtual void readKernel();
179 
180  virtual void buildLoader(const Filter *ft);
181  virtual unsigned write_vmlinuz_head(OutputFile *const fo);
182  virtual void defineDecompressorSymbols();
183  virtual Linker* newLinker() const;
184 
185 // virtual upx_byte *getLoader() const;
186 // virtual int getLoaderSize() const;
187 
188 
189  MemBuffer setup_buf;
190  int setup_size;
191 // unsigned physical_start;
192 // unsigned page_offset;
193 // unsigned config_physical_align;
194  unsigned filter_len;
195 };
196 
197 
198 #endif /* already included */
199 
200 /* vim:set ts=4 sw=4 et: */
Definition: mem.h:37
Definition: linker.h:35
Definition: options.h:45
Definition: p_vmlinz.h:156
Definition: file.h:89
Definition: packer.h:115
Definition: p_vmlinz.h:128
Definition: file.h:121
Definition: filter.h:53
Definition: p_vmlinz.h:37
Definition: p_vmlinz.h:107