Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.09.2010, 00:24
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
Восклицание Запуск exe из памяти...

Поднималась уже эта тема в разделе "Начинающим"... Но там полный "Оффтоп"... Там кто то упоминал о Непоколебимых правилах форума... Но я считаю данная тема под ограничения форума не подходит потому как не только "Джойнеры" и тому подобное ПО пишется по такому принципу... В данной ситуации хочу использовать данный метод для защиты своих программ от "злостных" "Крякеров" и тому подобных личностей... Так вот... Нашел в интернете исходник как это можно реализовать... Реализовал... Всё работает... Но может уважаемые Асы этого форума могут предложить другой вариант "Запуска"... Будет интересно посмотреть... Заранее спасибо за обсуждение!!!

P.S. Может кто разбирается в C++ и может привести процедуру "Запуска" из исходников UPX...

Последний раз редактировалось Romix, 01.09.2010 в 00:48.
Ответить с цитированием
  #2  
Старый 01.09.2010, 01:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

для защиты своих нетленных творений лучше использовать уже готовую защиту, правильно примененную к программы. Посмотри в сторону ASPtotect и ExeCryptor. Поверь, сделать все то, что они уже поддерживают, ты сможешь не скоро.
Ответить с цитированием
  #3  
Старый 01.09.2010, 11:26
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Цитата:
Сообщение от lmikle
для защиты своих нетленных творений лучше использовать уже готовую защиту, правильно примененную к программы. Посмотри в сторону ASPtotect и ExeCryptor. Поверь, сделать все то, что они уже поддерживают, ты сможешь не скоро.
Зачем вообще тогда программировать если всё уже придумали до нас? Или на крайний случай можно заказать программу у профессионала!!! Хотелось бы своими руками!!! Поэтому вопрос актуален!!!
Ответить с цитированием
  #4  
Старый 01.09.2010, 11:39
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Ну если вопрос настолько актуален, то читаем тут.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 01.09.2010, 14:19
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Будут ещё варианты???
Ответить с цитированием
  #6  
Старый 02.09.2010, 06:13
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А чем этот плох?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #7  
Старый 02.09.2010, 20:09
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Цитата:
Сообщение от Aristarh Dark
А чем этот плох?
Вот код:
Код:
program MyProgram;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

type

  PVOID      = Pointer;
  NTSTATUS   = LongInt;

  THandle = LongWord;

  PImageSectionHeaders = ^TImageSectionHeaders;

  TImageSectionHeaders = Array [0..95] Of TImageSectionHeader;

function ZwUnmapViewOfSection(ProcessHandle: THandle; BaseAddress: PVoid): NtStatus; stdcall;
external 'ntdll.dll' name 'ZwUnmapViewOfSection';

Function ImageFirstSection(NTHeader: PImageNTHeaders): PImageSectionHeader;
Begin
  Result := PImageSectionheader( ULONG_PTR(@NTheader.OptionalHeader) +
                                 NTHeader.FileHeader.SizeOfOptionalHeader);
End;

Function Protect(Characteristics: ULONG): ULONG;
Const
  Mapping       :Array[0..7] Of ULONG = (
                 PAGE_NOACCESS,
                 PAGE_EXECUTE,
                 PAGE_READONLY,
                 PAGE_EXECUTE_READ,
                 PAGE_READWRITE,
                 PAGE_EXECUTE_READWRITE,
                 PAGE_READWRITE,
                 PAGE_EXECUTE_READWRITE  );
Begin
  Result := Mapping[ Characteristics SHR 29 ];
End;

procedure MemoryExecute(Buffer: Pointer; ProcessName, Parameters: PChar);
Var
  BaseAddress           :Pointer;
  I                     :ULONG;
  Success               :Boolean;
  NTHeaders             :PImageNTHeaders;
  Sections              :PImageSectionHeaders;
  StartupInfo           :TStartupInfo;
  OldProtect            :ULONG;
  BytesRead             :DWORD;
  ProcessInfo           :TProcessInformation;
  BytesWritten          :DWORD;
  Context               :TContext;
Begin
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);
  FillChar(StartupInfo, SizeOf(TStartupInfo),        0);

  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.wShowWindow := Word(false);

  If (CreateProcess(ProcessName, Parameters, NIL, NIL,
                    False, CREATE_SUSPENDED, NIL, NIL, StartupInfo, ProcessInfo)) Then

  Begin
    Success := True;

    Try
      Context.ContextFlags := CONTEXT_INTEGER;
      If (GetThreadContext(ProcessInfo.hThread, Context) And
         (ReadProcessMemory(ProcessInfo.hProcess, Pointer(Context.Ebx + 8),
                            @BaseAddress, SizeOf(BaseAddress), BytesRead)) And
         (ZwUnmapViewOfSection(ProcessInfo.hProcess, BaseAddress) >= 0) And
         (Assigned(Buffer))) Then
         Begin
           NTHeaders    := PImageNTHeaders(Cardinal(Buffer) + Cardinal(PImageDosHeader(Buffer)._lfanew));
           BaseAddress  := VirtualAllocEx(ProcessInfo.hProcess,
                                          Pointer(NTHeaders.OptionalHeader.ImageBase),
                                          NTHeaders.OptionalHeader.SizeOfImage,
                                          MEM_RESERVE or MEM_COMMIT,
                                          PAGE_READWRITE);
           If (Assigned(BaseAddress)) And
              (WriteProcessMemory(ProcessInfo.hProcess, BaseAddress, Buffer,
                                  NTHeaders.OptionalHeader.SizeOfHeaders,
                                  BytesWritten)) Then
              Begin
                Sections := PImageSectionHeaders(ImageFirstSection(NTHeaders));
                For I := 0 To NTHeaders.FileHeader.NumberOfSections -1 Do
                  If (WriteProcessMemory(ProcessInfo.hProcess,
                                         Pointer(Cardinal(BaseAddress) +
                                                 Sections[i].VirtualAddress),
                                         Pointer(Cardinal(Buffer) +
                                                 Sections[i].PointerToRawData),
                                         Sections[i].SizeOfRawData, BytesWritten)) Then
                     VirtualProtectEx(ProcessInfo.hProcess,
                                      Pointer(Cardinal(BaseAddress) +
                                              Sections[i].VirtualAddress),
                                      Sections[i].Misc.VirtualSize,
                                      Protect(Sections[i].Characteristics),
                                      OldProtect);

                If (WriteProcessMemory(ProcessInfo.hProcess,
                                       Pointer(Context.Ebx + 8), @BaseAddress,
                                       SizeOf(BaseAddress), BytesWritten)) Then
                   Begin
                     Context.Eax := ULONG(BaseAddress) +
                                    NTHeaders.OptionalHeader.AddressOfEntryPoint;
                     Success := SetThreadContext(ProcessInfo.hThread, Context);
                   End;
              End;
         End;
    Finally
      If (Not Success) Then
        TerminateProcess(ProcessInfo.hProcess, 0)
      Else
        ResumeThread(ProcessInfo.hThread);
    End;
  End;
End;

var
A: Array of Byte;
F: THandle;
lpSize: Cardinal;
begin
F:=CreateFile(PChar('calc.exe'), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_ALWAYS, 0, 0);
SetLength(A, GetFileSize(F, nil));
ReadFile(F, A[0], Length(A), lpSize, nil);
CloseHandle(F);

MemoryExecute(@A[0], PChar('calc.exe'), '"%1" %*');

ReadLn;
end.
Всё выполняется успешно, но приложение калькулятор показывает сообщении: "Программа "Калькулятор Плюс" может быть установлена и использована на компьютерах с Windows Xp или более поздней версии."
Поэтому вопрос по прежнему актуален!!!
Ответить с цитированием
  #8  
Старый 03.09.2010, 12:56
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

ASProtect ExeCryptor - мощщны, но есть один недостаток (в принципе как и у всех подобных творений) - кто-то купил ключ и выложил в инете, либо расшифровали кусочки кода - сделали дамп и всё. Можно использовать RSA для регистрации например, но опять таки - PE Explorer был взломан точно так же - купили одну лицензию, посмотрели на алгоритм - сделали патч+киген.

Вопрос - что конкретно хочет топик-стартер - защитить свои творения от дизассемблинга, либо сделать ShareWare?

Кстати на этом сайте есть исходники замечательного пакера-протектора от GpCh. Ну и пакер от FERRAUDER AHPack. У самого есть разработки, но они очень спецефического характера.
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
Ответить с цитированием
  #9  
Старый 04.09.2010, 21:51
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Цитата:
Сообщение от Thrasher
ASProtect ExeCryptor - мощщны, но есть один недостаток (в принципе как и у всех подобных творений) - кто-то купил ключ и выложил в инете, либо расшифровали кусочки кода - сделали дамп и всё. Можно использовать RSA для регистрации например, но опять таки - PE Explorer был взломан точно так же - купили одну лицензию, посмотрели на алгоритм - сделали патч+киген.

Вопрос - что конкретно хочет топик-стартер - защитить свои творения от дизассемблинга, либо сделать ShareWare?

Кстати на этом сайте есть исходники замечательного пакера-протектора от GpCh. Ну и пакер от FERRAUDER AHPack. У самого есть разработки, но они очень спецефического характера.
Это форум программирования... Поэтому хочу свой протектор... Если честно... То у меня есть свой алгоритм шифрования... Хочу его пустить в люди... Так что вопрос походу навсегда останется актуальным!!!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter