📄 linux.h
字号:
register int const t0 asm("t0") = fd; register off_t const t1 asm("t1") = offset; register int v0 asm("v0") = __NR_mmap; __asm__ __volatile__( /*"break\n"*/ /* debug only */ "addiu $29,$29,-0x20\n" "\tsw $8,0x10($29)\n" "\tsw $9,0x14($29)\n" "\tsyscall\n" "\taddiu $29,$29, 0x20\n" "\tb sysret\n" "sysgo:" /*"break\n"*/ /* debug only */ "\tsyscall\n" "sysret:" "\tbnez $7,sysbad\n" /* $7 === a3 */ "\tjr $31\n" "sysbad:" "\tli $2,-1\n" /* $2 === v0; overwrite 'errno' */ "\tjr $31" : "+r"(v0), "+r"(a3) /* "+r" ==> both read and write */ : "r"(a0), "r"(a1), "r"(a2), "r"(t0), "r"(t1) ); return (void *)v0;}static ssize_t read(int fd, void *buf, size_t len){#define __NR_read (3+ 4000) register int const a0 asm("a0") = fd; register void * const a1 asm("a1") = buf; register size_t const a2 asm("a2") = len; register size_t v0 asm("v0") = __NR_read; __asm__ __volatile__( "bal sysgo" : "+r"(v0) : "r"(a0), "r"(a1), "r"(a2) : "a3" ); return v0;}static void *brk(void *addr){#define __NR_brk (45+ 4000) register void *const a0 asm("a0") = addr; register void * v0 asm("v0") = (void *)__NR_brk; __asm__ __volatile__( "bal sysgo" : "+r"(v0) : "r"(a0) : "a3" ); return v0;}static int close(int fd){#define __NR_close (6+ 4000) register int const a0 asm("a0") = fd; register int v0 asm("v0") = __NR_close; __asm__ __volatile__( "bal sysgo" : "+r"(v0) : "r"(a0) : "a3" ); return v0;}static void exit(int code) __attribute__ ((__noreturn__));static void exit(int code){#define __NR_exit (1+ 4000) register int const a0 asm("a0") = code; register int v0 asm("v0") = __NR_exit; __asm__ __volatile__( "bal sysgo" : : "r"(v0), "r"(a0) : "a3" ); for (;;) {}}#if 0 /*{ UNUSED */static int munmap(void *addr, size_t len){#define __NR_munmap (91+ 4000) register void *const a0 asm("a0") = addr; register size_t const a1 asm("a2") = len; register size_t v0 asm("v0"); __asm__ __volatile__( "bal sysgo" : "=r"(v0) : [v0] "r"(__NR_munmap), "r"(a0), "r"(a1) : "a3" ); return v0;}#endif /*}*/static int mprotect(void const *addr, size_t len, int prot){#define __NR_mprotect (125+ 4000) register void const *const a0 asm("a0") = addr; register size_t const a1 asm("a1") = len; register int const a2 asm("a2") = prot; register size_t v0 asm("v0") = __NR_mprotect; __asm__ __volatile__( "bal sysgo" : "+r"(v0) : "r"(a0), "r"(a1), "r"(a2) : "a3" ); return v0;}static ssize_t open(char const *path, int kind, int mode){#define __NR_open (5+ 4000) register char const *const a0 asm("a0") = path; register int const a1 asm("a1") = kind; register int const a2 asm("a2") = mode; register size_t v0 asm("v0") = __NR_open; __asm__ __volatile__( "bal sysgo" : "+r"(v0) : "r"(a0), "r"(a1), "r"(a2) : "a3" ); return v0;}#if 0 /*{ UNUSED */static ssize_t write(int fd, void const *buf, size_t len){#define __NR_write (4+ 4000) register int const a0 asm("a0") = fd; register void const * const a1 asm("a1") = buf; register size_t const a2 asm("a2") = len; register size_t v0 asm("v0") = __NR_write; __asm__ __volatile__( "bal sysgo" : "+r"(v0) : "r"(a0), "r"(a1), "r"(a2) : "a3" ); return v0;}#endif /*}*/#else /*}{ generic */void *brk(void *);int close(int);void exit(int) __attribute__((__noreturn__,__nothrow__));void *mmap(void *, size_t, int, int, int, off_t);int munmap(void *, size_t);int mprotect(void const *, size_t, int);int open(char const *, unsigned, unsigned);ssize_t read(int, void *, size_t);ssize_t write(int, void const *, size_t);#endif /*}*//*************************************************************************// <elf.h>**************************************************************************/typedef uint16_t Elf32_Half;typedef uint16_t Elf64_Half;typedef uint32_t Elf32_Word;typedef int32_t Elf32_Sword;typedef uint32_t Elf64_Word;typedef int32_t Elf64_Sword;typedef uint64_t Elf32_Xword;typedef int64_t Elf32_Sxword;typedef uint64_t Elf64_Xword;typedef int64_t Elf64_Sxword;typedef uint32_t Elf32_Addr;typedef uint64_t Elf64_Addr;typedef uint32_t Elf32_Off;typedef uint64_t Elf64_Off;typedef uint16_t Elf32_Section;typedef uint16_t Elf64_Section;typedef Elf32_Half Elf32_Versym;typedef Elf64_Half Elf64_Versym;#define EI_NIDENT 16typedef struct{ unsigned char e_ident[EI_NIDENT]; Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx;} Elf32_Ehdr;typedef struct{ unsigned char e_ident[EI_NIDENT]; Elf64_Half e_type; Elf64_Half e_machine; Elf64_Word e_version; Elf64_Addr e_entry; Elf64_Off e_phoff; Elf64_Off e_shoff; Elf64_Word e_flags; Elf64_Half e_ehsize; Elf64_Half e_phentsize; Elf64_Half e_phnum; Elf64_Half e_shentsize; Elf64_Half e_shnum; Elf64_Half e_shstrndx;} Elf64_Ehdr;typedef struct{ Elf32_Word p_type; Elf32_Off p_offset; Elf32_Addr p_vaddr; Elf32_Addr p_paddr; Elf32_Word p_filesz; Elf32_Word p_memsz; Elf32_Word p_flags; Elf32_Word p_align;} Elf32_Phdr;typedef struct{ Elf64_Word p_type; Elf64_Word p_flags; Elf64_Off p_offset; Elf64_Addr p_vaddr; Elf64_Addr p_paddr; Elf64_Xword p_filesz; Elf64_Xword p_memsz; Elf64_Xword p_align;} Elf64_Phdr;typedef struct{ uint32_t a_type; union { uint32_t a_val; } a_un;} Elf32_auxv_t;typedef struct{ uint64_t a_type; union { uint64_t a_val; } a_un;} Elf64_auxv_t;#define AT_NULL 0#define AT_IGNORE 1#define AT_PHDR 3#define AT_PHENT 4#define AT_PHNUM 5#define AT_PAGESZ 6#define AT_BASE 7#define AT_ENTRY 9#define ET_EXEC 2#define ET_DYN 3#define PF_X 1#define PF_W 2#define PF_R 4#define PT_LOAD 1#define PT_INTERP 3#define PT_PHDR 6/*************************************************************************// UPX stuff**************************************************************************/// !!! must be the same as in p_unix.h !!!#define OVERHEAD 2048#define UPX_MAGIC_LE32 0x21585055 // "UPX!"#if 1// patch constants for our loader (le32 format)//#define UPX1 0x31585055 // "UPX1"#define UPX2 0x32585055 // "UPX2"#define UPX3 0x33585055 // "UPX4"#define UPX4 0x34585055 // "UPX4"//#define UPX5 0x35585055 // "UPX5"#else// transform into relocations when using ElfLinkerextern const unsigned UPX2;extern const unsigned UPX3;extern const unsigned UPX4;#define UPX2 ((unsigned) (const void *) &UPX2)#define UPX3 ((unsigned) (const void *) &UPX3)#define UPX4 ((unsigned) (const void *) &UPX4)#endiftypedef int nrv_int;typedef int nrv_int32;typedef unsigned int nrv_uint;typedef unsigned int nrv_uint32;#define nrv_byte unsigned char#define nrv_bytep unsigned char *#define nrv_voidp void *// From ../p_unix.hstruct b_info { // 12-byte header before each compressed block uint32_t sz_unc; // uncompressed_size uint32_t sz_cpr; // compressed_size unsigned char b_method; // compression algorithm unsigned char b_ftid; // filter id unsigned char b_cto8; // filter parameter unsigned char b_unused;};struct l_info // 12-byte trailer in header for loader (offset 116){ uint32_t l_checksum; uint32_t l_magic; uint16_t l_lsize; uint8_t l_version; uint8_t l_format;};struct p_info // 12-byte packed program header follows stub loader{ uint32_t p_progid; uint32_t p_filesize; uint32_t p_blocksize;};#define CONST_CAST(type, var) \ ((type) ((uintptr_t) (var)))#if !defined(__attribute_cdecl)#if defined(__i386__)# if (ACC_CC_GNUC >= 0x030300)# define __attribute_cdecl __attribute__((__cdecl__, __used__))# elif (ACC_CC_GNUC >= 0x020700)# define __attribute_cdecl __attribute__((__cdecl__))# endif#endif#endif#if !defined(__attribute_cdecl)# define __attribute_cdecl#endif/*vi:ts=4:et:nowrap*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -