Форум: "Начинающим";
Текущий архив: 2014.02.02;
Скачать: [xml.tar.bz2];
Вниззапуск приложения из памяти Найти похожие ветки
← →
Margolis (2013-03-22 19:22) [0]Пишу не вирус и не троян.
Необходимо, что бы моя программа при регистрации скачала с сайта консольную мою утилитку, декриптовала в памяти её и запустила на выполнение не сохраняя на диске.
Может кто сталкивался или есть в закромах код?
← →
Margolis (2013-03-22 19:52) [1]Может с dll будет проще?
Нашел код, надо будет дома потестировать:
http://www.delphibasics.info/home/delphibasicssnippets/udllfrommem-loadadllfrommemory
← →
robt (2013-03-22 20:15) [2]заработает на 1 компе из 10
← →
Margolis (2013-03-22 20:35) [3]может как-то через file Mapping ?
← →
Margolis (2013-03-22 20:59) [4]что-то типа такого:
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 21:00) [5]что-то типа такого:
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)();
← →
robt (2013-03-22 21:44) [6]делай как все и не страдай фигней
+ вспомни про антивиры, если вдруг забыл...
← →
Margolis (2013-03-22 22:48) [7]Простите, а как Все делают? :)
← →
Германн © (2013-03-23 02:09) [8]
> Margolis (22.03.13 22:48) [7]
>
> Простите, а как Все делают? :)
>
Записывают на диск и запускают с него. :)
← →
Германн © (2013-03-23 02:41) [9]Вот только до сих пор не понятно, что ты пишешь. То что это "не вирус и не троян" я верю :)
← →
Margolis (2013-03-23 04:17) [10]При он лайн регистрации прога должна так же и декодировать\перекодировать под регу клиента какую-то базу данных.
Код в саму прогу писать не хочу, хотелось бы что бы при регистрации прога тянула утилитку\dll и нигде не сохраняя запускала бы её что бы привязать базу к железу ПК.
Был бы тривиальный кусок кода что-то придумал бы, но эта утилитка или dll будет покрыта вмпротом, нужно как отдельный процесс запускать.
← →
sniknik © (2013-03-23 09:21) [11]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
← →
Inovet © (2013-03-23 09:29) [12]> [10] Margolis (23.03.13 04:17)
Да фигня это. Думаешь из памяти намного сложнее выцепить декодировщик?
← →
Podgoretsky (2013-03-23 15:25) [13]
> и запустила на выполнение не сохраняя на диске.
Значит все таки боишься, что народ узнает.
← →
Сергей М. © (2013-03-24 14:57) [14]
> dll и нигде не сохраняя запускала
http://www.delphibasics.info/home/delphibasicssnippets/udllfrommem-loadadllfrommemory
← →
Rouse_ © (2013-03-25 22:51) [15]
> Необходимо, что бы моя программа при регистрации скачала
> с сайта консольную мою утилитку, декриптовала в памяти её
> и запустила на выполнение не сохраняя на диске.
Зачем?
Если со скачиванием еще понятно, то не понятно зачем нужно декриптовать (секретные данные?) да еще и запускать не сохраняя (очень секретные данные)?
> Margolis (22.03.13 22:48) [7]
> Простите, а как Все делают? :)
Все используют функционал инсталяторов, которые делает все что нужно разработчику.
← →
Rouse_ © (2013-03-25 22:54) [16]
> Был бы тривиальный кусок кода что-то придумал бы, но эта
> утилитка или dll будет покрыта вмпротом, нужно как отдельный
> процесс запускать.
Ага, понятно - значит очень-очень секретные данные что даже VMProtect-а не хватает и ты решил перестраховаться и до кучи тело зашифровать :)
← →
Разведка (2013-03-30 20:35) [17]
> Margolis (22.03.13 19:22)
> Пишу не вирус и не троян.Необходимо, что бы моя программа
> при регистрации скачала с сайта консольную мою утилитку,
> декриптовала в памяти её и запустила на выполнение не сохраняя
> на диске.Может кто сталкивался или есть в закромах код?
В любом случае эвристики и антивирусов буду детектировать такие действия как вырус... У меня бы модуль такой с созданием в памяти процесса, потом процесс перезаписывался распакованным из ресурсов exe, запускался, но вот в тот момент когда вызывалась апи-фукция writeprocess то антивирус блочил все это дело.
← →
Разведка (2013-03-30 20:41) [18]Сей код уже не актуален и годится только для изучения
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.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2014.02.02;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.002 c