![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Поднималась уже эта тема в разделе "Начинающим"... Но там полный "Оффтоп"... Там кто то упоминал о Непоколебимых правилах форума... Но я считаю данная тема под ограничения форума не подходит потому как не только "Джойнеры" и тому подобное ПО пишется по такому принципу... В данной ситуации хочу использовать данный метод для защиты своих программ от "злостных" "Крякеров" и тому подобных личностей... Так вот... Нашел в интернете исходник как это можно реализовать... Реализовал... Всё работает... Но может уважаемые Асы этого форума могут предложить другой вариант "Запуска"... Будет интересно посмотреть... Заранее спасибо за обсуждение!!!
P.S. Может кто разбирается в C++ и может привести процедуру "Запуска" из исходников UPX... Последний раз редактировалось Romix, 01.09.2010 в 00:48. |
|
#2
|
|||
|
|||
|
для защиты своих нетленных творений лучше использовать уже готовую защиту, правильно примененную к программы. Посмотри в сторону ASPtotect и ExeCryptor. Поверь, сделать все то, что они уже поддерживают, ты сможешь не скоро.
|
|
#3
|
|||
|
|||
|
Цитата:
![]() |
|
#5
|
|||
|
|||
|
Будут ещё варианты???
|
|
#6
|
||||
|
||||
|
А чем этот плох?
|
|
#7
|
|||
|
|||
|
Цитата:
Код:
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.Поэтому вопрос по прежнему актуален!!! ![]() |
|
#8
|
||||
|
||||
|
ASProtect ExeCryptor - мощщны, но есть один недостаток (в принципе как и у всех подобных творений) - кто-то купил ключ и выложил в инете, либо расшифровали кусочки кода - сделали дамп и всё. Можно использовать RSA для регистрации например, но опять таки - PE Explorer был взломан точно так же - купили одну лицензию, посмотрели на алгоритм - сделали патч+киген.
Вопрос - что конкретно хочет топик-стартер - защитить свои творения от дизассемблинга, либо сделать ShareWare? Кстати на этом сайте есть исходники замечательного пакера-протектора от GpCh. Ну и пакер от FERRAUDER AHPack. У самого есть разработки, но они очень спецефического характера. |
|
#9
|
|||
|
|||
|
Цитата:
|