![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запуск приложения из памяти
Margolis © (2013-03-22 19:22:00)Пишу не вирус и не троян.
Необходимо, что бы моя программа при регистрации скачала с сайта консольную мою утилитку, декриптовала в памяти её и запустила на выполнение не сохраняя на диске.
Может кто сталкивался или есть в закромах код?
Разведка (2013-03-30 20:41:00) [1]Сей код уже не актуален и годится только для изучения
unit MemProcess;
interface
uses
Windows,scrb;
type
TImportItem = record
Name: string;
PProcVar: ^Pointer;
end;
TwordArr = array [0..0] of word;
PwordArr = ^TwordArr;
TdwordArr = array [0..0] of dword;
PdwordArr = ^TdwordArr;
PImageImportDescriptor = ^TImageImportDescriptor;
TImageImportDescriptor = packed record
OriginalFirstThunk: dword;
TimeDateStamp: dword;
ForwarderChain: dword;
Name: dword;
FirstThunk: dword;
end;
PImageBaseRelocation= ^TImageBaseRelocation;
TImageBaseRelocation = packed record
VirtualAddress: cardinal;
SizeOfBlock: cardinal;
end;
TDllEntryProc = function(hinstDLL: HMODULE; dwReason: dword; lpvReserved: Pointer): Boolean; stdcall;
TStringArray = array of string;
TLibInfo = record
ImageBase: Pointer;
DllProc: TDllEntryProc;
LibsUsed: TStringArray;
end;
PLibInfo = ^TLibInfo;
PPointer = ^Pointer;
///////////////////////////////////////////////////////////////
const
IMAGE_SIZEOF_SHORT_NAME = 8;
type
PImageNtHeaders = ^TImageNtHeaders;
_IMAGE_NT_HEADERS = packed record
Signature: DWORD;
FileHeader: TImageFileHeader;
OptionalHeader: TImageOptionalHeader;
end;
TImageNtHeaders = _IMAGE_NT_HEADERS;
IMAGE_NT_HEADERS = _IMAGE_NT_HEADERS;
TISHMisc = packed record
case Integer of
0: (PhysicalAddress: DWORD);
1: (VirtualSize: DWORD);
end;
PPImageSectionHeader = ^PImageSectionHeader;
PImageSectionHeader = ^TImageSectionHeader;
_IMAGE_SECTION_HEADER = packed record
Name: packed array[0..IMAGE_SIZEOF_SHORT_NAME-1] of Byte;
Misc: TISHMisc;
VirtualAddress: DWORD;
SizeOfRawData: DWORD;
PointerToRawData: DWORD;
PointerToRelocations: DWORD;
PointerToLinenumbers: DWORD;
NumberOfRelocations: Word;
NumberOfLinenumbers: Word;
Characteristics: DWORD;
end;
{$EXTERNALSYM _IMAGE_SECTION_HEADER}
TImageSectionHeader = _IMAGE_SECTION_HEADER;
IMAGE_SECTION_HEADER = _IMAGE_SECTION_HEADER;
////////////////////////////////////////////////////////////
TSections = array [0..100000] of TImageSectionHeader;
const
IMPORTED_NAME_OFFSET = $00000002;
IMAGE_ORDINAL_FLAG32 = $80000000;
IMAGE_ORDINAL_MASK32 = $0000FFFF;
procedure CreateProcessEx(FileMemory: pointer);
implementation
{-------------------------------- ImageSize -----------------------------------}
function ImageSize(Image: pointer): dword;
var
Alignment: dword;
ImageNtHeaders: PImageNtHeaders;
PSections: ^TSections;
SectionLoop: dword;
begin
ImageNtHeaders := pointer(dword(dword(Image)) + dword(PImageDosHeader(Image)._lfanew));
Alignment := ImageNtHeaders.OptionalHeader.SectionAlignment;
if ((ImageNtHeaders.OptionalHeader.SizeOfHeaders mod Alignment) = 0) then
begin
Result := ImageNtHeaders.OptionalHeader.SizeOfHeaders;
end
else
begin
Result := ((ImageNtHeaders.OptionalHeader.SizeOfHeaders div Alignment) + 1) * Alignment;
end;
PSections := pointer(pchar(@(ImageNtHeaders.OptionalHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader);
for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
begin
if PSections[SectionLoop].Misc.VirtualSize <> 0 then
begin
if ((PSections[SectionLoop].Misc.VirtualSize mod Alignment) = 0) then
begin
Result := Result + PSections[SectionLoop].Misc.VirtualSize;
end
else
begin
Result := Result + (((PSections[SectionLoop].Misc.VirtualSize div Alignment) + 1) * Alignment);
end;
end;
end;
end;
{--------------------------------- GetAlignedSize -----------------------------}
function GetAlignedSize(Size: dword; Alignment: dword): dword;
begin
if ((Size mod Alignment) = 0) then
begin
Result := Size;
end
else
begin
Result := ((Size div Alignment) + 1) * Alignment;
end;
end;
{--------------------------------- CreateProcessEx ----------------------------}
procedure CreateProcessEx(FileMemory: pointer);
var
BaseAddress, Bytes, HeaderSize, InjectSize, SectionLoop, SectionSize: dword;
Context: TContext;
FileData: pointer;
ImageNtHeaders: PImageNtHeaders;
InjectMemory: pointer;
ProcInfo: TProcessInformation;
PSections: ^TSections;
StartInfo: TStartupInfo;
begin
ImageNtHeaders := pointer(dword(dword(FileMemory)) + dword(PImageDosHeader(FileMemory)._lfanew));
InjectSize := ImageSize(FileMemory);
GetMem(InjectMemory, InjectSize);
try
FileData := InjectMemory;
HeaderSize := ImageNtHeaders.OptionalHeader.SizeOfHeaders;
PSections := pointer(pchar(@(ImageNtHeaders.OptionalHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader);
for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
begin
if PSections[SectionLoop].PointerToRawData < HeaderSize then HeaderSize := PSections[SectionLoop].PointerToRawData;
end;
CopyMemory(FileData, FileMemory, HeaderSize);
FileData := pointer(dword(FileData) + GetAlignedSize(ImageNtHeaders.OptionalHeader.SizeOfHeaders, ImageNtHeaders.OptionalHeader.SectionAlignment));
for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
begin
if PSections[SectionLoop].SizeOfRawData > 0 then
begin
SectionSize := PSections[SectionLoop].SizeOfRawData;
if SectionSize > PSections[SectionLoop].Misc.VirtualSize then SectionSize := PSections[SectionLoop].Misc.VirtualSize;
CopyMemory(FileData, pointer(dword(FileMemory) + PSections[SectionLoop].PointerToRawData), SectionSize);
FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment));
end
else
begin
if PSections[SectionLoop].Misc.VirtualSize <> 0 then
FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.VirtualSize,
ImageNtHeaders.OptionalHeader.SectionAlignment));
end;
end;
ZeroMemory(@StartInfo, SizeOf(StartupInfo));
ZeroMemory(@Context, SizeOf(TContext));
CreateProcess(nil, pchar(ParamStr(0)), nil, nil, False, CREATE_SUSPENDED, nil, nil, StartInfo, ProcInfo);
Context.ContextFlags := CONTEXT_FULL;
GetThreadContext(ProcInfo.hThread, Context);
ReadProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @BaseAddress, 4, Bytes);
VirtualAllocEx(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectSize, MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectMemory, InjectSize, Bytes);
WriteProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @ImageNtHeaders.OptionalHeader.ImageBase, 4, Bytes);
Context.Eax := ImageNtHeaders.OptionalHeader.ImageBase + ImageNtHeaders.OptionalHeader.AddressOfEntryPoint;
SetThreadContext(ProcInfo.hThread, Context);
ResumeThread(ProcInfo.hThread);
finally
FreeMemory(InjectMemory);
end;
end;
end.
Разведка (2013-03-30 20:35:00) [2]
> Margolis (22.03.13 19:22)
> Пишу не вирус и не троян.Необходимо, что бы моя программа
> при регистрации скачала с сайта консольную мою утилитку,
> декриптовала в памяти её и запустила на выполнение не сохраняя
> на диске.Может кто сталкивался или есть в закромах код?
В любом случае эвристики и антивирусов буду детектировать такие действия как вырус... У меня бы модуль такой с созданием в памяти процесса, потом процесс перезаписывался распакованным из ресурсов exe, запускался, но вот в тот момент когда вызывалась апи-фукция writeprocess то антивирус блочил все это дело.
Rouse_ (2013-03-25 22:54:00) [3]
> Был бы тривиальный кусок кода что-то придумал бы, но эта
> утилитка или dll будет покрыта вмпротом, нужно как отдельный
> процесс запускать.
Ага, понятно - значит очень-очень секретные данные что даже VMProtect-а не хватает и ты решил перестраховаться и до кучи тело зашифровать :)
Rouse_ (2013-03-25 22:51:00) [4]
> Необходимо, что бы моя программа при регистрации скачала
> с сайта консольную мою утилитку, декриптовала в памяти её
> и запустила на выполнение не сохраняя на диске.
Зачем?
Если со скачиванием еще понятно, то не понятно зачем нужно декриптовать (секретные данные?) да еще и запускать не сохраняя (очень секретные данные)?
> Margolis (22.03.13 22:48) [7]
> Простите, а как Все делают? :)
Все используют функционал инсталяторов, которые делает все что нужно разработчику.
Сергей М. (2013-03-24 14:57:00) [5]
> dll и нигде не сохраняя запускала
http://www.delphibasics.info/home/delphibasicssnippets/udllfrommem-loadadllfrommemory
Podgoretsky (2013-03-23 15:25:00) [6]
> и запустила на выполнение не сохраняя на диске.
Значит все таки боишься, что народ узнает.
Inovet (2013-03-23 09:29:00) [7]> [10] Margolis (23.03.13 04:17)
Да фигня это. Думаешь из памяти намного сложнее выцепить декодировщик?
sniknik (2013-03-23 09:21:00) [8]http://www.google.ru/cse?cx=008993509499067378592%3Adzs0vghyhno&ie=UTF-8&q=%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA&sa=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&siteurl=www.google.ru%2Fcse%2Fhome%3Fcx%3D008993509499067378592%3Adzs0vghyhno&ref=delphimaster.net%2F%3Fs%3D%25D0%25B7%25D0%25B0%25D0%25BF%25D1%2583%25D1%2581%25D0%25BA%26pcount%3D50%26forum%3D4%26user%3D%26order%3DREPLYDATE%26dir%3Ddesc%26title%3D1%26message%3D1%26date_begin%3D%26date_end%3D&ss=3651j4499259j7#gsc.tab=0&gsc.q=%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%20%D0%B8%D0%B7%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8
Margolis (2013-03-23 04:17:00) [9]При он лайн регистрации прога должна так же и декодировать\перекодировать под регу клиента какую-то базу данных.
Код в саму прогу писать не хочу, хотелось бы что бы при регистрации прога тянула утилитку\dll и нигде не сохраняя запускала бы её что бы привязать базу к железу ПК.
Был бы тривиальный кусок кода что-то придумал бы, но эта утилитка или dll будет покрыта вмпротом, нужно как отдельный процесс запускать.
Германн (2013-03-23 02:41:00) [10]Вот только до сих пор не понятно, что ты пишешь. То что это "не вирус и не троян" я верю :)
Германн (2013-03-23 02:09:00) [11]
> Margolis (22.03.13 22:48) [7]
>
> Простите, а как Все делают? :)
>
Записывают на диск и запускают с него. :)
Margolis (2013-03-22 22:48:00) [12]Простите, а как Все делают? :)
robt (2013-03-22 21:44:00) [13]делай как все и не страдай фигней
+ вспомни про антивиры, если вдруг забыл...
Margolis (2013-03-22 21:00:00) [14]что-то типа такого:
ImageMapping = CreateFileMapping(
INVALID_HANDLE_VALUE, NULL,
PAGE_EXECUTE_READWRITE | SEC_COMMIT,
0, CodeLength, NULL);
EditableBaseAddress = MapViewOfFile(ImageMapping,
FILE_MAP_READ | FILE_MAP_WRITE,
0, 0, 0);
ExecutableBaseAddress = MapViewOfFile(ImageMapping,
FILE_MAP_EXECUTE | FILE_MAP_READ | FILE_MAP_WRITE,
0, 0, 0);
CopyMemory(EditableBaseAddress,
CodeBuffer, CodeLength);
((VOID (*)())ExecutableBaseAddress)();
Margolis (2013-03-22 20:59:00) [15]что-то типа такого:
ImageMapping = CreateFileMapping(
INVALID_HANDLE_VALUE, NULL,
PAGE_EXECUTE_READWRITE | SEC_COMMIT,
0, CodeLength, NULL);
EditableBaseAddress = MapViewOfFile(ImageMapping,
FILE_MAP_READ | FILE_MAP_WRITE,
0, 0, 0);
ExecutableBaseAddress = MapViewOfFile(ImageMapping,
FILE_MAP_EXECUTE | FILE_MAP_READ | FILE_MAP_WRITE,
0, 0, 0);
CopyMemory(EditableBaseAddress,
CodeBuffer, CodeLength);
((VOID (*)())ExecutableBaseAddress)();
Margolis (2013-03-22 20:35:00) [16]может как-то через file Mapping ?
robt (2013-03-22 20:15:00) [17]заработает на 1 компе из 10
Margolis (2013-03-22 19:52:00) [18]Может с dll будет проще?
Нашел код, надо будет дома потестировать:
http://www.delphibasics.info/home/delphibasicssnippets/udllfrommem-loadadllfrommemory