📄 powerpc-linux.elf-entry.s
字号:
/* powerpc-linux.elf-entry.S -- Linux program entry point & decompressor (Elf binary)** This file is part of the UPX executable compressor.** Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer* Copyright (C) 1996-2007 Laszlo Molnar* Copyright (C) 2000-2007 John F. Reiser* All Rights Reserved.** UPX and the UCL library are free software; you can redistribute them* and/or modify them under the terms of the GNU General Public License as* published by the Free Software Foundation; either version 2 of* the License, or (at your option) any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program; see the file COPYING.* If not, write to the Free Software Foundation, Inc.,* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.** Markus F.X.J. Oberhumer Laszlo Molnar* <mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>** John F. Reiser* <jreiser@users.sourceforge.net>*/#include "arch/powerpc/32/macros.S"#include "arch/powerpc/32/ppc_regs.h"sz_b_info= 12 sz_unc= 0 sz_cpr= 4 b_method= 8PROT_READ= 1PROT_WRITE= 2PROT_EXEC= 4MAP_PRIVATE= 2MAP_FIXED= 0x10MAP_ANONYMOUS= 0x20PAGE_SHIFT= 12PAGE_SIZE = -(~0<<PAGE_SHIFT)/* /usr/include/asm-ppc/unistd.h */__NR_write = 4__NR_exit = 1__NR_mmap = 90 section ELFMAINX_start: .globl _start call main // must be exactly 1 instruction; link_register= &decompress/* Returns 0 on success; non-zero on failure. */decompress: // (uchar const *src, size_t lsrc, uchar *dst, size_t &ldst, uint method) section NRV_HEADSZ_DLINE=128 # size of data cache line in Apple G5/* PowerPC has no 'cmplis': compare logical [unsigned] immediate shifted [by 16] */#define hibit r0 /* holds 0x80000000 during decompress */#define src a0#define lsrc a1#define dst a2#define ldst a3 /* Out: actually a reference: &len_dst */#define meth a4#define off a4#define len a5#define bits a6#define disp a7 section NRV2E#include "arch/powerpc/32/nrv2e_d.S" section NRV2D#include "arch/powerpc/32/nrv2d_d.S" section NRV2B#include "arch/powerpc/32/nrv2b_d.S"#include "arch/powerpc/32/lzma_d.S" section NRV_TAILeof_nrv:#define tmp r0 /* hibit is dead */ lwz tmp,0(ldst) // original dst mtlr t3 // return address addi dst,dst,1 // uncorrect for 'stbu' addi src,src,1 // uncorrect for 'lbzu' subf dst,tmp,dst // dst -= tmp; // dst length#undef tmp subf a0,lsrc,src // src -= eof; // return 0: good; else: bad stw dst,0(ldst) ret section ELFMAINYmsg_SELinux: call L72L70: .asciz "PROT_EXEC|PROT_WRITE failed.\n"L71: // IDENTSTR goes here section ELFMAINZL72: li a2,L71 - L70 // length mflr a1 // message text li a0,2 // fd stderr li 0,__NR_write; scdie: li a0,127 li 0,__NR_exit; sc/* Decompress the rest of this loader, and jump to it. */unfold: mflr r30 // &{ b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} li a5,0 // off_t li a4,-1 // fd; cater to *BSD for MAP_ANON lwz a0,sz_cpr(r30) li a3,MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS li a2,PROT_READ | PROT_WRITE | PROT_EXEC li a1,PAGE_SIZE add a0,a0,r30 li 0,__NR_mmap addi a0,a0,sz_b_info+PAGE_SIZE-1 rlwinm a0,a0,0,0,31-PAGE_SHIFT // next page boundary after fold sc; bso- msg_SELinux // Branch if SummaryOverflow (failure)0: mtctr r31 lwz r0,sz_unc(r30) lbz meth,b_method(r30) la ldst,31*4(sp) // &slot on stack stw r0,31*4(sp) // lzma uses for EOF mr dst,a0 mtlr a0 // &continuation lwz lsrc,sz_cpr(r30) addi src,r30,sz_b_info la sp,-6*4(sp) // (sp,cr,pc, xx,yy,zz) save area per calling convention bctr // goto decomrpess; return to link register (mmap'ed page)main://// teq r0,r0 // debugging stwu r1,-32*4(sp) // allocate space (keeping 0 mod 16), save r1 stmw r2,4(sp) // save registers r2 thru r31 mflr r31 // &decompress call unfold /* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} *//*vi:ts=8:et:nowrap*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -