Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1376130585
MonoLife
2013-08-10 14:29
2014.02.02
Вот такие желптушки.


15-1377018892
Rouse_
2013-08-20 21:14
2014.02.02
Лицензия на опенсорс


15-1377080847
Els
2013-08-21 14:27
2014.02.02
Наносемантика и инфы


2-1364475755
ttt
2013-03-28 17:02
2014.02.02
Интерфейсы


15-1376572008
Ъ
2013-08-15 17:06
2014.02.02
Остановить GetTickCount.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский