Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.02.02;
Скачать: CL | DM;

Вниз

запуск приложения из памяти   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.005 c
4-1266967102
leonidus
2010-02-24 02:18
2014.02.02
Проблема установки глобального хука на клавиатуру


2-1364333792
znt
2013-03-27 01:36
2014.02.02
Вероятность победы + random


2-1364555765
ragnar
2013-03-29 15:16
2014.02.02
импорт в БД


2-1364479486
Student123
2013-03-28 18:04
2014.02.02
проектирование классов для работы с данными бд


15-1376375006
[ВладОшин]
2013-08-13 10:23
2014.02.02
Перелогиниться в домене, не закрывая программ. Можно?