?? arm.v4a-wince.pe.s
字號:
/* arm.v4a-wince.pe.S -- ARM/PE decompressor assembly startup (arm mode) 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/arm/v4a/macros.S"// DEBUG == 0 -> none// DEBUG == 1 -> for armpe_tester// DEBUG == 2 -> wince - dumps memory// DEBUG == 3 -> wince - removes files#define DEBUG 0#if DEBUG == 0# define DINIT# define DDUMP(x)# define DDONE#else #define DDUMP(x) stmfd sp!, {r0 - r3}; mov r0, x; mov lr, pc; mov pc, r8; ldmia sp!, {r0 - r3} #if DEBUG == 1 #define DINIT mov r8, r0 #define DDONE mov pc, lr #elif DEBUG == 2 #define DINIT adr r8, writefile #define DDONE #elif DEBUG == 3 #define DINIT adr r8, DelFile #define DDONE #endif#endif// p_armpe.cpp uses the following symbols, so they should be global .globl SRC0 .globl DST0 .globl IATT .globl ENTR .globl FIBS .globl FIBE .globl BREL .globl BIMP .globl ONAM@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .arm dst0 .req r9 @ global registersection DllStart cmp r1, #1 bne .Lstart_origsection ExeStart stmfd sp!, {r0 - r11, lr} DINIT adr r3, SRC0 ldmia r3!, {r0, r1, r2} @ r0=src0, r1=slen, r2=dst0, r3=addr dstl ldmia r3, {r4, r10, r11} @ r10=LoadLibraryW, r11=GetProcAddressA mov dst0, r2 bl ProcessAll mov r0, #4 bl CacheSync ldmia sp!, {r0 - r11, lr} DDONE.Lstart_orig: ldr pc, ENTRCacheSync: ldr pc, IATT + 8SRC0: .long start_of_compressedSRCL: .long compressed_lengthDST0: .long start_of_uncompressedDSTL: .long uncompressed_lengthIATT: .long 0, 0, 0, 0ENTR: .long original_entry@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#if DEBUG == 2writefile: stmfd sp!, {r4, r5, r6, r7, lr} mov r1, dst0 sub r2, r8, r1 add r2, r2, #4096+2048 mov r3, #2 sub sp, sp, #24 mov r4, #0 strh r0, [sp, #18] str r3, [sp, #0] mov r0, #128 mov r3, #92 str r0, [sp, #4] mov r6, r1 mov r7, r2 strh r3, [sp, #16] strh r4, [sp, #20] mov r3, r4 str r4, [sp, #8] mov r1, #1073741824 mov r2, #3 add r0, sp, #16 ldr ip, .L3 mov lr, pc mov pc, ip add r3, sp, #12 mov r5, r0 str r4, [sp, #0] mov r1, r6 mov r2, r7 ldr ip, .L3+4 mov lr, pc mov pc, ip mov r0, r5 ldr r3, .L3+8 mov lr, pc mov pc, r3 add sp, sp, #24 ldmfd sp!, {r4, r5, r6, r7, pc}.L3: .word 33135704 .word 33135968 .word 33137392#endif#if DEBUG == 3DelFile: adr r1, filename strb r0, [r1, #2] mov r0, r1 ldr pc, deleteffilewdeleteffilew: .word 0x1f99bc8filename: .byte '\\', 0, 'r', 0, 0, 0 .align 2#endif@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ProcessAll: stmfd sp!, {lr} @@ uncompress/unfilter/imports/relocs are copied here by the upx linkersection ProcessEnd ldmia sp!, {pc}@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@section Unfilter_0x50 buffer .req r0 addval .req r2 bufend .req ip ldr buffer, FIBS mov addval, #0 ldr bufend, FIBE.Luf50_0: cmp buffer, bufend beq .Luf_end ldr r3, [buffer] and r1, r3, #0x0f000000 cmp r1, #0x0b000000 bne .Luf50_1 and r1, r3, #0xff000000 sub r3, r3, addval and r3, r3, #0x00ffffff orr r3, r3, r1 str r3, [buffer].Luf50_1: add buffer, buffer, #4 add addval, addval, #1 b .Luf50_0 .unreq buffer .unreq addval .unreq bufendFIBS: .long filter_buffer_startFIBE: .long filter_buffer_end.Luf_end: DDUMP (#'F')@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@section Relocs dest .req r0 buffer .req r1 addval .req dst0 ldr buffer, BREL sub dest, addval, #4.Lreloc_loop: ldrb r3, [buffer], #1 cmp r3, #0 beq .Lreloc_end cmp r3, #0xf0 bichs ip, r3, #0xf0 ldrhsb r3, [buffer, #1] @ get_le16 addhs ip, r3, ip, lsl #8 ldrhsb r3, [buffer], #2 addhs r3, r3, ip, lsl #8 add dest, dest, r3 ldrb r3, [dest] @ get_be32 add ip, r3, ip, lsl #8 ldrb r3, [dest, #1] add ip, r3, ip, lsl #8 ldrb r3, [dest, #2] add ip, r3, ip, lsl #8 ldrb r3, [dest, #3] add ip, r3, ip, lsl #8 add ip, ip, addval str ip, [dest] b .Lreloc_loopBREL: .long start_of_relocs .unreq buffer .unreq addval .unreq dest.Lreloc_end: DDUMP (#'R')@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@section Imports imp .req r4 iat .req r5 dll .req r6 .equ bufsize, 2048 sub sp, sp, #bufsize ldr imp, BIMP.Lhi_loop1: mov r0, imp bl get_le32 beq .Lhi_end ldr r1, ONAM add r0, r0, r1 mov r1, sp.Lhi_copyname: ldrb r2, [r0], #1 strh r2, [r1], #2 cmp r2, #0 bne .Lhi_copyname mov r0, sp bl LoadLibraryW mov dll, r0 add r0, imp, #4 bl get_le32 add iat, dst0, r0 add imp, imp, #8.Lhi_gpa_loop: ldrb r0, [imp], #1 cmp r0, #1 bmi .Lhi_loop1 bne .Lhi_by_ord mov r1, imp.Lhi_by_name: ldrb r0, [imp], #1 cmp r0, #0 bne .Lhi_by_name b .Lhi_call_gpa.Lhi_by_ord: ldrb r0, [imp], #1 ldrb r1, [imp], #1 add r1, r0, r1, lsl #8.Lhi_call_gpa: mov r0, dll bl GetProcAddressA str r0, [iat], #4 b .Lhi_gpa_loop .unreq iat .unreq imp .unreq dllget_le32: @ optimized for size mov r2, #3.Lg0: ldrb r3, [r0, r2] subs r2, r2, #1 add r1, r3, r1, asl #8 bpl .Lg0 movs r0, r1 @ set the Z flag if zero mov pc, lrLoadLibraryW: mov pc, r10GetProcAddressA: mov pc, r11BIMP: .long start_of_importsONAM: .long start_of_dll_names.Lhi_end: add sp, sp, #bufsize DDUMP (#'I')@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#include "include/header.S"section .ucl_nrv2e_decompress_8#include "arch/arm/v4a/nrv2e_d8.S"section Call2E bl ucl_nrv2e_decompress_8 DDUMP (#'C')section .ucl_nrv2d_decompress_8#include "arch/arm/v4a/nrv2d_d8.S"section Call2D bl ucl_nrv2d_decompress_8 DDUMP (#'C')section .ucl_nrv2b_decompress_8#include "arch/arm/v4a/nrv2b_d8.S"section Call2B bl ucl_nrv2b_decompress_8 DDUMP (#'C')////////////////////////////////////////section CallLZMA // r0=src0, r1=slen, r2=dst0, r3=addr dstl parb .req r3 para .req r4 parc .req r5 pard .req r6 adr r7, .LzmaParams ldmia r7, {parb, para, parc, pard} // load params mov r7, sp // save stack add para, para, sp mov ip, #0.Lclearstack: stmfd sp!, {ip} cmp sp, para bne .Lclearstack stmfd sp!, {r2, parb, para} // out, outSize, &outSizeProcessed add r3, para, #4 // &inSizeProcessed mov r2, parc // inSize add r1, r0, #2 // in add r0, para, #8 // &CLzmaDecoderState str pard, [r0] // lc, lp, pb, dummy bl LZMA_DECODE mov sp, r7 b .LLZMA_end.LzmaParams: .long lzma_u_len, lzma_stack_adjust, lzma_c_len, lzma_properties.LLZMA_end:section LZMA_DECODEsection LZMA_DEC10#include "arch/arm/v4a/lzma_d_cs.S"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -