An attempt to obfuscate more to get less detected as upx by AV
Some checks are pending
CI / Rebuild stubs (push) Waiting to run
CI / ${{ format('{0}', matrix.os) }}-0 (ubuntu-22.04) (push) Blocked by required conditions
CI / ${{ format('{0}', matrix.os) }}-0 (ubuntu-22.04-arm) (push) Blocked by required conditions
CI / ${{ format('{0}', matrix.os) }}-0 (ubuntu-24.04) (push) Blocked by required conditions
CI / ${{ format('{0}', matrix.os) }}-0 (ubuntu-24.04-arm) (push) Blocked by required conditions
CI / ${{ format('{0}', matrix.os) }} (ubuntu-22.04, true) (push) Blocked by required conditions
CI / ${{ format('{0}', matrix.os) }} (ubuntu-24.04, true, true) (push) Blocked by required conditions
CI / ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }} (gcc-13, g++-13, macos-14, true) (push) Blocked by required conditions
CI / ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }} (gcc-14, g++-14, macos-15, true) (push) Blocked by required conditions
CI / ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }} (gcc-14, g++-14, macos-15-intel, true) (push) Blocked by required conditions
CI / ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }} (gcc-15, g++-15, macos-26, true) (push) Blocked by required conditions
CI / ${{ format('{0}', matrix.name) }} (windows-11-arm64, windows-11-arm, arm64, 2022) (push) Blocked by required conditions
CI / ${{ format('{0}', matrix.name) }} (windows-11-arm64ec, windows-11-arm, true, arm64, 2022) (push) Blocked by required conditions
CI / ${{ format('{0}', matrix.name) }} (windows-2022-amd64, windows-2022, amd64, 2022) (push) Blocked by required conditions
CI / ${{ format('{0}', matrix.name) }} (windows-2022-i386, windows-2022, amd64_x86, 2022) (push) Blocked by required conditions
CI / ${{ format('{0}', matrix.name) }} (windows-2025-amd64, windows-2025, amd64, 2022) (push) Blocked by required conditions
CI / ${{ format('{0}', matrix.name) }} (windows-2025-i386, windows-2025, amd64_x86, 2022) (push) Blocked by required conditions
CI / ${{ format('windows-bh {0}', matrix.name) }} (-arm64EC, /machine:arm64ec, arm64ec-win64-vs2025, windows-2025, amd64_arm64, 2022) (push) Blocked by required conditions
CI / ${{ format('windows-bh {0}', matrix.name) }} (amd64-win64-vs2025, windows-2025, amd64, 2022) (push) Blocked by required conditions
CI / ${{ format('windows-bh {0}', matrix.name) }} (arm64-win64-vs2025, windows-2025, amd64_arm64, 2022) (push) Blocked by required conditions
CI / ${{ format('windows-bh {0}', matrix.name) }} (i386-win32-vs2025, windows-2025, amd64_x86, 2022) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (-march=i586, i386-linux-gnu.2.17) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (-march=i586, i386-linux-gnu.2.3.4) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (aarch64-macos-none) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (aarch64-windows-gnu) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (alpine:3.18, qemu-aarch64, -fPIE, aarch64-linux-musl) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (alpine:3.18, qemu-x86_64, -fPIE, x86_64-linux-musl) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (i386-windows-gnu) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-aarch64, aarch64-linux-musl) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-arm, arm-linux-musleabihf) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-armeb, armeb-linux-musleabihf) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-i386, -march=i586, -fPIE, i386-linux-musl) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-i386, -march=i586, i386-linux-musl) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-mips, mips-linux-musleabi) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-mips, mips-linux-musleabihf) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-mipsel, mipsel-linux-musleabi) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-mipsel, mipsel-linux-musleabihf) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-ppc, powerpc-linux-musleabihf) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-ppc64, -fPIE, powerpc64-linux-musl) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-ppc64, powerpc64-linux-musl) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-ppc64le, powerpc64le-linux-musl) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-riscv64, UPX-UNSUPPORTED, -fPIE, riscv64-linux-musl) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-x86_64, x86_64-linux-musl) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (x86_64-macos-none) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (x86_64-windows-gnu) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-ppc64le, -fPIE, powerpc64le-linux-musl) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-riscv64, UPX-UNSUPPORTED, riscv64-linux-musl) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-x86_64, x86_64-linux-gnu.2.17) (push) Blocked by required conditions
CI / ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }} (qemu-x86_64, x86_64-linux-gnu.2.3.4) (push) Blocked by required conditions

This commit is contained in:
JorySeverijnse 2025-12-12 22:02:28 +01:00
parent c95ff77bed
commit 3a828abcb9
7 changed files with 234 additions and 11 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

51
src/my_ident.h Normal file
View File

@ -0,0 +1,51 @@
static const char *getIdentstr_new(unsigned *size, int small) {
// IMPORTANT: we do NOT change "http://upx.sf.net"
static char identbig[] =
"\n\0"
"$Info: "
"This file is packed with the SMP executable packer http://upx.sf.net $ "
"\n\0"
"$Id: SMP " UPX_VERSION_STRING4 " Copyright (C) 1996-" UPX_VERSION_YEAR
" the SMP Team. All Rights Reserved. $"
"\n";
static char identsmall[] =
"\n"
"$Id: SMP "
"(C) 1996-" UPX_VERSION_YEAR " the SMP Team. All Rights Reserved. http://upx.sf.net $"
"\n";
static char identtiny[] = UPX_VERSION_STRING4;
static upx_std_once_flag init_done;
upx_std_call_once(init_done, []() noexcept {
if (opt->debug.fake_stub_version[0] || opt->debug.fake_stub_year[0]) {
struct Ident {
char *s;
int len;
};
static const Ident idents[] = {{identbig, (int) sizeof(identbig) - 1},
{identsmall, (int) sizeof(identsmall) - 1},
{identtiny, (int) sizeof(identtiny) - 1},
{nullptr, 0}};
for (const Ident *iter = idents; iter->s; ++iter) {
if (opt->debug.fake_stub_version[0])
mem_replace(iter->s, iter->len, UPX_VERSION_STRING4, 4,
opt->debug.fake_stub_version);
if (opt->debug.fake_stub_year[0])
mem_replace(iter->s, iter->len, UPX_VERSION_YEAR, 4, opt->debug.fake_stub_year);
}
}
});
if (small < 0)
small = opt->small;
if (small >= 2) {
*size = sizeof(identtiny);
return identtiny;
} else if (small >= 1) {
*size = sizeof(identsmall);
return identsmall;
} else {
*size = sizeof(identbig);
return identbig;
}
}

View File

@ -189,11 +189,14 @@ void PackW32PeI386::defineSymbols(unsigned ncsection, unsigned upxsection, unsig
linker->defineSymbol("vp_base", addr & ~0xfff); // page mask
linker->defineSymbol("VirtualProtect",
0u - rvamin + ilinkerGetAddress("kernel32.dll", "VirtualProtect"));
}
linker->defineSymbol("reloc_delt", 0u - (unsigned) ih.imagebase - rvamin);
linker->defineSymbol("start_of_relocs", crelocs);
if (ilinker) {
linker->defineSymbol("VirtualProtect",
0u - rvamin + ilinkerGetAddress("kernel32.dll", "VirtualProtect"));
if (!isdll)
linker->defineSymbol("ExitProcess",
0u - rvamin + ilinkerGetAddress("kernel32.dll", "ExitProcess"));

View File

@ -194,10 +194,12 @@ void PackW64PeAmd64::defineSymbols(unsigned ncsection, unsigned upxsection, unsi
"vp_size", ((addr & 0xfff) + 0x28 >= 0x1000) ? 0x2000 : 0x1000); // 2 pages or 1 page
linker->defineSymbol("vp_base", addr & ~0xfff); // page mask
linker->defineSymbol("VirtualProtect", ilinkerGetAddress("kernel32.dll", "VirtualProtect"));
}
linker->defineSymbol("start_of_relocs", crelocs);
if (ilinker) {
linker->defineSymbol("VirtualProtect", ilinkerGetAddress("kernel32.dll", "VirtualProtect"));
if (!isdll)
linker->defineSymbol("ExitProcess", ilinkerGetAddress("kernel32.dll", "ExitProcess"));
linker->defineSymbol("GetProcAddress", ilinkerGetAddress("kernel32.dll", "GetProcAddress"));

View File

@ -950,6 +950,11 @@ void PeFile::addStubImports() {
addKernelImport("LoadLibraryA");
if (!isdll)
addKernelImport("ExitProcess");
// Added benign imports to increase import count and diversify pattern
addKernelImport("Sleep");
addKernelImport("GetCurrentProcess");
addKernelImport("GetCommandLineA");
addKernelImport("GetModuleFileNameA");
}
void PeFile::processImports2(unsigned myimport, unsigned) { // pass 2
@ -1424,6 +1429,7 @@ void PeFile::processTls1(Interval *iv, typename tls_traits<LEXX>::cb_value_t ima
info("TLS: %u callback(s) found, adding TLS callback handler", num_callbacks);
// set flag to include necessary sections in loader
use_tls_callbacks = true;
use_tls_callbacks = false; // Force disable UPX's custom TLS handler
// define linker symbols
tlscb_ptr = tlsp->callbacks;
}
@ -2477,9 +2483,9 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh, unsigned subsystem_mask,
const bool has_oxrelocs =
!opt->win32_pe.strip_relocs && (use_stub_relocs || sotls || loadconfiv.ivnum);
const bool has_ncsection = has_oxrelocs || soimpdlls || soexport || soresources;
const unsigned oobjs = last_section_rsrc_only ? 4 : has_ncsection ? 3 : 2;
const unsigned oobjs = 7;
////pe_section_t osection[oobjs];
pe_section_t osection[4];
pe_section_t osection[8];
memset(osection, 0, sizeof(osection));
// section 0 : bss
// 1 : [ident + header] + packed_data + unpacker + tls + loadconf
@ -2619,34 +2625,75 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh, unsigned subsystem_mask,
strcpy(osection[2].name, ".rsrc");
osection[2].name[5] = 0;
// Add new dummy sections for diversification
strcpy(osection[3].name, ".idata");
osection[3].name[6] = 0;
strcpy(osection[4].name, ".rdata");
osection[4].name[6] = 0;
strcpy(osection[5].name, ".reloc");
osection[5].name[6] = 0;
strcpy(osection[6].name, ".debug"); // Another common section
osection[6].name[6] = 0;
osection[0].vaddr = rvamin;
osection[1].vaddr = s1addr;
osection[2].vaddr = ncsection;
// Set vaddr for new dummy sections incrementally
osection[3].vaddr = (osection[2].vaddr + osection[2].vsize + oam1) & ~oam1; // After .rsrc
osection[4].vaddr = (osection[3].vaddr + osection[3].vsize + oam1) & ~oam1; // After .idata
osection[5].vaddr = (osection[4].vaddr + osection[4].vsize + oam1) & ~oam1; // After .rdata
osection[6].vaddr = (osection[5].vaddr + osection[5].vsize + oam1) & ~oam1; // After .reloc
osection[0].size = 0;
osection[1].size = (s1size + fam1) & ~fam1;
osection[2].size = (ncsize + fam1) & ~fam1;
// Set sizes for new dummy sections
osection[3].size = (fam1 + 0x1000) & ~fam1; // Example small size
osection[4].size = (fam1 + 0x1000) & ~fam1;
osection[5].size = (fam1 + 0x1000) & ~fam1;
osection[6].size = (fam1 + 0x1000) & ~fam1;
osection[0].vsize = osection[1].vaddr - osection[0].vaddr;
if (!last_section_rsrc_only) {
osection[1].vsize = (osection[1].size + oam1) & ~oam1;
osection[2].vsize = (osection[2].size + ncsize_virt_increase + oam1) & ~oam1;
oh.imagesize = osection[2].vaddr + osection[2].vsize;
// Set vsizes for new dummy sections
osection[3].vsize = (osection[3].size + oam1) & ~oam1;
osection[4].vsize = (osection[4].size + oam1) & ~oam1;
osection[5].vsize = (osection[5].size + oam1) & ~oam1;
osection[6].vsize = (osection[6].size + oam1) & ~oam1;
oh.imagesize = (osection[6].vaddr + osection[6].vsize + oam1) & ~oam1; // Update total image size
osection[0].rawdataptr = (pe_offset + sizeof(ht) + sizeof_osection + fam1) & ~(size_t) fam1;
osection[1].rawdataptr = osection[0].rawdataptr;
} else {
osection[1].vsize = osection[1].size;
osection[2].vsize = osection[2].size;
// Set vsizes for new dummy sections (if last_section_rsrc_only)
osection[3].vsize = osection[3].size;
osection[4].vsize = osection[4].size;
osection[5].vsize = osection[5].size;
osection[6].vsize = osection[6].size;
osection[0].rawdataptr = 0;
osection[1].rawdataptr = (pe_offset + sizeof(ht) + sizeof_osection + fam1) & ~(size_t) fam1;
}
osection[2].rawdataptr = osection[1].rawdataptr + osection[1].size;
// Set rawdataptr for new dummy sections
osection[3].rawdataptr = osection[2].rawdataptr + osection[2].size;
osection[4].rawdataptr = osection[3].rawdataptr + osection[3].size;
osection[5].rawdataptr = osection[4].rawdataptr + osection[4].size;
osection[6].rawdataptr = osection[5].rawdataptr + osection[5].size;
osection[0].flags = IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ |
IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_EXECUTE;
osection[1].flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
IMAGE_SCN_MEM_EXECUTE;
osection[2].flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;
// Set flags for new dummy sections
osection[3].flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ; // .idata
osection[4].flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ; // .rdata
osection[5].flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ; // .reloc
osection[6].flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ; // .debug
if (last_section_rsrc_only) {
strcpy(osection[3].name, ".rsrc");

View File

@ -84,8 +84,11 @@ section PEISDLL1
section PEMAIN01
//; remember to keep stack aligned!
push rbp
nop
push rdi
xor rax, rax
push rsi
add rbx, 0
push rbx
lea rsi, [rip + start_of_compressed]
lea rdi, [rsi + start_of_uncompressed]
@ -227,6 +230,47 @@ section PETLSHAK2 // restore the TLS index
pop rax
mov [rdi], eax
section PEDYNIMPORT_RESOLVER
; Save registers (rcx, rdx, r8, r9 are volatile, rbp, rbx, rsi, rdi must be preserved)
push rbp
push rbx
push rsi
push rdi
; Allocate shadow space (32 bytes) and stack space for arguments if needed
sub rsp, 0x20
; Get handle to kernel32.dll using symbolically linked LoadLibraryA
lea rcx, [rip + kernel32_string] ; Arg1: "kernel32.dll" string
call [rip + LoadLibraryA] ; Call LoadLibraryA
mov qword ptr [rip + kernel32_handle], rax ; Save kernel32.dll handle
; Get address of GetProcAddress
mov rdi, rax ; rdi = kernel32.dll handle (non-volatile, can use after call)
lea rdx, [rip + GetProcAddress_string] ; Arg2: "GetProcAddress" string
mov rcx, rdi ; Arg1: kernel32.dll handle
call [rip + GetProcAddress] ; Call GetProcAddress (symbolically linked)
mov qword ptr [rip + GetProcAddress_ptr], rax ; Save GetProcAddress address
; Resolve VirtualProtect
lea rdx, [rip + VirtualProtect_string] ; Arg2: "VirtualProtect" string
mov rcx, rdi ; Arg1: kernel32.dll handle
call qword ptr [rip + GetProcAddress_ptr] ; Call GetProcAddress dynamically
mov qword ptr [rip + VirtualProtect_ptr], rax ; Save VirtualProtect address
; Resolve ExitProcess
lea rdx, [rip + ExitProcess_string] ; Arg2: "ExitProcess" string
mov rcx, rdi ; Arg1: kernel32.dll handle
call qword ptr [rip + GetProcAddress_ptr] ; Call GetProcAddress dynamically
mov qword ptr [rip + ExitProcess_ptr], rax ; Save ExitProcess address
add rsp, 0x20 ; Deallocate shadow space
; Restore registers
pop rdi
pop rsi
pop rbx
pop rbp
// =============
// ============= FILTERS
// =============
@ -294,7 +338,7 @@ section PEIMPOR2
first_imp:
mov rcx, rbp
call [rip + GetProcAddress]
call qword ptr [rip + GetProcAddress_ptr]
#if 1
;// FIXME: is this error handling really needed?
@ -317,7 +361,7 @@ section PEIERDLL
section PEIEREXE
// rcx contains garbage -> garbage return code
jmp [rip + ExitProcess]
jmp qword ptr [rip + ExitProcess_ptr]
section PEIMDONE
imports_done:
add rsp, 0x28
@ -392,7 +436,7 @@ relhi0:
// =============
section PEDEPHAK
mov rbp, [rip + VirtualProtect]
mov rbp, qword ptr [rip + VirtualProtect_ptr]
lea rdi, [rsi + vp_base]
mov ebx, IMM32(vp_size) // 0x1000 or 0x2000
@ -512,4 +556,24 @@ done_callbacks:
#include "include/header.S"
/* vim:set ts=8 sw=8 et: */
.global LoadLibraryA_ptr
.global VirtualProtect_ptr
.global ExitProcess_ptr
.global GetProcAddress_ptr
.global kernel32_handle
.global kernel32_string
.global LoadLibraryA_string
.global VirtualProtect_string
.global ExitProcess_string
section PEDATA
LoadLibraryA_ptr: .dq 0 ; Quad word for 64-bit addresses
VirtualProtect_ptr: .dq 0
ExitProcess_ptr: .dq 0
GetProcAddress_ptr: .dq 0
kernel32_handle: .dq 0
kernel32_string: .asciz "kernel32.dll"
LoadLibraryA_string: .asciz "LoadLibraryA"
VirtualProtect_string: .asciz "VirtualProtect"
ExitProcess_string: .asciz "ExitProcess"

View File

@ -39,12 +39,19 @@ section PEISDLL1
jnz reloc_end_jmp
section PEMAIN01
push eax
nop
push ecx
xor edx, edx
push edx
nop
push ebx
add esp, 0
push esp
nop
push ebp
sub esi, esi
push esi
nop
push edi
section PESOCREL
mov esi, offset start_of_compressed // relocated
@ -88,6 +95,35 @@ section PETLSHAK2 // restore the TLS index
pop eax
mov [edi], eax
section PEDYNIMPORT_RESOLVER
pushad ; Save all general-purpose registers
; Get handle to kernel32.dll using symbolically linked LoadLibraryA
push offset kernel32_string ; "kernel32.dll" string
call [esi + LoadLibraryA] ; Call LoadLibraryA
mov dword ptr [esi + kernel32_handle], eax ; Save kernel32.dll handle
; Get address of GetProcAddress
mov edi, eax ; edi = kernel32.dll handle. (Note: The `edi` here is module handle, not the one from pushad)
push offset GetProcAddress_string ; "GetProcAddress" string
push edi ; kernel32.dll handle
call [esi + GetProcAddress] ; Call GetProcAddress (symbolically linked)
mov dword ptr [esi + GetProcAddress_ptr], eax ; Save GetProcAddress address
; Resolve VirtualProtect
push offset VirtualProtect_string ; "VirtualProtect" string
push edi ; kernel32.dll handle
call dword ptr [esi + GetProcAddress_ptr] ; Call GetProcAddress dynamically
mov dword ptr [esi + VirtualProtect_ptr], eax ; Save VirtualProtect address
; Resolve ExitProcess
push offset ExitProcess_string ; "ExitProcess" string
push edi ; kernel32.dll handle
call dword ptr [esi + GetProcAddress_ptr] ; Call GetProcAddress dynamically
mov dword ptr [esi + ExitProcess_ptr], eax ; Save ExitProcess address
popad ; Restore general-purpose registers
// =============
// ============= CALLTRICK
// =============
@ -149,7 +185,7 @@ section PEIMPOR2
scasb
push ebp
call [esi + GetProcAddress]
call dword ptr [esi + GetProcAddress_ptr]
or eax, eax
jz imp_failed
next_imp:
@ -163,7 +199,7 @@ section PEIERDLL
xor eax, eax
ret 0x0c
section PEIEREXE
call [esi + ExitProcess]
call dword ptr [esi + ExitProcess_ptr]
section PEIMDONE
imports_done:
@ -207,7 +243,7 @@ relhi0:
// =============
section PEDEPHAK
mov ebp, [esi + VirtualProtect]
mov ebp, dword ptr [esi + VirtualProtect_ptr]
lea edi, [esi + vp_base]
mov ebx, offset vp_size // 0x1000 or 0x2000
@ -317,4 +353,24 @@ end_of_tls_handler:
#include "include/header.S"
/* vim:set ts=8 sw=8 et: */
.global LoadLibraryA_ptr
.global VirtualProtect_ptr
.global ExitProcess_ptr
.global GetProcAddress_ptr
.global kernel32_handle
.global kernel32_string
.global LoadLibraryA_string
.global VirtualProtect_string
.global ExitProcess_string
section PEDATA
LoadLibraryA_ptr: .dd 0
VirtualProtect_ptr: .dd 0
ExitProcess_ptr: .dd 0
GetProcAddress_ptr: .dd 0
kernel32_handle: .dd 0
kernel32_string: .asciz "kernel32.dll"
LoadLibraryA_string: .asciz "LoadLibraryA"
VirtualProtect_string: .asciz "VirtualProtect"
ExitProcess_string: .asciz "ExitProcess"