как запустить exe из ресурсов не сохраняя его на винте
От: aleksan  
Дата: 07.01.04 08:40
Оценка:
Есть exe который загружен в ресурсы другого EXE.
Как его запустить из памяти не сохраня его предварительно на винте?
Re: как запустить exe из ресурсов не сохраняя его на винте
От: kliff Россия http://www.esignal.ru
Дата: 07.01.04 09:15
Оценка:
Здравствуйте, aleksan, Вы писали:

A>Есть exe который загружен в ресурсы другого EXE.

A>Как его запустить из памяти не сохраня его предварительно на винте?

Насколько я знаю стандартный виндовый загрузчик будет мапать ехе, поэтому вижу два пути — свой диск в памяти или написание своего загрузчика (недавно на форуме что-то пробегало по этому поводу, но там грузилась dll)
Re: как запустить exe из ресурсов не сохраняя его на винте
От: Leonid Troyanovsky  
Дата: 07.01.04 09:16
Оценка: 7 (2)
Здравствуйте, aleksan, Вы писали:

A>Есть exe который загружен в ресурсы другого EXE.

A>Как его запустить из памяти не сохраня его предварительно на винте?

By Gary Nebbet
--
С уважением, LVT
Re[2]: как запустить exe из ресурсов не сохраняя его на винт
От: aleksan  
Дата: 07.01.04 10:02
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Здравствуйте, aleksan, Вы писали:


A>>Есть exe который загружен в ресурсы другого EXE.

A>>Как его запустить из памяти не сохраня его предварительно на винте?

LT>By Gary Nebbet


Леонид, если ты использовал код находящийся по этой ссылке то подскажи как.
extern "C" NTSYSAPI LONG NTAPI ZwUnmapViewOfSection(HANDLE, PVOID);

где взять эту функцию?
Re[3]: как запустить exe из ресурсов не сохраняя его на винт
От: Leonid Troyanovsky  
Дата: 07.01.04 11:16
Оценка:
Здравствуйте, aleksan, Вы писали:

A>>>Есть exe который загружен в ресурсы другого EXE.

A>>>Как его запустить из памяти не сохраня его предварительно на винте?

LT>>By Gary Nebbet


A>Леонид, если ты использовал код находящийся по этой ссылке то подскажи как.

A>extern "C" NTSYSAPI LONG NTAPI ZwUnmapViewOfSection(HANDLE, PVOID);

A>где взять эту функцию?


Эта функция из ntdll.dll
В дельфи я могу описать ее так:

function ZwUnmapViewOfSection(SectionHandle: THandle;
  p: Pointer): DWord; stdcall; external 'ntdll.dll';


или загрузить ntdll.dll LoadLibrary или GetModuleHandle (т.к., она уже отображена)
и получить адрес путем GetProcAddress(ntdllHandle, 'ZwUnmapViewOfSection').

Понятно, что предложенное Gary NT only (по-крайней мере, в моей NT4 оно работает).
Для 9х нужны дополнительные усилия, о чем писал в этом треде James Brown
( это я не испытывал).
--
С уважением, LVT
Re: как запустить exe из ресурсов не сохраняя его на винте
От: Злость Россия  
Дата: 07.01.04 11:25
Оценка: 10 (2)
Здравствуйте, aleksan, Вы писали:

A>Есть exe который загружен в ресурсы другого EXE.

A>Как его запустить из памяти не сохраня его предварительно на винте?

Уже не помню где брал код — сори.

И я чужд от прекрасного

#define  UNICODE
#define _UNICODE

#define WIN32_NO_STATUS
#include <windows.h>
#include "resource.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(L"ntdll.dll"), "ZwCreateThread"));

    //Установлен breakpoint в Dr0
    dr7->L0 = 1;
    //Определим условия для breakpoint в Dr0
    //Прерывание при выполнении инструкции только
    dr7->RWE0 = 0;
    //Определите размер позиции памяти по адресу определенному в регистре адреса 
    //Установим в 1 byte, а другой и не дадут установить
    dr7->LEN0 = 0;

    SetThreadContext(GetCurrentThread(), &context);
}

#ifdef __cplusplus
extern "C" {
#endif
  
extern int __cdecl swprintf(wchar_t *, const wchar_t *, ...);

#ifdef __cplusplus
}
#endif

LONG patch(PEXCEPTION_POINTERS ep)
{
  WCHAR Buffer[4096];
  DWORD *k = new DWORD;
  NTSTATUS status;

   if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) {
     
     HANDLE hProcess = PHANDLE(ep->ContextRecord->Esp)[4];

     swprintf(Buffer,L"HANDLE hProcess = %x, %d \n",hProcess,hProcess);
     OutputDebugString(Buffer);

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

     NT::PROCESS_BASIC_INFORMATION pbi;

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

     swprintf(Buffer,L"NTSTATUS status = %x, %d \n",status,status);
     OutputDebugString(Buffer);

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

     swprintf(Buffer,L"BOOL rezult = %x, %d \n",rezult,rezult);
     OutputDebugString(Buffer);

     status =  NT::ZwUnmapViewOfSection(hProcess, x);

     swprintf(Buffer,L"ZwUnmapViewOfSection: NTSTATUS status = %x, %d \n",status,status);
     OutputDebugString(Buffer);

     HRSRC hRsrc = FindResource(NULL, L"#102", L"EXE");//Image

     swprintf(Buffer,L"FindResource: HRSRC hRsrc = %x, %d",hRsrc,hRsrc);
     OutputDebugString(Buffer);
     if (hRsrc == NULL) {
       swprintf(Buffer,L"GetLastError = %x, %d",GetLastError(),GetLastError());
       OutputDebugString(Buffer);
     }

        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};
  WCHAR szCommandLine[] = L" Explorer";//L"Explorer";
  __try {
    preppatch();
    
    CreateProcess(
      NULL,
      szCommandLine, 0, 0, FALSE, 0, 0, 0, &si, &pi);
  }
  __except (patch(GetExceptionInformation())) {}
  
return 0;
}
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[2]: как запустить exe из ресурсов не сохраняя его на винт
От: Leonid Troyanovsky  
Дата: 07.01.04 12:32
Оценка:
Здравствуйте, Злость, Вы писали:

З>Уже не помню где брал код — сори.


Это тоже от Gary

http://groups.google.com/groups?selm=38AEAC16.F6FC7DA9%40gmx.net
--
С уважением, LVT
Re[3]: как запустить exe из ресурсов не сохраняя его на винт
От: Leonid Troyanovsky  
Дата: 07.01.04 12:34
Оценка: 7 (2) +1
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>http://groups.google.com/groups?selm=38AEAC16.F6FC7DA9%40gmx.net


В смысле вот здесь
--
С уважением, LVT
Re[4]: как запустить exe из ресурсов не сохраняя его на винт
От: peterbes Россия  
Дата: 07.01.04 14:20
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Здравствуйте, Leonid Troyanovsky, Вы писали:


LT>>http://groups.google.com/groups?selm=38AEAC16.F6FC7DA9%40gmx.net


LT> В смысле вот здесь


Как вы откапываете такие ссылки?
Re[5]: как запустить exe из ресурсов не сохраняя его на винт
От: Злость Россия  
Дата: 07.01.04 18:10
Оценка:
Здравствуйте, peterbes, Вы писали:

P>Здравствуйте, Leonid Troyanovsky, Вы писали:


LT>>Здравствуйте, Leonid Troyanovsky, Вы писали:


LT>>>http://groups.google.com/groups?selm=38AEAC16.F6FC7DA9%40gmx.net


LT>> В смысле вот здесь


P>Как вы откапываете такие ссылки?


Заходишь сюда и правильно ставиш вопрос
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[6]: как запустить exe из ресурсов не сохраняя его на винт
От: Аноним  
Дата: 23.03.04 17:59
Оценка:
Здравствуйте, Злость, Вы писали:

З>Здравствуйте, peterbes, Вы писали:


P>>Здравствуйте, Leonid Troyanovsky, Вы писали:


LT>>>Здравствуйте, Leonid Troyanovsky, Вы писали:


LT>>>>http://groups.google.com/groups?selm=38AEAC16.F6FC7DA9%40gmx.net


LT>>> В смысле вот здесь


P>>Как вы откапываете такие ссылки?


З>Заходишь сюда и правильно ставиш вопрос


Re[4]: как запустить exe из ресурсов не сохраняя его на винт
От: Аноним  
Дата: 23.03.04 18:08
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Здравствуйте, aleksan, Вы писали:


A>>>>Есть exe который загружен в ресурсы другого EXE.

A>>>>Как его запустить из памяти не сохраня его предварительно на винте?

LT>>>By Gary Nebbet


A>>Леонид, если ты использовал код находящийся по этой ссылке то подскажи как.

A>>extern "C" NTSYSAPI LONG NTAPI ZwUnmapViewOfSection(HANDLE, PVOID);

A>>где взять эту функцию?


LT> Эта функция из ntdll.dll

LT> В дельфи я могу описать ее так:

LT>
LT>function ZwUnmapViewOfSection(SectionHandle: THandle;
LT>  p: Pointer): DWord; stdcall; external 'ntdll.dll';
LT>


LT> или загрузить ntdll.dll LoadLibrary или GetModuleHandle (т.к., она уже отображена)

LT> и получить адрес путем GetProcAddress(ntdllHandle, 'ZwUnmapViewOfSection').

LT> Понятно, что предложенное Gary NT only (по-крайней мере, в моей NT4 оно работает).

LT> Для 9х нужны дополнительные усилия, о чем писал в этом треде James Brown
LT> ( это я не испытывал).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.