Есть exe который загружен в ресурсы другого EXE.
Как его запустить из памяти не сохраня его предварительно на винте?
Здравствуйте, aleksan, Вы писали:
A>Есть exe который загружен в ресурсы другого EXE.
A>Как его запустить из памяти не сохраня его предварительно на винте?
By Gary Nebbet
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Здравствуйте, aleksan, Вы писали:
A>>Есть exe который загружен в ресурсы другого EXE.
A>>Как его запустить из памяти не сохраня его предварительно на винте?
LT>By Gary Nebbet
Леонид, если ты использовал код находящийся по этой ссылке то подскажи как.
extern "C" NTSYSAPI LONG NTAPI ZwUnmapViewOfSection(HANDLE, PVOID);
где взять эту функцию?
Здравствуйте, 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
( это я не испытывал).
Здравствуйте, 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;
}
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>>http://groups.google.com/groups?selm=38AEAC16.F6FC7DA9%40gmx.net
LT> В смысле вот здесь
Как вы откапываете такие ссылки?
Здравствуйте, peterbes, Вы писали:
P>Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>>Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>>>http://groups.google.com/groups?selm=38AEAC16.F6FC7DA9%40gmx.net
LT>> В смысле вот здесь
P>Как вы откапываете такие ссылки?
Заходишь сюда и правильно ставиш вопрос
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Здравствуйте, Злость, Вы писали:
З>Здравствуйте, peterbes, Вы писали:
P>>Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>>>Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>>>>http://groups.google.com/groups?selm=38AEAC16.F6FC7DA9%40gmx.net
LT>>> В смысле вот здесь
P>>Как вы откапываете такие ссылки?
З>Заходишь сюда и правильно ставиш вопрос
Здравствуйте, 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> ( это я не испытывал).