PDA

View Full Version : نحوه رمزنگاری فایلهای اجرایی



amir_civil
یک شنبه 20 دی 1388, 18:00 عصر
با سلام
سوالی در رابطه با crypt کردن کد یا همنون .text داشتم(مربوط به پکر ها یا cryptor ها)
میخاستم بپرسم که ایا باید قسمت کد رو رمز نگاری کرد و دوباره اون رو تو یه فایل نوشت؟(مثلا با XOR)
در اینصورت ویندوز این فایل رو چه جوری میتونه اجرا کنه؟
یا اینکه باید اون را جایه دیگه ذخیره کرد که در اینصورت اصلا چرا این کار رو میکنیم؟
ممنون

Nima NT
یک شنبه 20 دی 1388, 18:14 عصر
اول اینجا رو مطالعه کنید ، به احتمال زیاد به جوابتون میرسید.
http://www.barnamenevis.org/forum/showthread.php?t=20560

amir_civil
یک شنبه 20 دی 1388, 18:35 عصر
در این قسمت مشکل دارم

- رمزنگاری اجزاء مهم نرم افزار روی دیسک و حافظه و اجرا از طریق توابع درون ساختهء نسبتا" امن Packer

رمزنگاری اجزاء مهم نرم افزار روی دیسک
مثلا با XOR

و حافظه
چه جوری؟

اجرا از طریق توابع درون ساختهء
منظور از توابع درون ساخته چیست؟

Nima NT
یک شنبه 20 دی 1388, 19:14 عصر
رمزنگاری اجزاء مهم نرم افزار روی دیسک
در مورد توابع درون ساخته مطمئن نیستم ولی در مورد این که پرسیدید مثلا" با XOR میشه گفت ساده ترین اونها xor هست ، روشهای خیلی بهتر و پیچیده تری هم وجود داره مثل الگوریتمهای AES , DES , RSA و ...

در مورد توابع درون ساخته تحقیق میکنم و پاسخ رو همینجا میذارم.

amir_civil
چهارشنبه 23 دی 1388, 18:44 عصر
ـا اونجایی که من متوجه شدم به اون توابع 'stub' میگن با هر زبانی هم مبیشه نوشتشون
کارشون هم اینه که تابع رو decrypt میکنن و به طور معمولی تو حافظه ران میکنن
من بیشتر سورسهایی که باهاشون روبرو شدم با اسمبلی بودن
کسی میدونه علتش چیه(شاید حجم کم برنامه باشه) چون با هر زبان دیگر هم میشه نوشت
و هنوز نمیدونم چه جوری برنامه رو تو حافظه اجرا میکنه و قبل از اون برنامه entrypoint رو تغیر میده

Nima NT
چهارشنبه 23 دی 1388, 21:26 عصر
اطلاعاتی که بدست آوردید کاملا" درست هست فقط در مورد

من بیشتر سورسهایی که باهاشون روبرو شدم با اسمبلی بودن
کسی میدونه علتش چیه(
یکی از دلایل این کار این هست که اسمبلی راحتی بیشتری برای کارهای سیستمی داره ، البته این بدین معنی نیست که نمیشه مثلا" با دلفی این کارها رو انجام داد ؛ فقط تو اسمبلی کار کمی از انعطاف بیشتری برخوردار هستش.

amir_civil
چهارشنبه 23 دی 1388, 22:54 عصر
هنوز نمیدونم چه جوری برنامه رو تو حافظه اجرا میکنه
دراین مورد هنوزمشکل دارم

Nima NT
چهارشنبه 23 دی 1388, 23:56 عصر
دراین مورد هنوزمشکل دارم
میتونید از سورس زیر در دلفی استفاده کنید ( فایل اجرایی رو در حافظه اجرا میکنه ).


Function MemoryExecute(Buffer :Pointer;Parameters: String; Visible: Boolean): TProcessInformation;
type
HANDLE = THandle;
PVOID = Pointer;
LPVOID = Pointer;
SIZE_T = Cardinal;
ULONG_PTR = Cardinal;
NTSTATUS = LongInt;
LONG_PTR = Integer;

PImageSectionHeaders = ^TImageSectionHeaders;
TImageSectionHeaders = Array [0..95] Of TImageSectionHeader;
Var
ZwUnmapViewOfSection :Function(ProcessHandle: THANDLE; BaseAddress: Pointer): LongInt; stdcall;
ProcessInfo :TProcessInformation;
StartupInfo :TStartupInfo;
Context :TContext;
BaseAddress :Pointer;
BytesRead :DWORD;
BytesWritten :DWORD;
I :ULONG;
OldProtect :ULONG;
NTHeaders :PImageNTHeaders;
Sections :PImageSectionHeaders;
Success :Boolean;
ProcessName :string;
Buf: array[0..1] of Byte;

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;
Begin
@ZwUnmapViewOfSection := GetProcAddress(LoadLibrary('ntdll.dll'), 'ZwUnmapViewOfSection');
ProcessName := ParamStr(0);

FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);

StartupInfo.cb := SizeOf(TStartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
if Visible Then
StartupInfo.wShowWindow := SW_NORMAL
else
StartupInfo.wShowWindow := SW_Hide;

If (CreateProcess(PChar(ProcessName), PChar(Parameters), NIL, NIL,
False, CREATE_SUSPENDED, NIL, NIL, StartupInfo, ProcessInfo)) Then
Begin
Success := True;
Result := ProcessInfo;

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;