?? arm-linux.elf-fold.s
字號:
@ arm-linux.elf-fold.S -- linkage to C code to process Elf binary@@ This file is part of the UPX executable compressor.@@ 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/arm/v4a/macros.S"sz_Elf32_Ehdr = 13*4sz_Elf32_Phdr = 8*4sz_l_info = 12sz_p_info = 12sz_b_info = 12 sz_unc= 0 sz_cpr= 4 b_method= 8@@ control just falls through, after this part and compiled C code@@ are uncompressed.#define OVERHEAD 2048#define MAX_ELF_HDR 512fold_begin:/* In: r10= &b_info of first compressed block (after move) r9= total size of compressed data r5= f_decompress sp/ ADRU,LENU,sz_unc,argc,argv...*/ ldr r3,[sp,#3*4] @ argc add r3,sp,r3,lsl #2 @ skip argv add r3,r3,#3*4 +4 +4 @ skip ADRU,LENU,sz_unc, argc, env_end.Lenv: ldr r0,[r3],#4 @ skip env cmp r0,#0 bne .Lenv /* r3= &Elf32_auxv_t */ mov r2,r3.Laux: ldr r0,[r2],#2*4 @ .a_type cmp r0,#0 bne .Laux str r2,[sp,#2*4] @ clobber sz_unc with 1+ &Elf32_auxv_t[AT_NULL@.a_type] sub sp,sp,#MAX_ELF_HDR + OVERHEAD @ alloca mov r4,r9 @ total size of compressed data ldr r9,[r10,#sz_cpr] @ xi.size of ELF headers mov r8,sp @ xo.ptr ldr r7,[r10,#sz_unc] @ xo.size adr r6,f_unfilter add r9,r9,#sz_b_info @ for unpackExtent mov r11,#0 @ dynbase for ET_EXEC; FIXME for ET_DYN stmdb sp!,{r3,r4,r5,r6,r7,r8,r9,r10,r11} ldmia sp!,{r0,r1,r2,r3} bl upx_main mov lr,r0 @ entry address add sp,sp,#(9-4)*4 add sp,sp,#MAX_ELF_HDR + OVERHEAD @ un-alloca ldmia sp!,{r0,r1,r2} @ ADRU,LENU,1+ &Elf32_auxv_t[AT_NULL@.a_type] ldr pc,[r2,#4 -2*4] @ Elf32_auxv_t[AT_NULL@.a_type].a_valf_unfilter: @ (char *ptr, uint len, uint cto, uint fid) ptr .req r0 len .req r1 cto .req r2 @ unused fid .req r3 t1 .req r2 t2 .req r3#ifndef FILTER_ID /*{*/#define FILTER_ID 0x50 /* little-endian */#endif /*}*/ and fid,fid,#0xff cmp fid,#FILTER_ID @ last use of fid movne pc,lr @ no-op if not filter 0x50 movs len,len,lsr #2 @ word count cmpne ptr,#0 moveq pc,lr @ no-op if either len or ptr is 0top_unf: sub len,len,#1 ldr t1,[ptr,len,lsl #2] and t2,t1,#0x0f<<24 cmp t2, #0x0b<<24; bne tst_unf @ not 'bl' subroutine call and t2,t1,#0xff<<24 @ all the non-displacement bits sub t1,t1,len @ convert to word-relative displacement bic t1,t1,#0xff<<24 @ restrict to displacement field orr t1,t1,t2 @ re-combine str t1,[ptr,len,lsl #2]tst_unf: cmp len,#0 bne top_unf mov pc,lr .unreq ptr .unreq len .unreq cto .unreq fid .globl exitexit: swi 0x00900001 .globl readread: swi 0x00900003; mov pc,lr .globl writewrite: swi 0x00900004; mov pc,lr .globl openopen: swi 0x00900005; mov pc,lr .globl closeclose: swi 0x00900006; mov pc,lr .globl brkbrk: swi 0x0090002d; mov pc,lr .globl munmapmunmap: swi 0x0090005b; mov pc,lr .globl mprotectmprotect: swi 0x0090007d; mov pc,lr .globl mmapmmap: str r5,[sp,#-4]!; ldr r5,[sp,#4+4] str r4,[sp,#-4]!; ldr r4,[sp,#4+4] mov r5,r5,lsr #12 @ convert to page number swi 0x009000c0 @ mmap64 ldr r4,[sp],#4 ldr r5,[sp],#4 mov pc,lr#if 0 /*{ "gcc-3.4 -fPIC" botches string constants when code moves! */ .globl STR_0xSTR_0x: mov r0,pc; mov pc,lr .asciz "0x" .balign 4 .globl STR_hexSTR_hex: mov r0,pc; mov pc,lr .asciz "0123456789abcdef" .balign 4 .globl STR_xreadSTR_xread: mov r0,pc; mov pc,lr .asciz "xread %p(%x %p) %p %x\n" .balign 4 .globl STR_unpackExtentSTR_unpackExtent: mov r0,pc; mov pc,lr .asciz "unpackExtent in=%p(%x %p) out=%p(%x %p) %p %p\n" .balign 4 .globl STR_make_hatch_armSTR_make_hatch_arm: mov r0,pc; mov pc,lr .asciz "make_hatch_arm %p %x\n" .balign 4 .globl STR_auxv_upSTR_auxv_up: mov r0,pc; mov pc,lr .asciz "auxv_up %p %x %x\n" .balign 4 .globl STR_xfind_pagesSTR_xfind_pages: mov r0,pc; mov pc,lr .asciz "xfind_pages %x %p %d %p\n" .balign 4 .globl STR_do_xmapSTR_do_xmap: mov r0,pc; mov pc,lr .asciz "do_xmap fdi=%x ehdr=%p xi=%p(%x %p) av=%p p_reloc=%p f_unf=%p\n" .balign 4 .globl STR_upx_mainSTR_upx_main: mov r0,pc; mov pc,lr .asciz "upx_main av=%p szc=%x f_dec=%p f_unf=%p xo=%p(%x %p) xi=%p(%x %p) dynbase=%x\n", .balign 4#endif /*}*/@ vi:ts=8:et:nowrap
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -