۲۶-اردیبهشت-۱۳۸۸, ۱۹:۲۸:۰۷
۲۶-اردیبهشت-۱۳۸۸, ۲۲:۵۶:۵۵
نوشتن پکر ها بحث مفصلی داره به صورت ساده پکر ها فایلهای اجرایی رو از حالت طبیعی خارج میکنن تا به کد باینری اون نشه دسترسی داشت ساده ترین روش کد کردن code section هست و قرار دادن ادرس شروع و طول code section به decoder با اجرای برنامه decoder کد برنامه رو به حالت اولیه بر میگردونه و برنامه اجرا میشه و از روشهای مختلفی استفاده میکنن مثلا بعضی ها code section رو کد میکنن بعضی ها IAT رو کد یا دستکاری میکنن بعضی ها جای Section ها رو تغییر میدن و البته این روشها به تنهایی کارساز نیست بلکه با ترکیب این روشها به علاوه تکنیکهای anti dumping و anti debuger و anti trace استفاده میشه
۲۷-اردیبهشت-۱۳۸۸, ۰۰:۱۸:۳۰
سلام
باید چه مهارتهایی کسب کرد تا بشه یک پکر نوشت ؟؟
دقیقا چه اطلاعاتی نیاز مند هستش ؟؟
و اینکه باید از کجا شروع کنم ؟؟ (چه مراحلی داره)
ممنون
باید چه مهارتهایی کسب کرد تا بشه یک پکر نوشت ؟؟
دقیقا چه اطلاعاتی نیاز مند هستش ؟؟
و اینکه باید از کجا شروع کنم ؟؟ (چه مراحلی داره)
ممنون
۲۷-اردیبهشت-۱۳۸۸, ۱۰:۱۲:۲۱
اشنایی کامل با ساختار فایلهای pe اشنایی با شیوه اجرای برنامه ها توسط ویندوز اشنایی با الگورتمهای coding و encryptiong وکمی کرک
(چند نمونه سورس پکر ساده رو بگیرین و روش کار کنین)
برای استفاده ازش هم به صورت زیر خواهد بود
این یه نمونه ساده هست که ادرس یک فایل exe رو میدین و این برنامه اونو تو حافظه load میکنه حالا شما میتونین این فایل رو به هر صورت که دوست دارین با یکی از الگوریتم های کد یا encrypt کد کرده در یک stub ذخیره کنین و موقع اجرا با چک کردن مسایل امنیتی برنامه رو از حالت کد خارج و در حافظه اجرا کنید
(چند نمونه سورس پکر ساده رو بگیرین و روش کار کنین)
کد:
type
TSections = array [0..0] of TImageSectionHeader;
function GetAlignedSize(Size: dword; Alignment: dword): dword;
begin
if ((Size mod Alignment) = 0) then
Result := Size;
else
Result := ((Size div Alignment) + 1) * Alignment;
end;
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;
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;
برای استفاده ازش هم به صورت زیر خواهد بود
کد:
var
MyStream: TMemoryStream;
begin
MyStream := TMemoryStream.Create;
try
MyStream.LoadFromFile('Pro.exe');
//MyStream.LoadFromStream(yourstream);
CreateProcessEx(MyStream.Memory);
finally
MyStream.Free;
end;
end;
۲۸-اردیبهشت-۱۳۸۸, ۱۳:۳۰:۲۹
سلام
یه سوال دیگه هم دارم ، بهترین زبان برای اینکار چه زبونیه ؟؟ (هم از نظر شما هم از نظر احاد مردم
)
ممنون
نقل قول: اشنایی با الگورتمهای coding و encryptiongمنبعی ندارین که این روشها رو توضیح بده ؟؟
یه سوال دیگه هم دارم ، بهترین زبان برای اینکار چه زبونیه ؟؟ (هم از نظر شما هم از نظر احاد مردم

ممنون
۲۸-اردیبهشت-۱۳۸۸, ۲۳:۱۵:۰۴
احاد مردم که چه عرض کنم
ولی معمولا زبانهایی مثل asemble و ++c در اولویت هستن و بعد از اون زبانهای غیر net.
ولی معمولا زبانهایی مثل asemble و ++c در اولویت هستن و بعد از اون زبانهای غیر net.
۲۹-اردیبهشت-۱۳۸۸, ۰۰:۵۲:۰۴
(۲۸-اردیبهشت-۱۳۸۸, ۲۳:۱۵:۰۴)lord_viper نوشته است: [ -> ]ولی معمولا زبانهایی مثل asemble و ++c در اولویت هستن و بعد از اون زبانهای غیر net.
فکر کنم یادگیری asemble واجب شد

نقل قول: منبعی ندارین که این روشها رو توضیح بده ؟؟در این موردم فکر کنم احترامم رو نگه داشتین نگفتین گوگل سرچ کن

ممنون که جواب دادین ، سوال داشتم همینجا میپرسم.