|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Запуск exe из памяти...
Поднималась уже эта тема в разделе "Начинающим"... Но там полный "Оффтоп"... Там кто то упоминал о Непоколебимых правилах форума... Но я считаю данная тема под ограничения форума не подходит потому как не только "Джойнеры" и тому подобное ПО пишется по такому принципу... В данной ситуации хочу использовать данный метод для защиты своих программ от "злостных" "Крякеров" и тому подобных личностей... Так вот... Нашел в интернете исходник как это можно реализовать... Реализовал... Всё работает... Но может уважаемые Асы этого форума могут предложить другой вариант "Запуска"... Будет интересно посмотреть... Заранее спасибо за обсуждение!!!
P.S. Может кто разбирается в C++ и может привести процедуру "Запуска" из исходников UPX... Последний раз редактировалось Romix, 01.09.2010 в 00:48. |
#2
|
|||
|
|||
для защиты своих нетленных творений лучше использовать уже готовую защиту, правильно примененную к программы. Посмотри в сторону ASPtotect и ExeCryptor. Поверь, сделать все то, что они уже поддерживают, ты сможешь не скоро.
|
#3
|
|||
|
|||
Цитата:
|
#4
|
||||
|
||||
Ну если вопрос настолько актуален, то читаем тут.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#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. У самого есть разработки, но они очень спецефического характера. Хорошо написанная программа не требует документации ICQ 9-184-668. |
#9
|
|||
|
|||
Цитата:
|