PDA

View Full Version : محافظت از برنامه فايل اجرايي (براي استفاده عموم)



joker
دوشنبه 27 آذر 1385, 21:24 عصر
یه چند وقتی دنبال روشهایی بودم که بتونه کار کرکرها را سخت تر کنه
یه چندتاییش را با توضیحات و کارایی مربوطه اینجا مینویسم
امیدوارم دوستان برنامه نویس از این سورس ها استفاده مربوطه را ببرن

این 3-4تا برای شناسایی وجود دیباگر SoftIce هستن


function IsDebuggerPresent: BOOL; stdcall; external 'kernel32.dll';

function BoundsCheckerDetected: Boolean;
begin
try
asm
push ebp
mov ebp, 'BCHK'
mov ax, 4
int 3
cmp ax, 4
jne @@softice_detected
mov ax, 0
jmp @@exit
@@softice_detected:
mov ax, 1
@@exit:
pop ebp
end;
except
on E: EExternalException do
begin
result:=False;
end else begin
result:=true;
end;
end;
end;


function SoftIceVXDDetected: Boolean;
begin
try
asm
push esi
push edi
mov ax, $1684
mov bx, $0202 // VXD ID for SoftIce
xor di, di
mov es, di
int $2F
mov ax, es
add di,ax
cmp di, 0
jne @@softice_detected
mov ax, 0
jmp @@exit
@@softice_detected:
mov ax, 1
@@exit:
pop edi
pop esi
end;
except
// Not hooked
result:=False;
end;
end;
//------------
function WinIceDetected: Boolean;
begin
try
asm
mov ah, $43
int $68
cmp ax, $F386
jz @@winice_detected
mov ax, 0
jmp @@exit
@@winice_detected:
mov ax, 1
@@exit:
end;
except
// Not hooked
result:=False;
end;
end;



///////////
function MeltIceDetected: Boolean;
var hIce: THandle;
dwCount: Integer;
const
ICE_FILES: Array [0..3] of PChar = ('\\.\SICE', '\\.\NTICE', '\\.\SIWVID', '\\.\FROGICE');
begin

// Description: Detect the presence of SoftIce and many other memory resident
// tools by attempting to load SoftIce related devices such its display
// driver, or its access driver. Devices such as SICE, NTICE, SIWVID, FROGICE.
result:=False;
for dwCount:=0 to High(ICE_FILES) do
begin
hIce:=CreateFile(ICE_FILES[dwCount], GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0);
if (hIce <> INVALID_HANDLE_VALUE) then
begin
CloseHandle(hIce);
result:=True;
break;
end;
end;
end;
///////////
اینطوری هم استفاده میشن :


if SoftIceVXDDetected then Application.Terminate;
if WinIceDetected then Application.Terminate;
if BoundsCheckerDetected then Application.Terminate;
if MeltIceDetected then Application.Terminate;
if IsDebuggerPresent then Application.Terminate;
البته میتونید بعد از تشخیص دیباگر کارهایی بدتری غیر از بستن برنامه هم بکنید....;)

آنتی دامپ:
کد زیر کارش تغییر ایمج بیس برنامه هست که از Dump گرفتن برنامه جلوگیری میکنه



procedure FOLL();
begin
asm
mov eax, fs:[$30]
mov eax, [eax+$C]
mov eax, [eax+$C]
add dword ptr [eax+$20], $2000
end;
end;
البته به این نکته توجه داشته باشین که جهت خنثی کردن این کد با نرم افزار LoredPe در قسمت CorectImageBase قابل انجام هست بنابراین توی یک تایمر در نرم افزار میتونید هر 1 میلی ثانیه یکبار این پروسه را اجرا کنید و شاهد سرویس شدن کرکر محترم در گرفتن دامپ باشید .( این مرحله را از خودم در ورکردم ) یکی از راههای دور زدنش از کار انداختن تایمر با thread هست که توی برنامه داره این کار را انجام میده ! ( تقریبا روش مطمئنیه )

AntiOlly:
برای مقابله با نرم افزار دیباگرOlyDbg از روشهایی مثل FindWindow استفاده کنید چنانچه یکی از پنجره ها اسم olly توش بود برنامه را خاتمه بدین ( برای این روش توی olly دیباگر یکسری پلاگین هست ، که از تغییر عنوان پنجره تا هوک کردن این تابع استفاده میشه )
یا از نرم افزار آنتی olly که به همین پست ضمیمه میکنم استفاده کنید که کمی به امنیت برنامه ها در مقابل این دیباگر خوش دست کمک میکنه.
استفاده از توابع IsDebugerPereset هم توضیح ندم سنگین تر هست.

در عین حال میتونید از باگی که در Olly در موقع صدا زدن تابع OutputDebugString هست هم برای آورفلو و نهایتن کرش کردن این دیباگر موقع باز کردن برنامه تان استفاده کنید.
تمامی موارد فوق قابل دور زدن میباشد ، فقط جنبه تقویت قفل میباشد.
حسش بود یه چندتایی روش دیگه را هم مینویسم....
نکته : این کدها را در آخر سر به برنامه تان اضافه کنید چون موقع اجرای مستقیم ممکنه خودIde قاط بزنه ...
بعد از اضافه کردن این توابع برنامه را فقط کامپایل کنید ، و مستقل از ide اون را به راحتی اجرا کنید ( دیباگر داخلی ide فعال میشه )

joker
چهارشنبه 29 آذر 1385, 00:40 صبح
اگه احیانا فایلتون را پک کردین
با پکر ها یا پروتکتورها فرقی نمیکنه...
چون همیشه راهی برای آنپک هست بهتره این تکه کد را هم به سورستون اضافه کنید
( هرچند که کسی که دنبال کرک باشه نهایتا از این کد ها هم میگزره ولی اصل خسته کردن کرکر فراموش نشه یک قفل هم یک قفله )



procedure TFORO1.FormCreate(Sender: TObject);
var
size:Longint;
hFile: Thandle;
begin

try
hFile := CreateFileA( pchar(paramstr(0)) , GENERIC_READ ,
FILE_SHARE_READ , nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if( hFile <> INVALID_HANDLE_VALUE ) then
begin
Size :=GetFileSize(hfile,nil);
end;

if size <> سایز فایل پک شده then Application.Terminate;
CloseHandle(hFile);
if size > سایزفایل پک شده then Application.Terminate;

except
end;


end;

فایل آنپک شده به طور حتم فایلیه که قصد انجام کرک را براش کردن بنابراین میتونید به جای بسته شدن مستقیم کلا روتین اجرای برنامه را به سمت حالت shareware پیش ببرید که سراغ روتینهایی برن که عملا در فایل اصلی هیچ وقت اجرا نمیشن مثلا روتین قفل الکی و پیغامهای الکی و.......
با این روش حتی اگه از upx هم استفاده کرده باشین بازم جای امیدواری داره ;)

لازم به ذکر است یکی از راههای کرکرها برای اینکه نیازی به آنپک نداشته باشن استفاده از تکنیک InLinePatch هست.
پیوست:
برای دیدن نمونه برنامه هایی که با این روشها محافظت شدن به تاپیک زیر میتونید سر بزنید
http://barnamenevis.org/forum/showthread.php?t=53797

joker
پنج شنبه 30 آذر 1385, 11:00 صبح
حسش نبود کل یک سایتو به خاطر 2تاتابع بگردم ;)
-------------------

برای اینکه برنامه خودتون را به صورت دقیق تر ( دقیق تر از گرفتن یک حجم ساده بتونید کنترل کنید که چیزی دستکاری نشده باشه ...
analyze PE file headers


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
procedure DumpDOSHeader(const h: IMAGE_DOS_HEADER; Lines: TStrings);
begin
Lines.Add('Dump of DOS file header');
Lines.Add(Format('Magic number: %d', [h.e_magic]));
Lines.Add(Format('Bytes on last page of file: %d', [h.e_cblp]));
Lines.Add(Format('Pages in file: %d', [h.e_cp]));
Lines.Add(Format('Relocations: %d', [h.e_crlc]));
Lines.Add(Format('Size of header in paragraphs: %d', [h.e_cparhdr]));
Lines.Add(Format('Minimum extra paragraphs needed: %d', [h.e_minalloc]));
Lines.Add(Format('Maximum extra paragraphs needed: %d', [h.e_maxalloc]));
Lines.Add(Format('Initial (relative) SS value: %d', [h.e_ss]));
Lines.Add(Format('Initial SP value: %d', [h.e_sp]));
Lines.Add(Format('Checksum: %d', [h.e_csum]));
Lines.Add(Format('Initial IP value: %d', [h.e_ip]));
Lines.Add(Format('Initial (relative) CS value: %d', [h.e_cs]));
Lines.Add(Format('File address of relocation table: %d', [h.e_lfarlc]));
Lines.Add(Format('Overlay number: %d', [h.e_ovno]));
Lines.Add(Format('OEM identifier (for e_oeminfo): %d', [h.e_oemid]));
Lines.Add(Format('OEM information; e_oemid specific: %d', [h.e_oeminfo]));
Lines.Add(Format('File address of new exe header: %d', [h._lfanew]));
Lines.Add('');
end;

procedure DumpPEHeader(const h: IMAGE_FILE_HEADER; Lines: TStrings);
var
dt: TDateTime;
begin
Lines.Add('Dump of PE file header');
Lines.Add(Format('Machine: %4x', [h.Machine]));
case h.Machine of
IMAGE_FILE_MACHINE_UNKNOWN : Lines.Add(' MACHINE_UNKNOWN ');
IMAGE_FILE_MACHINE_I386: Lines.Add(' Intel 386. ');
IMAGE_FILE_MACHINE_R3000: Lines.Add(' MIPS little-endian, 0x160 big-endian ');
IMAGE_FILE_MACHINE_R4000: Lines.Add(' MIPS little-endian ');
IMAGE_FILE_MACHINE_R10000: Lines.Add(' MIPS little-endian ');
IMAGE_FILE_MACHINE_ALPHA: Lines.Add(' Alpha_AXP ');
IMAGE_FILE_MACHINE_POWERPC: Lines.Add(' IBM PowerPC Little-Endian ');
// some values no longer defined in winnt.h
$14D: Lines.Add(' Intel i860');
$268: Lines.Add(' Motorola 68000');
$290: Lines.Add(' PA RISC');
else
Lines.Add(' unknown machine type');
end; { Case }
Lines.Add(Format('NumberOfSections: %d', [h.NumberOfSections]));
Lines.Add(Format('TimeDateStamp: %d', [h.TimeDateStamp]));
dt := EncodeDate(1970, 1, 1) + h.Timedatestamp / SecsPerDay;
Lines.Add(FormatDateTime(' c', dt));

Lines.Add(Format('PointerToSymbolTable: %d', [h.PointerToSymbolTable]));
Lines.Add(Format('NumberOfSymbols: %d', [h.NumberOfSymbols]));
Lines.Add(Format('SizeOfOptionalHeader: %d', [h.SizeOfOptionalHeader]));
Lines.Add(Format('Characteristics: %d', [h.Characteristics]));
if (IMAGE_FILE_DLL and h.Characteristics) <> 0 then
Lines.Add(' file is a DLL')
else if (IMAGE_FILE_EXECUTABLE_IMAGE and h.Characteristics) <> 0 then
Lines.Add(' file is a program');
Lines.Add('');
end;

procedure DumpOptionalHeader(const h: IMAGE_OPTIONAL_HEADER; Lines: TStrings);
begin
Lines.Add('Dump of PE optional file header');
Lines.Add(Format('Magic: %d', [h.Magic]));
case h.Magic of
$107: Lines.Add(' ROM image');
$10b: Lines.Add(' executable image');
else
Lines.Add(' unknown image type');
end; { If }
Lines.Add(Format('MajorLinkerVersion: %d', [h.MajorLinkerVersion]));
Lines.Add(Format('MinorLinkerVersion: %d', [h.MinorLinkerVersion]));
Lines.Add(Format('SizeOfCode: %d', [h.SizeOfCode]));
Lines.Add(Format('SizeOfInitializedData: %d', [h.SizeOfInitializedData]));
Lines.Add(Format('SizeOfUninitializedData: %d', [h.SizeOfUninitializedData]));
Lines.Add(Format('AddressOfEntryPoint: %d', [h.AddressOfEntryPoint]));
Lines.Add(Format('BaseOfCode: %d', [h.BaseOfCode]));
Lines.Add(Format('BaseOfData: %d', [h.BaseOfData]));
Lines.Add(Format('ImageBase: %d', [h.ImageBase]));
Lines.Add(Format('SectionAlignment: %d', [h.SectionAlignment]));
Lines.Add(Format('FileAlignment: %d', [h.FileAlignment]));
Lines.Add(Format('MajorOperatingSystemVersion: %d', [h.MajorOperatingSystemVersion]));
Lines.Add(Format('MinorOperatingSystemVersion: %d', [h.MinorOperatingSystemVersion]));
Lines.Add(Format('MajorImageVersion: %d', [h.MajorImageVersion]));
Lines.Add(Format('MinorImageVersion: %d', [h.MinorImageVersion]));
Lines.Add(Format('MajorSubsystemVersion: %d', [h.MajorSubsystemVersion]));
Lines.Add(Format('MinorSubsystemVersion: %d', [h.MinorSubsystemVersion]));
Lines.Add(Format('Win32VersionValue: %d', [h.Win32VersionValue]));
Lines.Add(Format('SizeOfImage: %d', [h.SizeOfImage]));
Lines.Add(Format('SizeOfHeaders: %d', [h.SizeOfHeaders]));
Lines.Add(Format('CheckSum: %d', [h.CheckSum]));
Lines.Add(Format('Subsystem: %d', [h.Subsystem]));
case h.Subsystem of
IMAGE_SUBSYSTEM_NATIVE:
Lines.Add(' Image doesn''t require a subsystem. ');
IMAGE_SUBSYSTEM_WINDOWS_GUI:
Lines.Add(' Image runs in the Windows GUI subsystem. ');
IMAGE_SUBSYSTEM_WINDOWS_CUI:
Lines.Add(' Image runs in the Windows character subsystem. ');
IMAGE_SUBSYSTEM_OS2_CUI:
Lines.Add(' image runs in the OS/2 character subsystem. ');
IMAGE_SUBSYSTEM_POSIX_CUI:
Lines.Add(' image run in the Posix character subsystem. ');
else
Lines.Add(' unknown subsystem')
end; { Case }
Lines.Add(Format('DllCharacteristics: %d', [h.DllCharacteristics]));
Lines.Add(Format('SizeOfStackReserve: %d', [h.SizeOfStackReserve]));
Lines.Add(Format('SizeOfStackCommit: %d', [h.SizeOfStackCommit]));
Lines.Add(Format('SizeOfHeapReserve: %d', [h.SizeOfHeapReserve]));
Lines.Add(Format('SizeOfHeapCommit: %d', [h.SizeOfHeapCommit]));
Lines.Add(Format('LoaderFlags: %d', [h.LoaderFlags]));
Lines.Add(Format('NumberOfRvaAndSizes: %d', [h.NumberOfRvaAndSizes]));
end;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
fs: TFilestream;
signature: DWORD;
dos_header: IMAGE_DOS_HEADER;
pe_header: IMAGE_FILE_HEADER;
opt_header: IMAGE_OPTIONAL_HEADER;
begin
memo1.Clear;
with Opendialog1 do
begin
Filter := 'Executables (*.EXE)|*.EXE';
if Execute then
begin
fs := TFilestream.Create(FileName, fmOpenread or fmShareDenyNone);
try
fs.read(dos_header, SizeOf(dos_header));
if dos_header.e_magic <> IMAGE_DOS_SIGNATURE then
begin
memo1.Lines.Add('Invalid DOS file header');
Exit;
end;
DumpDOSHeader(dos_header, memo1.Lines);

fs.seek(dos_header._lfanew, soFromBeginning);
fs.read(signature, SizeOf(signature));
if signature <> IMAGE_NT_SIGNATURE then
begin
memo1.Lines.Add('Invalid PE header');
Exit;
end;

fs.read(pe_header, SizeOf(pe_header));
DumpPEHeader(pe_header, memo1.Lines);

if pe_header.SizeOfOptionalHeader > 0 then
begin
fs.read(opt_header, SizeOf(opt_header));
DumpOptionalHeader(opt_header, memo1.Lines);
end;
finally
fs.Free;
end; { finally }
end;
end;
end;
end.


دوستانی که احیانا خودشون قصد نوشتن پکر دارن ، این سورس میتونه خیلی براشون مفید باشه
مرجع سورس (http://www.swissdelphicenter.ch/en/showcode.php?id=1302)

joker
جمعه 01 دی 1385, 14:19 عصر
Anti OllyDebuger
این مورد تجربه ای از کار با یک CrackMe هست که در اختیار دوستان قرار میدم.
( با تشکر از دوست عزیز SubZero)
خب اگه با دیباگری مثلی olly کار کرده باشین حتما پلاگینهایی را دید که نام OllyDbg را موقع گرفتن لیست عنوان پنجره ها مخفی میکنند ( همانطور که قبلا گفتم موراد مربوط به تابع FindWindow

خب بیایم یه کم ما هم غیر عادی تر عمل کنیم ، یعنی دنبال نام OllyDbg اصلا نباشیم ( چون تحت هر عنوانی ممکنه این نام عوض شده باشه ( حتی تغییر نام فایل exe این دیباگر روی بعضی از پلاگینها اثر میگذاره :) )
یکی از راههای مقابله با این روش کرکرها اینه که توی لیست دنبال کلمه
Module یا thread بگردیم یا جمله کاملش ...
اگه یک فایل توی olly باز کنید متوجه میشید چی میگم ( عکس ضمیمه )

خب پس ما کد مون را طوری تغییر میدیم که اگه چنین کلمه ای در یکی از عناوین وجود داشت فرض را بر باز بودن این دیباگر بزاره و ( چگونگی ادامه کار به عهده خودتون )

سورس مربوطه برای لیست کردن تمام پنجره های قابل نمایش و غیر قابل نمایش در task Manager ویندوز
توابع جستجو در استرینگها هم که توضیح لازم نداره ...





function enumwindowsproc(wnd:Hwnd ; form:Tform):boolean;export; {$ifdef win32} stdcall ;{$endif}
var
buffer : array[0..250] of char ;
begin

getwindowtext(wnd,buffer,100);
if strlen(buffer)<> 0 then
form1.ListBox1.Items.Add(strpas(buffer));
result := true ;
end;

// 0000000000000000000000000000000000

procedure TForm1.Button1Click(Sender: TObject);
begin
listbox1.Clear;
enumwindows(@enumwindowsproc,longint(self));
end;

البته میتونید مستقیما از GetForegroundWindow هم استفاده کنید... ;) اما سورسی که ضمیمه کردم را داشته باشین برای مطالب بعدی که مینویسم در مورد محافظت برنامه در مقابل سیستمهای مونیتورینگ مثل FileMonitor و RegistryMonitor ها. چون یکی از روشهای اولیه مقابله با این نرم افزارها گرفتن هندل اونها هست ، ( البته روشهایی هم برای مخفی کردنشون بکار میره که بعدا به طور دقیقتر بررسی میکنیم)
اگه زنده موندم....

joker
جمعه 01 دی 1385, 14:47 عصر
شما را به خواندن مطالب خوشنگارشتر در مورد فرمت فایلهایPE دعوت میکنم :چشمک:
http://www.ALT.ir/help/ARTeam PE Tutorial.chm (http://www.alt.ir/help/ARTeam%20PE%20Tutorial.chm)

Best Programmer
جمعه 01 دی 1385, 16:20 عصر
مقاله خوبی بود و در بیشتر موارد از Iczelion's استفاده کرده بود. در هر حال به تمام دوستانی که در این زمینه نیاز به اطلاعات دارند توصیه می کنم که این مقاله را بخوانند و در ضمن به این http://spiff.tripnet.se/~iczelion/files/pe-tuts.zip هم نظری داشته باشند.

البته دوستان بهتر هست که مرجع سایت را ارائه نماییند و در اختیار قرار دهند چون سایت http://arteam.accessroot.com سایت بسیار مفیدی بود و به لیست Favoraites من پیوست.
در اینجا از Joker تشکر می کنم.

Developer Programmer
جمعه 01 دی 1385, 19:09 عصر
1) این روش رو اولین بار در Cra@ck me دیدم:
پنجره برنامه خود رو TOP MOST کنید؛ اینطوری برنامه شما Focus رو می گیره و Debugger همیشه پشت پنجره میمونه.

2) اگه اشتباه نکنم اساس روش زیر از Cr@ck me ایه که با DotFix انگولک شده بود :
یه Thread با اولویت High بسازید تا دیباگر Hang کنه.

3) تجربه شخصی میگه:
-> همه چیز رو در داخل یه کد نریزید, منظورم اینه که علاوه بر برنامه خود از Thread و فایلهای جانبی (مثل DLL) هم برای چک کردن امنیت برنامه استفاده کنید.

-> فقط به یکبار چک کردن امنیت ؛ اکتفا نکنید. مثلا چندین بار از طریق Procedure های متفاوت وجود دیباگر رو شناسایی کنید. اگه میگم Procedureهای متفاوت واسه اینه که اگه یک Procedure رو 100 جا فراخوانی کنید؛ واضحه که همه فراخوانی ها به یک آدرس مراجعه میکنن لذا در خیلی موارد استفاده از RETN میتونه Procedure شما رو برای همیشه فلج کنه.

->بهتره سطر اول و آخر Function ها و Procedure های خود رو به Trick هایی جهت شناسایی BP مجهز کنید؛ چون کرکرها از روی عادت؛ همیشه روی اولین خط یا آخرین خط یه تابع BP میذارن.

-> غیر فعال کردن یه CRC خوب ؛ معمولا خسته کننده ترین جای یه کد واسه کرکره!

-> به عنوان یه اصل؛ هیچ گاه بلافاصله بعد از این که چک کردید که آیا شرط امنیتی نقض شده یا نه؛ Jump نکنید و MessageBox رو نشون ندید ...!

-> Registery ویندوز عمومیترین جاییه که برنامه نویسان واسه نگهداری کدها و جنبه های امنیتی برنامه شون ازش استفاده میکنن...!

-> با کمی مطالعه و تحقیق میتونین IAT رو دستکاری کنید....این عاقلانه ترین کار واسه مخفی کردن لیست API هایی است که برنامه تون ازش استفاده میکنه.

تذکر:
1) تمام روشهایی که من و Joker ذکر کردیم به Ring3 مربوط میشه.
2) تمام روشهای فوق الذکر قابل دور زدن هستن

خواهش:
کما فی السابق از هیچکدام از روشهای من و جوکر استفاده نکنید...!

joker
جمعه 01 دی 1385, 20:09 عصر
در ادامه تائید حرفهای افشین :

برای کدTOP توی دیباگری مثلsice جوابگو نیست ، توی oly هم در اکثر موارد ALT+F5 مشکل را حل میکنه :)
ولی برای کرکرهای تازه کار بد نیست حال گیری کنه .

Thread ها همیشه مایه دردسر کرکرها هست ، حتما استفاده کنید ( اللخصوص روتینهای مربوط به امنیت ، و همیشه تکه ای از کد اصلی برنامه را هم اجرایش را منوط به در حال استفاده بودن ترد بزارین که در صورتی که ترد را ساسپند کردن برنامه عملا کار نکنه )

پیرو حرف افشین نه تنها یکبار چک نکنید بلکه با یه case و یه تابع random روتینهای مختلف را چک کنید ( سرویس دهان و دندان :لبخند:)

بهتره سطر اول و آخر Function ها و Procedure های خود رو به Trick هایی جهت شناسایی BP مجهز کنید؛ چون کرکرها از روی عادت؛ همیشه روی اولین خط یا آخرین خط یه تابع BP میذارن.سورس بزار لطفا :)


-> به عنوان یه اصل؛ هیچ گاه بلافاصله بعد از این که چک کردید که آیا شرط امنیتی نقض شده یا نه؛ Jump نکنید و MessageBox رو نشون ندید ...!حتی المکان اصلا نزارید ، به جاش برنامه را طوری بنویسید که بعد از ورود قفل ( مثلا اکتیو کد) برنامه نیاز به ریست داشته باشه و توی بارگذاری مجدد وجود قفل چک بشه ( شایداین روش را توی خیلی از برنامه ها دیده باشین )

> Registery ویندوز عمومیترین جاییه که برنامه نویسان واسه نگهداری کدها و جنبه های امنیتی برنامه شون ازش استفاده میکنن...!اگه احیانا مجبور به استفاده از ثبت اطلاعات در رجیستری یا فایل شدید ( که حتما میشید) سعی کنید اطلاعات کد شده نوشته بشن
( روتین دیکود که خودتون دارید)
یک نمونه در اینجا از روتین های کد گزاری متن میزارم.
( میشه گفت غیر از کدینگ معمولی برای دریافت و ارسال اکتیو کد های فایلیKey هم خیلی خوب میتونید ازش استفاده کنید )



function MY_Encript(const ReaLtext:String;password:string ):string ;
var
x,i, // count variables
sText,sPW: Integer; // size of Text, PW
Buffer,PW: PChar; // buffer for Text, PW
begin
sText:=Length(Realtext)+1;
sPW:=Length(password)+1;

GetMem(Buffer,sText);
GetMem(PW,sPW);

// GetWindowText( hEdit,Text,sText);
Buffer := pchar(Realtext) ;
PW := pchar(password) ;

x:=0; // initialize count
for i:=0 to sText-2 do
begin
Buffer[i]:=Chr(Ord(Buffer[i])+Ord(PW[x]));
Inc(x);
if x=(sPW-1)then x:=0;
end;
Result := Buffer ;
end;// end of proc



function MY_Descript(inText:String;password:string ):String ;

var
x,i, // count variables
sText,sPW: Integer; // size of Text, PW
Text,PW: PChar; // buffer for Text, PW
begin
sText:=Length(intext)+1;

sPW:=Length(password)+1;

GetMem(Text,sText);
GetMem(PW,sPW);

text:= pchar(intext);
PW:= pchar(password);

x:=0; // initialize count
for i:=0 to sText-2 do
begin
Text[i]:=Chr(Ord(Text[i])-Ord(PW[x]));
Inc(x);
if x=(sPW-1)then x:=0;
end;
result := text ;
end;// end of prioc



تذکر:
1) تمام روشهایی که من و Joker ذکر کردیم به Ring3 مربوط میشه.
2) تمام روشهای فوق الذکر قابل دور زدن هستن
حالا بیا و درستش کن :)
استفاده کنید اقا ( این افشین طرف خرسه هست:لبخند: )، یه قفلم یه قفله :متفکر:
رینگ 0 را هم استاد میکنن ، ولی خب آدمهای کمتر.

Best Programmer
جمعه 01 دی 1385, 22:17 عصر
یه مورد از خودم بدم حال ببرید.


.386
.model flat, stdcall
option casemap :none ; case sensitive

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
msgTitle db "Execution status:",0h
msgText1 db "No debugger detected!",0h
msgText2 db "Debugger detected!",0h
.code

start:

; MASM32 antiRing3Debugger example

; This code takes advantage of debugger not handleing INT3
; instructions correctly. If we set a SEH before INT3 executing
; INT3 instruction will fire SEH. If debugger is present it
; will just walk over INT3 and go straight forward.
; If debugger is not present exception will occure and exection
; will be handled by SEH.

; Set SEH
ASSUME FS:NOTHING
PUSH offset @Check
PUSH FS:[0]
MOV FS:[0],ESP

; Exception
INT 3h

PUSH 30h
PUSH offset msgTitle
PUSH offset msgText2
PUSH 0
CALL MessageBox

PUSH 0
CALL ExitProcess

; SEH handleing
@Check:
POP FS:[0]
ADD ESP,4

PUSH 40h
PUSH offset msgTitle
PUSH offset msgText1
PUSH 0
CALL MessageBox

PUSH 0
CALL ExitProcess

end start

و برای SICE :

; ################################################## #######################

.586
.model flat, stdcall
option casemap :none ; case sensitive

; ################################################## #######################
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\comdlg32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comdlg32.lib

; ################################################## #######################
.data
VICETOOLZ_1 db "\\.\SICE",0h
VICETOOLZ_2 db "\\.\SIWVID",0h
VICETOOLZ_3 db "\\.\NTICE",0h
VICETOOLZ_4 db "\\.\REGSYS",0h
VICETOOLZ_5 db "\\.\REGVXG",0h
VICETOOLZ_6 db "\\.\FILEVXG",0h
VICETOOLZ_7 db "\\.\FILEM",0h
VICETOOLZ_8 db "\\.\TRW",0h
VICETOOLZ_9 db "\\.\ICEEXT",0h

DbgNotFoundTitle db "Debugger status:",0h
DbgFoundTitle db "Debugger status:",0h
DbgNotFoundText db "Debugger or other vice tool not found!",0h
DbgFoundText db "Debugger or other vice tool found!",0h
.code

start:

; This is the oldest way to detect SoftICE. Here we do it by trying to
; create a file named as SoftICE driver. Since we can not access it
; error will occure and we will detect this by CreateFileA return value.
; If EAX is zero, SICE or other "vice" tool is detected.

; Start data. There are 9 of vice tools and first string is located at
; VICETOOLZ_1 offset.

MOV ESI,9
MOV EDI,offset VICETOOLZ_1

@TryNext:
PUSH 0h ;hTemplateFile
PUSH FILE_ATTRIBUTE_NORMAL ;Hidden/Normal
PUSH OPEN_EXISTING ;OPEN_EXISTING
PUSH 0h ;pSecurity
PUSH FILE_SHARE_READ ;ShareMode = File Share Write
PUSH FILE_FLAG_WRITE_THROUGH ;Access
PUSH EDI ;Path
CALL CreateFileA ;CreateFileA

; Small fix here!

CMP EAX,-1
JNE @ToolFound

; Here we search for the next vice tool string [name].

@find_next:
INC EDI
CMP BYTE PTR[EDI],0h
JNE @find_next
INC EDI
DEC ESI
JNE @TryNext

PUSH 40h
PUSH offset DbgNotFoundTitle
PUSH offset DbgNotFoundText
PUSH 0
CALL MessageBox

@Exit:
PUSH 0
CALL ExitProcess

@ToolFound:
PUSH 30h
PUSH offset DbgFoundTitle
PUSH offset DbgFoundText
PUSH 0
CALL MessageBox
JMP @Exit

end start

البته من فکر کنم قبلا بحثی داشتم. http://www.barnamenevis.org/forum/showthread.php?t=17923&page=4

البته دیگه این چیزا قدیمی شده و بچه کرکر ها هم دیگه می تونند این چیزا رو در بشوند. من خودم به شخصه دیگه از این جور بحثا خوشم نمی آد ولی بهترین روش همون Ring0 نویسی هست .
اینم یه سایت توپ : http://www.microsoft.com/whdc/devtools/ddk/default.mspx :)

joker
جمعه 01 دی 1385, 22:41 عصر
برنامه های محافظت شده رینگ0 در بعضی جاها به مشکل بر میخورند کاربرهایی که میخوان برنامه را در سطح user معمولی ویندوز نصب کنن و کار کنن نه administrator
البته محاسنش به دردسرهاش می ارزه...
برای برنامه نویسی درایور ویندوزی هم کتاب The Windows 2000 Device Driver Book, A Guide for Programmers بد نیست



The Windows 2000 Device Driver Book, A Guide for Programmers, Second Edition (http://barnamenevis.org/forum/START.htm)

Foreword (http://barnamenevis.org/forum/1.htm)

Preface (http://barnamenevis.org/forum/4.htm)
What You Should Already Know (http://barnamenevis.org/forum/5.htm)
What's Covered (http://barnamenevis.org/forum/6.htm)
What's Not (http://barnamenevis.org/forum/7.htm)
About the Sample Code (http://barnamenevis.org/forum/8.htm)
History of this Book (http://barnamenevis.org/forum/9.htm)
Training and Consulting Services (http://barnamenevis.org/forum/10.htm)

Acknowledgments (http://barnamenevis.org/forum/12.htm)

1. Introduction to Windows 2000 Drivers (http://barnamenevis.org/forum/14.htm)
Overall System Architecture (http://barnamenevis.org/forum/15.htm)
Kernel-Mode I/O Components (http://barnamenevis.org/forum/16.htm)
Special Driver Architectures (http://barnamenevis.org/forum/17.htm)
Summary (http://barnamenevis.org/forum/18.htm)

2. The Hardware Environment (http://barnamenevis.org/forum/20.htm)
Hardware Basics (http://barnamenevis.org/forum/21.htm)
Buses and Windows 2000 (http://barnamenevis.org/forum/22.htm)
Hints for Working with Hardware (http://barnamenevis.org/forum/23.htm)
Summary (http://barnamenevis.org/forum/24.htm)

3. Kernel-Mode I/O Processing (http://barnamenevis.org/forum/26.htm)
How Kernel-Mode Code Executes (http://barnamenevis.org/forum/27.htm)
Use of Interrupt Priorities by Windows 2000 (http://barnamenevis.org/forum/28.htm)
Deferred Procedure Calls (DPCs) (http://barnamenevis.org/forum/29.htm)
Access to User Buffers (http://barnamenevis.org/forum/30.htm)
Structure of a Kernel-Mode Driver (http://barnamenevis.org/forum/31.htm)
I/O Processing Sequence (http://barnamenevis.org/forum/32.htm)
Summary (http://barnamenevis.org/forum/33.htm)

4. Drivers and Kernel-Mode Objects (http://barnamenevis.org/forum/35.htm)
Data Objects and Windows 2000 (http://barnamenevis.org/forum/36.htm)
I/O Request Packets (IRPs) (http://barnamenevis.org/forum/37.htm)
Driver Objects (http://barnamenevis.org/forum/38.htm)
Device Objects and Device Extensions (http://barnamenevis.org/forum/39.htm)
Controller Objects and Controller Extensions (http://barnamenevis.org/forum/40.htm)
Adapter Objects (http://barnamenevis.org/forum/41.htm)
Interrupt Objects (http://barnamenevis.org/forum/42.htm)
Summary (http://barnamenevis.org/forum/43.htm)

5. General Development Issues (http://barnamenevis.org/forum/45.htm)
Driver Design Strategies (http://barnamenevis.org/forum/46.htm)
Coding Conventions and Techniques (http://barnamenevis.org/forum/47.htm)
Driver Memory Allocation (http://barnamenevis.org/forum/48.htm)
Unicode Strings (http://barnamenevis.org/forum/49.htm)
Interrupt Synchronization (http://barnamenevis.org/forum/50.htm)
Synchronizing Multiple CPUs (http://barnamenevis.org/forum/51.htm)
Linked Lists (http://barnamenevis.org/forum/52.htm)
Summary (http://barnamenevis.org/forum/53.htm)

6. Initialization and Cleanup Routines (http://barnamenevis.org/forum/55.htm)
Writing a DriverEntry Routine (http://barnamenevis.org/forum/56.htm)
Code Example: Driver Initialization (http://barnamenevis.org/forum/57.htm)
Writing Reinitialize Routines (http://barnamenevis.org/forum/58.htm)
Writing an Unload Routine (http://barnamenevis.org/forum/59.htm)
Code Example: Driver Unload (http://barnamenevis.org/forum/60.htm)
Writing Shutdown Routines (http://barnamenevis.org/forum/61.htm)
Testing the Driver (http://barnamenevis.org/forum/62.htm)
Summary (http://barnamenevis.org/forum/63.htm)

7. Driver Dispatch Routines (http://barnamenevis.org/forum/65.htm)
Announcing Driver Dispatch Routines (http://barnamenevis.org/forum/66.htm)
Writing Driver Dispatch Routines (http://barnamenevis.org/forum/67.htm)
Processing Read and Write Requests (http://barnamenevis.org/forum/68.htm)
Code Example: A Loopback Device (http://barnamenevis.org/forum/69.htm)
Extending the Dispatch Interface (http://barnamenevis.org/forum/70.htm)
Testing Driver Dispatch Routines (http://barnamenevis.org/forum/71.htm)
Summary (http://barnamenevis.org/forum/72.htm)

8. Interrupt-Driven I/O (http://barnamenevis.org/forum/74.htm)
How Programmed I/O Works (http://barnamenevis.org/forum/75.htm)
Driver Initialization and Cleanup (http://barnamenevis.org/forum/76.htm)
Writing a Start I/O Routine (http://barnamenevis.org/forum/77.htm)
Writing an Interrupt Service Routine (ISR) (http://barnamenevis.org/forum/78.htm)
Writing a DpcForIsr Routine (http://barnamenevis.org/forum/79.htm)
Some Hardware: The Parallel Port (http://barnamenevis.org/forum/80.htm)
Code Example: Parallel Port Loopback Driver (http://barnamenevis.org/forum/81.htm)
Testing the Parallel Port Loopback Driver (http://barnamenevis.org/forum/82.htm)
Summary (http://barnamenevis.org/forum/83.htm)

9. Hardware Initialization (http://barnamenevis.org/forum/85.htm)
The Plug and Play Architecture: A Brief History (http://barnamenevis.org/forum/86.htm)
The Role of the Registry for Legacy Drivers (http://barnamenevis.org/forum/87.htm)
Detecting Devices with Plug and Play (http://barnamenevis.org/forum/88.htm)
The Role of Driver Layers in Plug and Play (http://barnamenevis.org/forum/89.htm)
The New WDM IRP Dispatch Functions (http://barnamenevis.org/forum/90.htm)
Device Enumeration (http://barnamenevis.org/forum/91.htm)
Device Interfaces (http://barnamenevis.org/forum/92.htm)
Code Example: A Simple Plug and Play Driver (http://barnamenevis.org/forum/93.htm)
Summary (http://barnamenevis.org/forum/94.htm)

10. Power Management (http://barnamenevis.org/forum/96.htm)
Hot Plug Devices (http://barnamenevis.org/forum/97.htm)
OnNow Initiative (http://barnamenevis.org/forum/98.htm)
Wake Requests (http://barnamenevis.org/forum/99.htm)
Power Management Issues (http://barnamenevis.org/forum/100.htm)
Summary (http://barnamenevis.org/forum/101.htm)

11. Timers (http://barnamenevis.org/forum/103.htm)
Handling Device Timeouts (http://barnamenevis.org/forum/104.htm)
Code Example: Catching Device Timeouts (http://barnamenevis.org/forum/105.htm)
Managing Devices without Interrupts (http://barnamenevis.org/forum/106.htm)
Code Example: A Timer-Based Driver (http://barnamenevis.org/forum/107.htm)
Summary (http://barnamenevis.org/forum/108.htm)

12. DMA Drivers (http://barnamenevis.org/forum/110.htm)
How DMA Works under Windows 2000 (http://barnamenevis.org/forum/111.htm)
Working with Adapter Objects (http://barnamenevis.org/forum/112.htm)
Writing a Packet-Based Slave DMA Driver (http://barnamenevis.org/forum/113.htm)
Code Example: A Packet-Based Slave DMA Driver (http://barnamenevis.org/forum/114.htm)
Writing a Packet-Based Bus Master DMA Driver (http://barnamenevis.org/forum/115.htm)
Writing a Common Buffer Slave DMA Driver (http://barnamenevis.org/forum/116.htm)
Writing a Common Buffer Bus Master DMA Driver (http://barnamenevis.org/forum/117.htm)
Summary (http://barnamenevis.org/forum/118.htm)

13. Windows Management and Instrumentation (http://barnamenevis.org/forum/120.htm)
WMI: The Industry Picture (http://barnamenevis.org/forum/121.htm)
The WMI Architecture (http://barnamenevis.org/forum/122.htm)
WMI Summary (http://barnamenevis.org/forum/123.htm)
Conventional Driver Event Logging (http://barnamenevis.org/forum/124.htm)
Summary (http://barnamenevis.org/forum/125.htm)

14. System Threads (http://barnamenevis.org/forum/127.htm)
Definition and Use of System Threads (http://barnamenevis.org/forum/128.htm)
Thread Synchronization (http://barnamenevis.org/forum/129.htm)
Using Dispatcher Objects (http://barnamenevis.org/forum/130.htm)
Code Example: A Thread-Based Driver (http://barnamenevis.org/forum/131.htm)
Summary (http://barnamenevis.org/forum/132.htm)

15. Layered Drivers (http://barnamenevis.org/forum/134.htm)
An Overview of Intermediate Drivers (http://barnamenevis.org/forum/135.htm)
Writing Layered Drivers (http://barnamenevis.org/forum/136.htm)
Writing I/O Completion Routines (http://barnamenevis.org/forum/137.htm)
Allocating Additional IRPs (http://barnamenevis.org/forum/138.htm)
Writing Filter Drivers (http://barnamenevis.org/forum/139.htm)
Code Example: A Filter Driver (http://barnamenevis.org/forum/140.htm)
Writing Tightly Coupled Drivers (http://barnamenevis.org/forum/141.htm)
Summary (http://barnamenevis.org/forum/142.htm)

16. Driver Installation (http://barnamenevis.org/forum/144.htm)
Installation of a Driver (http://barnamenevis.org/forum/145.htm)
Auto-Install Using INF Files (http://barnamenevis.org/forum/146.htm)
Using a Driver INF File (http://barnamenevis.org/forum/147.htm)
Controlling Driver Load Sequence (http://barnamenevis.org/forum/148.htm)
Digital Signing of a Driver (http://barnamenevis.org/forum/149.htm)
Summary (http://barnamenevis.org/forum/150.htm)

17. Testing and Debugging Drivers (http://barnamenevis.org/forum/152.htm)
Guidelines for Driver Testing (http://barnamenevis.org/forum/153.htm)
Why Drivers Fail (http://barnamenevis.org/forum/154.htm)
Reading Crash Screens (http://barnamenevis.org/forum/155.htm)
An Overview of WinDbg (http://barnamenevis.org/forum/156.htm)
Analyzing a Crash Dump (http://barnamenevis.org/forum/157.htm)
Interactive Debugging (http://barnamenevis.org/forum/158.htm)
Writing WinDbg Extensions (http://barnamenevis.org/forum/159.htm)
Code Example: A WinDbg Extension (http://barnamenevis.org/forum/160.htm)
Miscellaneous Debugging Techniques (http://barnamenevis.org/forum/161.htm)
Summary (http://barnamenevis.org/forum/162.htm)

A. The Driver Debug Environment (http://barnamenevis.org/forum/164.htm)
Hardware and Software Requirements (http://barnamenevis.org/forum/165.htm)
Debug Symbol Files (http://barnamenevis.org/forum/166.htm)
Enabling Crash Dumps on the Target System (http://barnamenevis.org/forum/167.htm)
Enabling the Target System's Debug Client (http://barnamenevis.org/forum/168.htm)

B. Bugcheck Codes (http://barnamenevis.org/forum/170.htm)

C. Building Drivers (http://barnamenevis.org/forum/172.htm)
The Build Utility (http://barnamenevis.org/forum/173.htm)
Using Visual Studio to Build Drivers (http://barnamenevis.org/forum/174.htm)

Developer Programmer
شنبه 02 دی 1385, 14:07 عصر
1) فرض کنید که برنامه تون رو اونقدر قوی ساختید که Patch کردنش وقت و هزینه زیادی میخواد.
اگه مطالب اینپرایز عزیز رو در مورد Loader به یاد داشته باشید. باید خدمتتون عرض کنم که با استفاده از Loader , بسیار راحت میشه امنیت برنامه تون رو دور زد.
Loader برنامه تون رو اجرا میکنه و در RAM روی Offset مورد نظر می ایسته و تغییر لازم رو اعمال میکنه. اینطوری بدون اینکه سایز برنامه تون در دیسک تغییر کنه؛ Patch میشه.

2)تصور کنید برنامه ای نوشتین که به ازای Name های مختلف, Serial Number های متفاوتی تولید میکنه. و کاری کردید که کرکر حتی در RAM هم قادر به دستکاری برنامه نیست.
اساس کار Serial Fishing از این ضعف استفاده میکنه که برنامه شما یک رشته رو با رشته دیگه مقایسه میکنه. کرکر میتونه با مراجعه به محتوای ثباتها, "کد صحیح" رو استخراج کنه.
اما از اونجایی که برنامه شما هربار کد جدیدی تولید میکنه (و غیر قابل تغییر هم هست) باید از روش فوق العاده زیبای دیگه استفاده کرد.
Serial Sniffing روشیه که از ترکیب دو روش بالا استفاده میکنه؛ یعنی همیشه برنامه رو تا آدرس مورد نظر اجرا میکنه و بعد محتوای ثباتها رو نشون میده :بامزه:

3)با استفاده از تابع VirtualAlloc صفحاتی(Page) از حافظه رو که داده های خود رو بار گذاری کردید, کدگذاری کنید و فقط زمانی انرا کدگشایی کنید که به اطلاعات آن نیاز دارید( بدیهی است که بلافاصله بعد از خواندن باید دوباره کدگذاری کنید)
این روش رو تقربیا همه پروتکتورهای قوی استفاده میکنن.

4)از پروتکتورهای آماده(و مشهور) استفاده نکنید. چون روشهای دور زدن اونها خیلی زود کشف میشه.

5)تجربه شخصی نشون داده که متاسفانه یا خوشبختانه؛ هیچ وقت قادر به تضمین 100% امنیت برنامه تون نخواهید بود.

Developer Programmer
یک شنبه 01 بهمن 1385, 12:20 عصر
اگه هنوز نمیدونین که یه دیباگر چطور میتونه برنامه رو اجرا کنه و محتوای ثباتها رو نشون بده، کد زیر میتونه خیلی بهتون کمک کنه


var
si: TStartupInfo;
Programm:PChar;
context:_CONTEXT;
buf1:array[0..1] of char;
bp:array[0..1] of char;
addr:Pointer;
num:DWORD;
pi :_PROCESS_INFORMATION
begin
// Ziel-EXE
Programm:='D:\Cr@cking\Cr@ckMe\HDasm\HDasm.exe';
// Code für BreakPoint
bp:=chr($EB)+chr($FE);
// Programm wird im Suspended-Mode gestartet
FillChar(si, SizeOf(si), 0);
FillChar(pi, SizeOf(pi), 0);
CreateProcess(Programm,nil,nil,nil,false,CREATE_SU SPENDED,nil,nil,si,pi);
// Register werden gelesen
context.ContextFlags:=CONTEXT_FULL or CONTEXT_FLOATING_POINT or CONTEXT_DEBUG_REGISTERS;
GetThreadContext(pi.hThread,context);
// EntryPoint wid ermittelt
addr:=ptr(context.Eax);
// Schreib-Lese-Rechte werden geholt
VirtualProtectEx(pi.hProcess,addr,2,PROCESS_ALL_AC CESS,num);
// alte werte werden gesichert
ReadProcessMemory(pi.hProcess,addr,@buf1,sizeof(bu f1),num);
showmessage(inttostr(num));
// breakPoint wird gesetzt
WriteProcessMemory(pi.hProcess,addr,@bp,sizeof(bp) ,num);
showmessage(inttostr(num));
// Prozess wird fortgesetzt
ResumeThread(pi.hThread);
// es wird gewartet bis Programm am BP h&auml;ngt
sleep(100);
// Prozess wird angehalten
suspendThread(pi.hThread);
// Register werden gelesen
GetThreadContext(pi.hThread,context);
// alte werte werden wiederergestellt
WriteProcessMemory(pi.hProcess,addr,@buf1,sizeof(b uf1),num);
// Register werden ausgegeben
showmessage('EAX: '+inttohex(context.Eax,8)+#13+
'EBX: '+inttohex(context.Ebx,8)+#13+
'ECX: '+inttohex(context.Ecx,8)+#13+
'EDX: '+inttohex(context.Edx,8)+#13+
'ESP: '+inttohex(context.Esp,8)+#13+
'EDI: '+inttohex(context.Edi,8)+#13+
'EIP: '+inttohex(context.Eip,8)+#13
);
// Prozess wird fortgesetzt
ResumeThread(pi.hThread);
end;

bashiry
پنج شنبه 26 بهمن 1385, 01:20 صبح
واقعا تا اینجای کار مطالب مفیدی رد وبدل شد و من خیلی استفاده کردم

قطعا نمیشه برنامه رو 100 درصد از نظر امنیت تضمین کرد ولی همونطور که دوستان اشاره کردن میشه کرکر رو خسته کرد.


1)میشه با برنامه نویسی محلهای حساس برنامه رو چک کرد و اگر دستورات پچ شده بودن متوجه شد. فرض کنید دستور JE رو در فلان آفست و سگمنت میان و Nop می کنن.
باید راهی وجود داشته باشه که با برنامه نویسی اینو فهمید.

2)حالتی دیگه هم CRC هست. که مجموع چک سام رو با چک سام اصلی مقایسه می کنه اگه برابر نبود که یعنی فایل دستکاری شده.

3) راه بعدی هدایت کردن برنامه به Exception های مختلفه. به طوری که کرک فکر کنه اشتباهی این نقطه رو پچ کرده

4) میشه با ترکیبی از پکرها عملیات آنپک و کرک رو برای مدتی به تعویق انداخت.


از دوستان خواهشمندم در مورد 1 و 2 و 3 اگه سورسی دارن اتچ کنن تا صحبت ها جنبه عملی پیدا کنه


اینا ایده های من بود امیدوارم به درد بخوره - با تشکر محمد بشیری

Developer Programmer
دوشنبه 07 اسفند 1385, 21:35 عصر
* تصور میکنم اِشکال بزرگی که نویسندگان نرم افزار مرتکب میشن اینه که قفل رو فقط برای صحت اطمینان استفاده میکنن. در نتیحه اگه قفل برداشته بشه هیچ مشکلی پیش نمیاد. اما اگه قسمتی از کد خودشون رو داخل قفل بریزن... حتما باید قفل وجود داشته باشه تا کد به طور کامل اجرا بشه

* برنامه ای مثل RFA ، بعضی از functionهای خود رو encrypt میکنه. و فقط با شماره سریال صحیح میتونه اون functionها رو decrypt کنه...

دنیای دلفی
یک شنبه 15 اردیبهشت 1387, 15:29 عصر
اين مطالبي را كه مي نويسم شامل تجربيات بنده در مورد نوشتن رويه هاي محافظت از نرم افزارهاي تحت ويندوز مي باشد :
‌‍{:گریه:ممكن است خيلي ساده باشه ولي خيلي روش كار و فكر كردم:گریه:}
1- اگر اسمبلي يك مقداري سردر بياريد بسيار مفيد است
2-برنامه هاي وجود دارد كه به راحتي فانكشنها و پروسيجر هاي شما را غير فعال و حتي مسير اجرا شدن آنها را تغيير مي دهند . حتي بدون يك خط كدنويسي مانند :PE Explorer و Resource Tuner كه توي اين كار بسيار حرفه اي عمل مي كنند . حتي مي تونند برنامه هاي نوشته شده با VB.NET را فرمهايشان را نيز نشان دهند .
گروهي از كركرهاي ساده (تازه كار)كه از اسمبلي خبر ندارند با استفاده از اين برنامه هاي برنامه هاي شما را حداقل مي توانيد تغيير ليبل دهند . پس براي جلوگيري از شناسايي توابع بايد چه راهي را اتخاذ كرد ؟
جواب : شما نبايد در زمان طراحي فرم از اشياء استفاده كنيد بايد آنها را در هنگام اجرا بسازيد (Run Time) . شما نبايد در رويداد OnCreate فرم توابع بررسي قفل يا اطلاعات نويسنده را بنويسيد . يك تابع تعريف مي نمائيد .

public
{ Public declarations }
procedure FirstTestLock(Sender: TObject);
end;
ببينيد چون مي خواهيم در بخش ديگري اين تابع را صدا بزنيم آن را نبايد در بخش Private تعريف نمود و طبق كد پايين اين تابع را صدا مي زنيم .



program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Form1.FirstTestLock(nil);
Application.Run;
end.


حالا بايد اشياء ي را كه مي خواهيم بسازيم درون تابع مربوطه توليد كنيم . به كد زير توجه كنيد براي ساختن يك تايمر است و مقدار دهي به تايمر كه چه كدي را بايد اجرا نمايد :

اين فرامين را در تابع تعريف شده مي نويسيم :



procedure TForm1.FirstTestLock(Sender: TObject);
var
Timer1: TTimer;
begin
Try
Timer1 := TTimer.Create(self);
Timer1.Interval:=60000;
Timer1.Enabled:=True;
Timer1.OnTimer:=OnTimerActive1;
.
.
.


حالا بايد تابع OnTimerActive1 تعريف كنيم دقيقا در مكاني كه مشخص مي كنم :




private
{ Private declarations }
procedure OnTimerActive1(Sender: TObject);

.
.
.




حالا در مكاني دلخواه كدهاي اين تايمر را مي نويسيم :


procedure TForm1.OnTimerActive1(Sender: TObject);
begin

با استفاده از توابع موجود حجم و Crc32 فايل را بدست آوريد

حجم فايل را درون يك فايل به صورت كد شده يا در رجيستري ذخيره نمائيد
Crc را نيز همين طور حالا بررسي كنيد كه آيا حجم يا سي آر سي فايل تغيير نموده يا خير كه اگر تغيير نموده بود برنامه را Halt و مي توانيد دهن ويندوز را هم :عصبانی++: بكنيد در غير اين صورت :لبخندساده: .

حالا اگر كركر از Loader استفاده كرده باشد كه دهن ما ... است . براي رفع تا حدودي اين مشكل مي توانيد از يكي از شماره سريالهاي منحصر بفرد سيستم مانند هارد ديسك استفاده كنيد كه به صورت كد شده در فايل بانك اطلاعاتي يا رجيستري ذخيره و با شماره فعلي سيستم مقايسه كنيد . چون اين فرامين در داخل يك تايمر هستند مي توانيد حتي اگر برنامه با لودر اجرا شده باشد (معمولا حجم و CRC تغيير نمي كند) باعث بسته شدن برنامه و ساير كارهاي :متفکر: شويد .

نكته بسيار مهم رشته ها هستند شما تحت هيچ شرايطي رشته ها را لخت (:بامزه:)رها نكنيد
يعني آنها را مستقيم در برنامه ننويسيد :
پيشنهاد : شما مي توانيد در بيرون برنامه رشته را كد كنيد (مثلا :استفاده از خاصيت AESEncrypt مربوط به IceLicense) حالا در برنامه آنها را دي كد كنيد (مثلا : با استفاده از AESDecrypt مربوط به IceLicense ) ولي يك مشكل وجود دارد آن هم استفاده از كليد براي دي كد كردن است كه شما مجبور هستيد آن را در برنامه به صورت يك رشته وارد كنيد .
راه حل : شما مي توانيد : كليد را به اين صورت بنويسيد


PChar(Char(72)+Char(104)+Char(125))
اين كار باعث مي شود كه كليد فقط RunTime ظاهر شود . و در حالت عادي در فايل اجراي شما قابل ديدن نباشد . اين باعث مي شود كه تا حدي وضعيت رشته ها در برنامه مستحكم شود . البته تا حدي :گیج:

حالا بهتره توي تايمر يه مقداري حال ديباگر ها را هم بگيريم البته تا حدي :
با استفاده از :



var
Task:HWND;

Task:=FindWindow(Pchar(IceLicense1.AESDecrypt('wdw UZkYwdwZawd',PChar(Char(51)+Char(95)+Char(50)),nil ));
PostMessage(Task,WM_CLOSE,0,0);



wdwUZkYwdwZawd : كد كلمه OlyDbg است

PChar(Char(51)+Char(95)+Char(50))
كليد تبديل كد به OlyDbg است .

البته تايمري كه اين كار و كارهاي ديگر را مي كند با همان روش بالا ايجاد و نيم ثانيه به نيم ثانيه اجرا شود .
اين جوري هم :عصبانی++: يكم كركرهاي تازه كار را آره ...



كليه روشهاي فوق قابل دور زدن و روئيت هستند فقط براي بالا بردن امنيت استفاده مي شوند .

البته يه كاري ديگه هم مي شه كرد كه من انجام دادم هنوز كه هنوزه كسي نتونسته Crack Me من را بيشتر از 50 درصد كرك كنند . البته اون 50 درصد بعدي خيلي مهم تره چون مجوز اجراي برنامه رو در گام اخر ميده اگر نتونستند كرك كنند اون را هم مي گم .:لبخند:

پايان قسمت اول

دنیای دلفی
جمعه 20 اردیبهشت 1387, 00:17 صبح
بخش دوم آموزش محافظت از نرم افزارها در مقابل كركينگ::عصبانی++::گریه:

شايد براي شما اين سوال پيش بيايد كه چگونه بايد CRC و حجم يك فايل را بدست آورد :
روش بدست آوردن CRC16 , CRC32 , Size با استفاده از كامپوننت زير

با استفاده از تابع زير مي توانيد موارد مورد نياز خود را بدست آوريد


Error32 : WORD;
FileBytes: TInteger8;
CRC32File : LongWord;

CalcFileCRC32 (Application.ExeName, CRC32File, FileBytes, Error32);


روش ديگر براي بدست آوردن حجم فايل برنامه :



function GetFSize(Handle: THandle): Int64;
var
i64: record
LoDWord: LongWord;
HiDWord: LongWord;
end;
begin
i64.LoDWord := GetFileSize(Handle, @i64.HiDWord);
if (i64.LoDWord = MAXDWORD) and (GetLastError <> 0) then
Result := 0
else
Result := PInt64(@i64)^;
end;



Stream:TFileStream;
FSize2:int64;


Stream := nil;
try
Stream := TFileStream.Create(Application.ExeName,
fmOpenRead or fmShareDenyNone);

Fsize2:=GetFSize(Stream.Handle);
finally
Stream.Free;
end;

شما مي توانيد براي امنيت بيشتر در صورت عدم شرايط مجاز اقدام به خودزني :متعجب:و حذف فايل اجرايي كنيد فايل براي انجام اين جنايت ضميمه شده است .

با استفاده از تابع


Deleteexe;پايان قسمت دوم

دنیای دلفی
شنبه 21 اردیبهشت 1387, 00:18 صبح
بخش سوم امنيت نرم افزارهاي (پيشرفته):
اين روش بسيار كارآمد و تقريبا مي توان گفت تا وقتي كه كد اصلي (Decode) لو نرفته برنامه شما تا 99% ايمن و به راحتي قابل انتشار در بازار حتي بازار جهاني است .
گوش فرا دهيد :
در برنامه هاي تجاري مي توان گفت كه 100% وجود بانك اطلاعاتي الزامي است (Sql Sever,Oracle , MySql ,DBISAM) و نكته مهمي كه وجود دارد برقراي ارتباط با بانك اطلاعتي است (Connect To Database) پس يكي از گزينه هاي مهم برنامه اتصال به بانك اطلاعاتي است .
در صورتي كه شما بخشي از كدهاي مهم برنامه را كه براي اجراي برنامه وجودشان حياتي است را محافظت كنيد مي توانيد گام مؤثري را در مقابله با كركرها برداريد .
كركرها در حالت طبيعي و نرمال پس از UnPack برنامه مي توانيد شرطها و كيسها و حلقه ها را شناسايي و عملكرد آنها را تغيير يا غيرفعال كنند . يك تايمر يا يك تابع را با يك Nop يا عكس كردن عملش آن را غير فعال و اصطلاحاٌ آن را كرك كنند . اما اگر حلقه For يا Case يا Connect به بانك اطلاعاتي وجود داشته باشد .
بله مي خوام برم بعد از اين مقدمه كوتاه روي اصل ماجرا .
خوب اگر ما بتوانيم كدهاي برنامه را بعد از مرحله Design و توليد فايل اجرايي تغيير دهيم ديگر كسي نمي تواند كدهاي ما را تغيير و آنها را Crack كند . البته غيير ممكن نيست ولي بسيار مشكل و به شانس بسيار زيادي بستگي دارد .
خوب پس براي اجراي كدهاي تغيير پيدا كرده چه كاري مي توان انجام داد . بايد با استفاده از الگوريتم عكس عمل كد در زمان اجرا (Run Time) كدهاي Encrypt شده را در حافظه Decrypt نمود .

بسياري از پروتكتورهاي معرف اين امكان مهم را ارائه و پشتيباني مي كنند كه ما به راحتي از آن به دليل (شايد بلد نبود نحوه استفاده يا عدم مطالعه Help) ناشناخته استفاده نمي كنيم .

من براي مثال نحوه انجام اين كار را با Protector & Packer SVKP 1.44 توضيح مي دهم .

در پكيجهاي ابزارهاي Packer و Protector معمولا دو فايل با نامهاي مشخص وجود دارد كه براي اين مجموعه به نامهاي delphi_svkp_block_begin.inc و delphi_svkp_block_end.inc فايل اول حاوي اطلاعات و كدهاي اسمبلي زير است :


asm DB $EB,$7F,$EB,$00,$99,$AA,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $EB,$7F,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;

و فايل دوم حاوي كدهاي زير است :


asm DB $EB,$7F,$EB,$00,$BB,$CC,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $EB,$7F,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;


اين كدها قرار است قبل و بعد از فرامين كليدي و مهم ما كه در بالا به يكي از مهمترين آنها اشاره شد قرار مي گيرند .

با فرض اينكه اين دو فايل در پوشه include قرار داشته باشند به اين نحو استفاده مي شوند :


unit main;

interface

procedure Start;

implementation

uses
Registry,
Classes,
Windows,
SysUtils,
special;

var
RegMessage : String;
// This procedure will encrypted and it will decrypted only if user have correct registration key
procedure ActionForRegisteredUsers;
begin
{$I include\delphi_svkp_block_begin.inc}
RegMessage := 'Registered version!';
MessageBox(0,PChar (RegMessage),'',0);
{$I include\delphi_svkp_block_end.inc}
end;

procedure Start;
begin
try

// this code will decrypted before using and after use removed
// tip: This type of blocks is very good use in initialize part of program
// (load DLL(s), initialize data, fill some special variables and etc.)
{$I include\delphi_svkp_block_type2_begin.inc}
RegMessage := 'Encryption blocks example';
{$I include\delphi_svkp_block_type2_end.inc}

// This code will decrypted before using and encrypted again after use
{$I include\delphi_svkp_block_type1_begin.inc}
MessageBox(0,PChar (RegMessage),'',0);
ActionForRegisteredUsers; //this procedure is only for registered users
{$I include\delphi_svkp_block_type1_end.inc}
except
end;
end;
end.


در كد بالا از يك Uses به نام special استفاده شده است كه ممكن است براي شما سوال پيش بيايد كه اين فايل چيست . معمولا Protectorها علاوه بر تغييراتي كه برروي فايل اجرايي انجام مي دهند يك سري كدهاي سودمند براي مقابله با Debugger ها و ساير سيستمهاي نفوذي مي نويسند كه با توجه به نوع زبان برنامه نويسي قابل استفاده است . كه در اينجا با استفاده از اين فايل كه در اصل براي استفاده از يك Dll كه همراه package پروتكتور عرضه شده استفاده شده است . عدم استفاده از اين فايل اشكالي در سيستمي حفاظتي از كدها نمي كند . فقط جهت افزايش امنيت است .


حالا براي اينكه بتوان كدها را حفاظت نمود پس از توليد فايل اجرايي شما بايد به وسيله پروتكتور فايل را محافظت كنيد . در هنگامي كه پروتكتور در حال تغيير موقعيت احضار توابع و رويه ها است . وقتي به كدهاي ما رسيد :


procedure ActionForRegisteredUsers;
begin
{$I include\delphi_svkp_block_begin.inc}
RegMessage := 'Registered version!';
MessageBox(0,PChar (RegMessage),'',0);
{$I include\delphi_svkp_block_end.inc}
end;


اطلاعات موجود در فايل هاي مشخص شده را با اطلاعات كد هاي ما و يك سري كد كه با ااگوريتم RSA توليد مي شود تركيب مي نمايد . و باعث تغيير فيزيكي محتواي فايل اجرايي مي شود . يا اصطلاحاْ به نوعي محتواي فايل را خراب مي كند .

حالا براي اجراي برنامه به صورت صحيح و رجيستر شده حتما نياز به كد فعال سازي جهت Decrypt شدن اطلاعات خراب شده در فايل اجرايي برنامه است كه اين فايل توسط پروتكتور توليد مي شود .

كه در اين مثال SVKP فايل را به نام regkey.key توليد مي كند كه حاوي كد فعال سازي و بازسازي اطلاعات تخريب شده در زمان اجراست است.

به يك نمونه از محتواي اين فايل توجه كنيد :


-----BEGIN RSA PUBLIC KEY-----
AAG/aAN0uqBYL7SxnMqOHJouq3Yhz2nV3KW6pfhDQ29qbIlFRJWrYn i8fVTud9Gli5rJft
jAYy/pf0Ee2aKcD2t+j6+y2pweECBTfOjVwBw9bmFWTOchMBG8b7xzh 3wZ+6S/2/QeYILI
0Gmop/wuCrZzm3MkekGSRspC2v2R8dtgDl3ZGsHwMYpmOqWnNSrpxzea nGAS4D3iUyo50H
tVKGOHqba96HD4yG5G+suc3tZObR1rJveXpCU9WLCFltVxkXhp DYQFr7XhEJTi3H9TEfJ1
coH8MQla3j1vwPLtyVD4hpeyyOHJ5qbTyLXmyjavIouaOBOSZB YlLi332qLiPI4DAQADA
-----END RSA PUBLIC KEY-----


در صورتي كه اين فايل وجود داشته باشد برنامه اجرا و در غير اين صورت امكان اجراي برنامه وجود نخواهد داشت .

براي پيدا كردن اين كد بايد به روش سعي و خطا عمل كرد مانند روش پيدا كردن رمز فايلهاي RAR يا Zip يا از روش نقل قول (Fh_prg (http://barnamenevis.org/forum/member.php?u=325)) : (Bruteforce) مي توان استفاده نمود كه كار بسيار وقت گير و مشكلي است .

البته من براي اين كار از پروتكتورها استفاده نمي كنم . من در برنامه ها از كامپوننت SecureCode استفاده مي كنم . به دليل كپي رايت از ارائه اين كامپوننت در اينجا شرمنده هستم

البته اگر فايل رجيستر را ارائه دهيد و سيستم امنيني برنامه شما پايين باشد به راحتي مي توان با مثلا OLLY آن را dump كرد و از آنجايي كه فايل به صورت صحيح در Ram لود شده است اين محدوديت از بين مي رود .

از دوستان تقاضا مي شود كه الگوريتمهاي antidebug خود دريق نكنند . با همكاري و هم فكري هم ميشه سد بسيار بسيار بزرگي در مقابل كركرها ايجاد نمود .
از دوستان كركر كلاه سفبد تقاضا مي شود از الگوريتمهاي ضد ديباگ و مشكل ساز براي كركها بگذارند .

باي تا روز بدون كركر:گیج::بامزه::متعجب::قهقه :

دنیای دلفی
یک شنبه 22 اردیبهشت 1387, 14:41 عصر
سلام به دوستان امروز مي خوام ابزاري رو معرفي كنم كه رايگان و بسيار قدرتمند است براي كد كردن رشته ها در دلفي يا اصطلاحا مخفي كردن آنها اين ابزار بسيار مفيد براي كركرها تازه كار و كار كركرهاي حرفه اي را بسيار مشكل در پيدا كردن و شناسايي رشته هاي برنامه ها شما مي كند .

دقت كنيد : نام اين مجموعه Delphi Strings Killer (DSKiller) مي باشد . شما به صورت عادي برنامه را نوشته و كليه رشته ها را در برنامه تعريف مي كنيد سپس برنامه DSKiller را اجرا و فايل pas خود را مثلا اگر نامش unit1.pas باشد را open مي كنيد در فايل رشته ها را تعريف كرده ايد . حالا فايل شما باز شده و كليه رشته هاي شما ظاهر مي شود آنهايي را كه مي خواهيد كد كنيد را انتخاب و كليد كد شدن را بزنيد .
من يك مثال قبل از كد و يكي بعد از كد براي شما مي زنم :چشمک:

قبل از كد شدن :



unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if edit1.Text='HiProgrammer' then
showmessage('Hoooooooooooooo')
end;
end.




بعد از كد شدن : :عصبانی++: (كركر)




unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
const
dbs: array [0..26] of Byte= (
$78,$EB,$94,$6C,$AC,$D9,$B6,$27,$F4,$A2,$CE,$21,$7 8,$ED,$0E,$29,
$0D,$39,$6C,$6C,$80,$BC,$F4,$82,$D8,$80,$D4
);

function dcf(aBegPos, aLength: Integer): string;
var tmp: string;
i, endPos: Integer;
MyKey: word;
begin
MyKey:= 12345;
SetLength(Result, aLength);
tmp:= '';
endPos:= aBegPos+ aLength -1;
for i:= aBegPos to endPos do
tmp:= tmp+ Chr(dbs[i]);
for i:= 1 to Length(tmp) do
begin
Result[i]:= Char(Byte(tmp[i]) xor (MyKey shr 8));
MyKey:= (Byte(tmp[i])+ MyKey)* 52845+ 22719;
end;
end;

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if edit1.Text=dcf(0 ,12) then
showmessage(dcf(12 ,15))
end;
end.


خوب اميد وارم كه استفاده كرده باشيد .
ما هرچه داريم رو مي كنيم . منتظر دارايهاي شما هم هستيم . :چشمک::تشویق::لبخند:

دنیای دلفی
پنج شنبه 26 اردیبهشت 1387, 23:50 عصر
سيستم Encrypt , Decrypt , Hash مربوط به رشته ها و فايلها :

روشهايي پياده سازي Sha1 و Twofish و Base64

اين مجموعه بسيار قدرتمند به صورت رايگان جهت استفاده براي برنامه نويسان عزيز قرار مي گيريد اميد است كه جهت بالا بردن امنيت نرم افزارهاي خود استفاده لازمه را ببريد .

كل مجموعه به صورت تفكيك شده و به همراه سورس در پايين ضميمه شده است .

در مرحله اول Uses هاي مورد نياز را تعريف مي كنيد :


uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, SHA1, Twofish, Base64, StdCtrls, ExtCtrls;



سه Edit تعريف مي كنيد اولي براي مسير و نام فايل دومي براي كليد رمز گذاري و سومي براي نمايش كد Hash شده :

براي كد كردن فايل با رشته به روش زير عمل مي كنيد :


// produces a hash of a file
procedure _HashFile(filename: string; var Digest: TSHA1Digest);
var
Context: TSHA1Context; // record to store intermediate
// data
Source: file; // source file
Buffer: array[1..8192] of byte; // read buffer
Read: integer; // number of bytes read
begin
AssignFile(Source,filename);
try
Reset(Source,1);
except
MessageDlg('Unable to open source file.',mtInformation,[mbOK],0);
Exit;
end;
SHA1Init(Context); // initialize the data structure
repeat
BlockRead(Source,Buffer,Sizeof(Buffer),Read);
SHA1Update(Context,@Buffer,Read); // update the hash
until Read<> Sizeof(Buffer);
SHA1Final(Context,Digest); // produce the final hash
CloseFile(Source);
end;

procedure TForm1.EncrytpClick(Sender: TObject);
var
KeyData: TTwofishData; // the initialized key data
Digest: TSHA1Digest;
IV: array[0..15] of byte; // the initialization vector needed for
//chaining modes
Buffer: array[0..8191] of byte;
Source,source2: file;
i, j, n: integer;
Key: string;
NumRead, NumWritten: Integer;

begin
Key:= edit2.Text; //you wrote the password in edit2
_HashString(Key,Digest);
TwofishInit(KeyData,@Digest,Sizeof(Digest),nil); // initialize the
// key data using a hash of the key
FillChar(IV,Sizeof(IV),0); // make the IV all zeros
TwofishEncryptCBC(KeyData,@IV,@IV); // encrypt the IV to
// get a 'random' IV
Move(IV,KeyData.InitBlock,Sizeof(KeyData.InitBlock )); // move the
// IV into the keydata so can use chaining
TwofishReset(KeyData); // reset the keydata so
// it uses the new IV
AssignFile(Source, edit1.Text); // file to encrypt in edit1
try
Reset(Source,1);
except
TwofishBurn(KeyData); // get rid of the data in memory
MessageDlg('File cannot be opened...', mtInformation, [mbOK], 0);
Edit2.text:='00000000000000000000000000000000';
Edit2.text:='';
Exit;
end;

repeat
n:= FilePos(Source);
BlockRead(Source,Buffer,Sizeof(Buffer),i);
for j:= 1 to (i div 16) do // 16 is the blocksize of Twofish
// so process in 16 byte blocks
TwofishEncryptCBC(KeyData,@Buffer[(j-1)*Sizeof(IV)], //encrypt!
@Buffer[(j-1)*Sizeof(IV)]);

if (i mod 16)<> 0 then // encrypt the last bytes that don't
// fit in to a full block
begin
Move(KeyData.LastBlock,IV,Sizeof(IV));
TwofishEncryptCBC(KeyData,@IV,@IV); // encrypt the full block
// again (so that it is encrypted twice)
for j:= 1 to (i mod 16) do
// xor this encrypted block with the short block
Buffer[(i and not 15)+j]:= Buffer[(i and not 15)+j] xor IV[j];
end;
Seek(Source,n);
BlockWrite(Source,Buffer,i); // write out the buffer to the file
until i<> Sizeof(Buffer);

CloseFile(Source);
TwofishBurn(KeyData); //get rid of data
Edit2.text:='00000000000000000000000000000000';
Edit2.text:='';
Edit1.text:='';
MessageDlg('All done. File Encrypted with the same name as the ' +
'original.', mtInformation,[mbOK],0);
end;




براي Decrypt كردن رشته يا فايل :


// produces a hash of a string
procedure _HashString(s: string; var Digest: TSHA1Digest);
var
Context: TSHA1Context; // record to store intermediate
// data
begin
SHA1Init(Context); // initialize the data record
SHA1Update(Context,@S[1],Length(S)); // update the data record with
// the string
SHA1Final(Context,Digest); // produce the final hash
end;


procedure TForm1.DecryptClick(Sender: TObject);
var
KeyData: TTwofishData; // the initialized key data
Digest: TSHA1Digest;
IV: array[0..15] of byte; // the initialization vector needed for
//chaining modes
Buffer: array[0..8191] of byte;
Source,source2: file;
i, j, n: integer;
Key: string;
NumRead, NumWritten: Integer;

begin
Key:= edit2.Text; //you wrote the password in edit2
_HashString(Key,Digest);
TwofishInit(KeyData,@Digest,Sizeof(Digest),nil); // initialize the
// key data using a hash of the key
FillChar(IV,Sizeof(IV),0); // make the IV all zeros
TwofishEncryptCBC(KeyData,@IV,@IV); // encrypt the IV to
// get a 'random' IV
Move(IV,KeyData.InitBlock,Sizeof(KeyData.InitBlock )); // move the
// IV into the keydata so can use chaining
TwofishReset(KeyData); // reset the keydata so
// it uses the new IV
AssignFile(Source, edit1.Text); // file to encrypt in edit1
try
Reset(Source,1);
except
TwofishBurn(KeyData); // get rid of the data in memory
MessageDlg('File cannot be opened...', mtInformation, [mbOK], 0);
Edit2.text:='00000000000000000000000000000000';
Edit2.text:='';
Exit;
end;

repeat
n:= FilePos(Source);
BlockRead(Source,Buffer,Sizeof(Buffer),i);
for j:= 1 to (i div 16) do // 16 is the blocksize of Twofish
// so process in 16 byte blocks
TwofishDecryptCBC(KeyData,@Buffer[(j-1)*Sizeof(IV)], // Decrypt
@Buffer[(j-1)*Sizeof(IV)]);

if (i mod 16)<> 0 then // encrypt the last bytes that don't
// fit in to a full block
begin
Move(KeyData.LastBlock,IV,Sizeof(IV));
TwofishEncryptCBC(KeyData,@IV,@IV); // encrypt the full block
// again (so that it is encrypted twice)
for j:= 1 to (i mod 16) do
// xor this encrypted block with the short block
Buffer[(i and not 15)+j]:= Buffer[(i and not 15)+j] xor IV[j];
end;
Seek(Source,n);
BlockWrite(Source,Buffer,i); // write out the buffer to the file
until i<> Sizeof(Buffer);

CloseFile(Source);
TwofishBurn(KeyData); //get rid of data
Edit2.text:='00000000000000000000000000000000';
Edit2.text:='';
Edit1.text:='';
MessageDlg('All done. File Decrypted with the same name as the ' +
'original.', mtInformation,[mbOK],0);
end;





براي Hash نمودن رشته يا فايل :



procedure TForm1.HashClick(Sender: TObject);
var
Digest: TSHA1Digest; // binary form of the hash
i: integer;
begin
if Edit1.Text='' then exit; // make sure we have a file to hash
_HashFile(Edit1.Text,Digest); // calculate the hash
// and store in Digest
if radiohex.ItemIndex=0 then // we want to show the
// hash in hexadecimal
begin
Edit3.Text:= '0x';
for i:= 0 to (Sizeof(Digest)-1) do
Edit3.Text:= Edit3.Text+IntToHex(Digest[i],2); // convert Digest
// to a hexadecimal string
end
else // in base64
begin
Edit3.Text:= '';
for i:= 0 to (Sizeof(Digest)-1) do
Edit3.Text:= Edit3.Text+chr(Digest[i]); // convert Digest to a
// base64
Edit3.Text:=B64Encode(Edit3.Text);
end;
end;


اميد است مورد استفاده قرار بگيريد

دنیای دلفی
جمعه 27 اردیبهشت 1387, 16:45 عصر
اين مقاله يكي از كاملترين و جامع ترين مطالبي را كه شما در هنگام برنامه نويسي بايد رعايت كنيد . تا كار كركرها را در نفوذ به برنامه هاي خود مشكل و مشكل تر نمائيد .





How to make cracking your app a little bit harder...
More tips you might take into consideration...
Advanced tips given by Assembler freaks...
Special on Delphi reverse engineering...
Some notes on registration numbers...
Some notes on timebombs...
How to find cracks for your apps...
What to do if you found a crack for your app...
Facts and Myths about Software pirating...
Thoughts and letters from crackers
Links of interest...
Visitor comments...



عناوين مطالب در بالا آورده شده است :

بيش از 30 صفحه مطالب مفيد و كارآمد . . .
اميد وارم كه استفاده كامل را ببريد .

زبان اصلي

joker
جمعه 27 اردیبهشت 1387, 20:46 عصر
1)میشه با برنامه نویسی محلهای حساس برنامه رو چک کرد و اگر دستورات پچ شده بودن متوجه شد. فرض کنید دستور JE رو در فلان آفست و سگمنت میان و Nop می کنن.
باید راهی وجود داشته باشه که با برنامه نویسی اینو فهمید.

2)حالتی دیگه هم CRC هست. که مجموع چک سام رو با چک سام اصلی مقایسه می کنه اگه برابر نبود که یعنی فایل دستکاری شده.

3) راه بعدی هدایت کردن برنامه به Exception های مختلفه. به طوری که کرک فکر کنه اشتباهی این نقطه رو پچ کرده
از دوستان خواهشمندم در مورد 1 و 2 و 3 اگه سورسی دارن اتچ کنن تا صحبت ها جنبه عملی پیدا کنه

جواب 1-2-3
ReadProcessMemory میشه هر قسمتی از حافظه فایل اجرائی را چک کرد و دید که با چی برابره بر فرض اگه فلان آفست برابر با کد 74 نبود یعنی برنامه پچ شده و الی آخر ...
راههای دیگر کرک مثل مجیک بایتها را هم باید در این مورد نظر گرفت...
خطاهای عجیب غریب هم که ماشالا شما برنامه تون را با دلفی بنویسید خودش منبع خطاهای عجیب غریبه :)
ولی به عنوان مثال شما آدرس بازگشت را توی حافظه تغییر بده و یک WriteProcessMemory

هم از اینجا به بعد خرجش کن و هرچی دلت خواست توی حافظه بنویس ، کرکر به همچین خطاهایی برسه که هیچ وقت ندیده :)


پیوست:

میخواستم ازتون بپرسم که از این جور کد ها واسه دات نت هم دارید یا نه ؟نه متاسفانه ، من دات نت کار نکردم.

joker
شنبه 04 خرداد 1387, 22:38 عصر
یه کم سربه سر گذاشتن دیباگر olly
با LordPe تغییر بدین و نتیجه را موقع باز شدن توی Olly ببینید :)

دنیای دلفی
دوشنبه 06 خرداد 1387, 13:50 عصر
نتيجه گيري تاپيك مربوط به TLS CALLBACK :

دو روش وجود دارد يكي استفاده از DLL و روش دوم در خود برنامه :

روش اول :

مرحله اول ايجاد DLL :
کد:


library DLL_EntryPoint;

uses
SysUtils,
Windows,
Forms,
Classes,
Dialogs;
{$R *.res}

procedure book; stdcall;
begin
//Dummy

end;

procedure DLLEntryPoint(dwReason: DWORD); stdcall; //register; //stdcall;
begin
case dwReason of
DLL_THREAD_DETACH : ShowMessage('Thread Detach'); //0
DLL_PROCESS_ATTACH: //1
begin
// بررسي قفل

end;
DLL_THREAD_ATTACH : ShowMessage('Thread Attach'); //2
DLL_PROCESS_DETACH: //3
begin

// بررسي قفل
end;
end;
end;


exports
DLLEntryPoint,book;

begin
//DLLEntryPoint is specifically a Win32 and C++ implementation
//DLLProc is a pointer variable from the SYSTEM Unit (automatically included)
//The SYSTEM Unit is responsible for executing code assinged to DLLEntryPoint
DLLProc := @DLLEntryPoint; //Assign the address of DLLEntryPoint to DLLProc
DLLEntryPoint(DLL_PROCESS_ATTACH); //Indicate that the DLL is attaching to the process
end.
استفاده در برنامه اصلي :
کد:



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure book ;
stdcall; external 'Dll_EntryPoint.DLL';

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
book;
end;

end.
منتظر كد هاي شما هستم






روش دوم استفاده در خود برنامه :

B-Vedadian (http://barnamenevis.org/forum/member.php?u=4189) :

در مورد نحوه استفاده صحیح از TLS CallBack هم روش اینه:

1-تو برنامه خودت یکی با بیشتر رویه مشابه DLLEntryPoint که تو بالا نوشتی مینویسی.
2-آدرس رویه های مذکور رو به جدول TlsTable هدر فایل اجرایی اضافه میکنی.(یکی از راهاش استفاده از LordPEیه، راه بهتری رو من بلد نیستم)

با این کار بدون DLL هم همون اتفاق میافته (قبل رسیدن به Entry Point توابع مورد نظر شما اجرا میشند)

----------------------

چون خود دلفي يک Callback براي ترد اصلي داره، بهترين راه اينه که آدرس فعلي Callback رو يه جايي يادداشت کني. بعد تو پروسه DLLEntry جديدي که نوشتي بعد کارهاي اوليه، رويه قديمي(آدرسي که يادداشت کردي) رو هم صدا بزني. در نهايت تو جدول Tls بجاي آدرس قديمي، آدرس رويه خودت رو بنويس.

joker
یک شنبه 12 خرداد 1387, 22:48 عصر
از اسمش پیداست که چیه ، بنظرم خیلی جالب اومد....

Windows Anti-Debug Reference

خواستم pdfش را همینجا ضمیمه کنم که توی صفحه اتچ فایل پیغام زیر اومد :افسرده::افسرده::افسرده:
---
از اینجا مطالبشو میتونید بخونید
http://www.securityfocus.com/infocus/1893

دنیای دلفی
چهارشنبه 19 تیر 1387, 13:39 عصر
آموزش گام به گام ايجاد كرك مي جهت محافظت از كدها سطح برنامه C

من يك فرم ايجاد كردم و يك كليد روي فرم گذاشتم و دوتا پروسس بار سپس كدهاي زير را درون كليد نوشتم گذاشتم .


procedure TForm1.Button1Click(Sender: TObject);
var
i:Byte;
begin

ProgressBar1.Max:=10;
ProgressBar2.Max:=10;
for i :=1 to 10 do
begin
ProgressBar1.Position:=i;
ProgressBar2.Position:=i;
Sleep(100);
end;
ProgressBar1.Position:=0;
ProgressBar2.Position:=0;

end;
سپس يك تابع نوشتم كه بتواند در حافظه بعد از اجرا كدهاي مورد نظرم را بنويسد به صورت زير:


procedure WriteCurrectDataToAddress(Address : Longint;B:Integer;NameBuf:PChar);
var
BytesToWrite :Integer;
BytesWrite : cardinal;
window , ProcessId : integer;
HandleWindow : cardinal;
begin
BytesToWrite :=B;
Window := FindWindow(nil, PChar('crack me'));
GetWindowThreadProcessId(Window,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);

WriteProcessMemory(HandleWindow, ptr(Address), NameBuf ,
BytesToWrite, BytesWrite);
CloseHandle(HandleWindow);
end;اين تابع همانطور كه مشاهده مي شود داراي سه ورودي است آدرسي كه بايد از آنجا شروع به نوشتن كند . تعداد بايتهايي كه بايد بنويسد و مهم تر از همه اطلاعاتي كه بايد بنويسد .

بعد برنامه را كامپايل كردم و فايل اجرايي را ساختم سپس به وسيله برنامه بسيار بسيار قدرتمند PE Explorer فايل اجرايي را باز و كدهاي اسمبلي مربوط به درون كليد را پيدا كردم
در اصل كدهاي دلفي به صورت زير بود .




ProgressBar1.Max:=10;
ProgressBar2.Max:=10;
for i :=1 to 10 do
begin
ProgressBar1.Position:=i;
ProgressBar2.Position:=i;
Sleep(100);
end;
ProgressBar1.Position:=0;
ProgressBar2.Position:=0;
من معال كدهاي بالا را از اسمبلي به Hex در آوردم كه خود PE Explorer اين كار را انجام مي داد.

كدها به صورت زير شدند .


BA0A0000008B86FC020000E84577FDFFB3018BFB81E7FF0000 008BD78B86
F8020000E83E77FDFF8BD78B86FC020000E83177FDFF6A64E8 B2DA
FBFF4380FB0B75D133D28B86F8020000E81777FDFF33D28B86 F
C020000E80A77FDFFاين كدها و قتي به زبان ماشين ترجمه شوند به معادل دلفي كه در بالا ديديد تبديل مي شوند.

حالا تابعي نوشتم كه بتواند كدهاي هگز را به زبان ماشين ترجمه كند .
به صورت زير :


function MainData:PChar;
var
i:integer;
Str,Data:String;
begin
Str:=
'BA0A0000008B86FC020000E84577FDFFB3018BFB81E7FF000 0008BD
78B86F8020000E83E77FDFF8BD78B86FC020000E83177FDFF6 A64E8B
2DAFBFF4380FB0B75D133D28B86F8020000E81777FDFF33D28 B86
FC020000E80A77FDFF';
Data:='';
i:=1;
while i<=Length(Str) do
begin
Data:=Data+Char(StrToInt('$'+Str[i]+Str[i+1]));
i:=i+2;
end;
Result:=PChar(Data);
end;
در بالاي برنامه هم آدرس شروع و تعداد بايتهايي را كه قرار است در حافظه نوشته شود را به صورت ثابت تعريف كردم :


const
add=$44E94B;
b=91;
بعد يك خط به كدهاي درون كليد در ابتدا اضافه كردم تا به شكل زير در آمد :


procedure TForm1.Button1Click(Sender: TObject);
var
i:Byte;
begin
WriteCurrectDataToAddress(add,b,MainData);

ProgressBar1.Max:=10;
ProgressBar2.Max:=10;
for i :=1 to 10 do
begin
ProgressBar1.Position:=i;
ProgressBar2.Position:=i;
Sleep(100);
end;
ProgressBar1.Position:=0;
ProgressBar2.Position:=0;

end;

اين خط WriteCurrectDataToAddress(add,b,MainData); باعث مي شود كه اطلاعات صحيح در آدرس مشخص شده نوشته شود اصطلاحا برنامه نويسي ثابت RunTime.

با استفاده از نرم افزار بسيار قدرتمند OlyDBG فايل كامپايل شده را باز كردم و كدهاي مربوط به كليد را پيدا كردم و همه را NOP كردم يعني اينوجوري .


909090909090909090909090909090909090909090
9090909090909090909090909090909090909090909
0909090909090909090909090909090909090909090
90909090909090909090909090
9090909090909090909090909090

حالا فايلم به صورتي در آمده كه اگر روي كليد كليك كنيد هيچ اتفاقي نمي افتد يا به زبان ساده تر كدي وجود ندارد كه اجرا شود.

حالا يك تابع نوشتم كه بعد از اجراي صحيح برنامه اطلاعات را دوباره NOP تبديل كند :


function MainData1:PChar;
var
i:integer;
Str,Data:String;
begin
Str:=
'909090909090909090909090909090909
0909090909090909090909090909090909090909090
90909090909090909090909090909090909090909090
9090909090909090909090909090909090909
0909090909090909090909090';
Data:='';
i:=1;
while i<=Length(Str) do
begin
Data:=Data+Char(StrToInt('$'+Str[i]+Str[i+1]));
i:=i+2;
end;
Result:=PChar(Data);
end;
حالا اين خط را به انتهاي فرامين كليدم اضافه كردم و فارمين كليد به شكل زير درآمد :


procedure TForm1.Button1Click(Sender: TObject);
var
i:Byte;
begin
WriteCurrectDataToAddress(add,b,MainData);

ProgressBar1.Max:=10;
ProgressBar2.Max:=10;
for i :=1 to 10 do
begin
ProgressBar1.Position:=i;
ProgressBar2.Position:=i;
Sleep(100);
end;
ProgressBar1.Position:=0;
ProgressBar2.Position:=0;

WriteCurrectDataToAddress(add,b,MainData1);

end;هدف از اضافه كدن اين كد WriteCurrectDataToAddress(add,b,MainData1); اين است كه اطلاعات حذف شده را دوباره بعد از ترميم شدن حذف كند .

حالا وقتي روي كليد كليك مي كند اطلاعات حذف شده بازسازي مي شوند و سپس بعد از اجرا دوباره حذف مي شوند .
اين برنامه كاملا ايده اش از خودم بود و هدفم اين بود امكان استفاده از لودر را منتفي كنم مي دونم الان يكي با لودر كركش مي كنه :عصبانی++:

منتظر مقالات بعدي و كدهاي مفيد من باشيد

دنیای دلفی
پنج شنبه 20 تیر 1387, 23:33 عصر
اين فايل يك مقاله خوب و ايده هاي مناسبي را در خصوص روشهاي قفل گذاري و آنتي ديباگ كردن نرم افزارها آموزش مي دهد .

براي آشنايي با اصول مقدماتي حتما دانلود كنيد .

اين مطالب از بخش آموزش قفل منشور سيمين ميباشد .
اميد است مورد استفاده قرار گيريد .

دنیای دلفی
یک شنبه 30 تیر 1387, 15:14 عصر
همانطو كه در دو پست قبلي ديديد نحوه ساختن يك كرك مي را ديديد حالا مي خواهيم نحوه كرك كردن آن را نيز آموزش دهيم : (با تشكر ويژه از آقاي افشين زوار)

اول برنامه رو با PEid باز میکنیم، این برنامه واسه فهمیدن زبان یا پکر مورد استفاده، خیلی کاربرد داره.
PEid میگه که زبان مورد استفاده Borland Delphi 6.0 - 7.0 بوده بعلاوه یکسری توضیحات دیگه که فعلا کاری باهاشون نداریم.
من تقریباهمیشه وقتی به برنامه ای که با Delphi نوشته شده باشه برخورد کنم اون رو با PE Explorer باز میکنم و Disassemble میکنم... یه تب داره به اسم VCL Methods که Event های مورد استفاده برنامه رو نشون میده...
آدرس0044E920 رو یادداشت میکنیم. حالا برنامه رو با Ollydbg باز میکنیم و کلید Gtrl+G رو میزنیم و آدرس 0044E920 رو که از قبل بدست آوردیم تایپ میکنیم... اینکار ما رو مستقیما به آدرس مورد نظر میبره... حالا یک بار کلید F2 رو میزنیم تا یه BreakPoint گذاشته بشه.




0044E920 PUSH EBX ; buttonClick
0044E921 PUSH ESI
0044E922 PUSH EDI
0044E923 MOV ESI, EAX
0044E925 CALL Project1.0044E5A8 ;function MainData
0044E92A MOV ECX, EAX
0044E92C MOV EDX, 5B
0044E931 MOV EAX, Project1.0044E94B
0044E936 CALL Project1.0044E54C ;WriteCurrectDataToAddreses
0044E93B MOV EDX, 0A
0044E940 MOV EAX, DWORD PTR DS:[ESI+2F8]
0044E946 CALL Project1.004260A0
...
0044E9A6 CALL Project1.0044E764 ; Function MainData1
0044E9AB MOV ECX, EAX
0044E9AD MOV EDX, 5B
0044E9B2 MOV EAX, Project1.0044E94B
0044E9B7 CALL Project1.0044E54C ;WriteCurrectDataToAddreses

یکبار F9 رو بزنین تا برنامه اجرا بشه... بلافاصله بعد از کلیک، به همون BreakPoint میرسین حالا اگه با F7 خط به خط برنامه رو Trace کنین، به همون توضیحات "دنیای دلفی" میرسین؛ واسه همین اسم توابع مورد نیاز رو جلوشون نوشتم.
همونوطور که مهران گفت، کافیه رشتهBA0A00 رو که برنامه همیشه در آدرس0044E94B مینویسه رو در برنامه درج کنیم و بعد دو تابعی که MainData و MainData1 رو می نویسن رو ناتوان کنیم. (اگه با MainData کار نداشته باشیم، تغییراتمون بی تاثیر میشن و اگه با MainData1 کاری نداشته باشیم، تغییرات NOP میشن)

همین طور که دارید F7 رو میزنین به این خطوط می رسین



0044E54C 53 PUSH EBX
0044E54D |. 56 PUSH ESI
0044E54E |. 57 PUSH EDI
0044E54F |. 55 PUSH EBP
0044E550 |. 83C4 F8 ADD ESP, -8
0044E553 |. 8BE9 MOV EBP, ECX
0044E555 |. 8BF8 MOV EDI, EAX
0044E557 |. 8BF2 MOV ESI, EDX
0044E559 |. 68 9CE54400 PUSH Project1.0044E59C ; /Title = "crack me"
0044E55E |. 6A 00 PUSH 0 ; |Class = 0
0044E560 |. E8 5F7DFBFF CALL <JMP.&user32.FindWindowA> ; \FindWindowA
0044E565 |. 8D5424 04 LEA EDX, DWORD PTR SS:[ESP+4]
0044E569 |. 52 PUSH EDX ; /pProcessID
0044E56A |. 50 PUSH EAX ; |hWnd
0044E56B |. E8 BC7EFBFF CALL <JMP.&user32.GetWindowThreadProc>; \GetWindowThreadProcessId
0044E570 |. 8B4424 04 MOV EAX, DWORD PTR SS:[ESP+4]
0044E574 |. 50 PUSH EAX ; /ProcessId
0044E575 |. 6A 00 PUSH 0 ; |Inheritable = FALSE
0044E577 |. 68 FF0F1F00 PUSH 1F0FFF ; |Access = PROCESS_ALL_ACCESS
0044E57C |. E8 DB79FBFF CALL <JMP.&kernel32.OpenProcess> ; \OpenProcess
0044E581 |. 8BD8 MOV EBX, EAX
0044E583 |. 54 PUSH ESP ; /pBytesWritten
0044E584 |. 56 PUSH ESI ; |BytesToWrite
0044E585 |. 55 PUSH EBP ; |Buffer
0044E586 |. 57 PUSH EDI ; |Address
0044E587 |. 53 PUSH EBX ; |hProcess
0044E588 |. E8 3F7AFBFF CALL <JMP.&kernel32.WriteProcessMemor>; \WriteProcessMemory
0044E58D |. 53 PUSH EBX ; /hObject
0044E58E |. E8 4978FBFF CALL <JMP.&kernel32.CloseHandle> ; \CloseHandle
0044E593 |. 59 POP ECX
0044E594 |. 5A POP EDX
0044E595 |. 5D POP EBP
0044E596 |. 5F POP EDI
0044E597 |. 5E POP ESI
0044E598 |. 5B POP EBX
0044E599 \. C3 RETN

این آدرس همون تابع WriteCurrectDataToAddreses هست که ما رو کلافه کرده.اگه این تابع اجرا بشه می بینین که Olly خطوط بین آدرس 0044E94B تا 0044E9A5 رو با رنگ قرمز نوشته، این به این معنیه که خطوط تغییر کردن، خطوط تغییر کرده همون رشته طولانی BA0A00 هستن
olly رو ببندین و با فشار Ctrl +G به آدرس0044E54C بیاین و SpaceBar رو بزنین و عبارت Retn رو تایپ کنین. اینکار باعث میشه که تابع WriteCurrectDataToAddreses هیچوقت اجرا نشه، یعنی بلافاصله بعد از ورود، خروج کنه...! اینطوری دیگه اون و مشکلی که داشتیم رفع میشن.
حالا خطوط بین آدرس 0044E94B تا 0044E9A5 رو انتخاب کنید و Ctrl+E رو فشار بدید تا بتونیم رشته BA0A00 جایگزین NOP ها کنیم.(رشته BA0A00 رو که "دنیای دلفی" نوشته بود رو کپی و در قسمت هگز، Paste کنید)
این مشکل هم رفع شد حالا برنامه رو اگه اجرا کنین، همون دو تا ProgressBar رو نشون میده ... پس تا اینجای کارمون درست بوده... حالا باید یکی از نوارها رو غیرفعال کنیم.



0044E94B BA 0A000000 MOV EDX, 0A
0044E950 8B86 FC020000 MOV EAX, DWORD PTR DS:[ESI+2FC]
0044E956 E8 4577FDFF CALL Project1.004260A0
0044E95B B3 01 MOV BL, 1
0044E95D 8BFB MOV EDI, EBX
0044E95F 81E7 FF000000 AND EDI, 0FF
0044E965 8BD7 MOV EDX, EDI
0044E967 8B86 F8020000 MOV EAX, DWORD PTR DS:[ESI+2F8]
0044E96D E8 3E77FDFF CALL Project1.004260B0 ; progress1
0044E972 8BD7 MOV EDX, EDI
0044E974 8B86 FC020000 MOV EAX, DWORD PTR DS:[ESI+2FC]
0044E97A E8 3177FDFF CALL Project1.004260B0 ; progress2
0044E97F 6A 64 PUSH 64
0044E981 E8 B2DAFBFF CALL <JMP.&kernel32.Sleep>
0044E986 43 INC EBX
0044E987 80FB 0B CMP BL, 0B
0044E98A ^ 75 D1 JNZ SHORT Project1.0044E95D
0044E98C 33D2 XOR EDX, EDX
0044E98E 8B86 F8020000 MOV EAX, DWORD PTR DS:[ESI+2F8]
0044E994 E8 1777FDFF CALL Project1.004260B0
0044E999 33D2 XOR EDX, EDX
0044E99B 8B86 FC020000 MOV EAX, DWORD PTR DS:[ESI+2FC]
0044E9A1 E8 0A77FDFF CALL Project1.004260B0

به دلخواه یکی از دو آدرسی رو که مربوط به Progress هاست رو NOP میکنیم تا اجرا نشه.


0044E96D E8 3E77FDFF CALL Project1.004260B0 ; progress1
0044E972 8BD7 MOV EDX, EDI
0044E974 8B86 FC020000 MOV EAX, DWORD PTR DS:[ESI+2FC]
0044E97A 90 NOP ; progress2
0044E97B 90 NOP
0044E97C 90 NOP
0044E97D 90 NOP
0044E97E 90 NOP
0044E97F 6A 64 PUSH 64
0044E981 E8 B2DAFBFF CALL <JMP.&kernel32.Sleep>

حالا right-click کنید و Copy to Executable->All Modification->Copy All->Save File رو انتخاب کنین تا کلیه Patch ها، در فایل جدید ذخیره شوند.

اميد وارم كه استفاده لازم را برده باشيد .

Securebit
یک شنبه 13 مرداد 1387, 02:18 صبح
Anti BreakPoint & Hide Exit


unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure KillMe();
begin
Application.Terminate();
end;
procedure Test();
var
Msg : String;
begin
msg := 'Barnamenevis';
ShowMessage(Msg);
asm
mov eax, [ebp + 4]
mov ebx, [eax]
and ebx, $FF
sub ebx, $CC
jne @def
add eax,5
mov [ebp + 4], eax
@def:
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Test();
asm
jmp @def
nop
nop
nop
nop
call KillMe
@def:
end;
end;
end.

دنیای دلفی
شنبه 19 مرداد 1387, 14:17 عصر
سلام

اين روش براي محافظت از رمز بانك اطلاعاتي DBISAM كه درون فايل اجرايي به صورت رشته به بانك تزريق مي شود شامل دو بخش حفاظتي در فايل اجرايي و يك DLL است .
من با استفاده از يك AESٍEncrypt رمز را كد كردم . براي اين كار از يك كليد استفاده نمودم .
حالا با استفاده از اين كار يك رشته كد شده دارم و يك كليد . كه بايد در كد نويسي با استفاده از AESDecrypt آن را بوسيله كليد تبديل به رشته اصلي كنم و به بانك تزريق كنم .

من با استفاده از يك روش ابداعي هم كليد و هم رشته كد شده را نابود كردم و آنها را در زمان طراحي توليد كردم . كليد را در DLL قرار دادم و رشته كد شده را در EXE .
نحوه نابود كردن رشته كد شده و كليد به اين صورت است .

در فايل اجرايي براي رشته كد شده :


const
dbs: array [0..43] of Byte= (
$B5,$F1,$74,$49,$B1,$AF,$48,$7F,$31,$14,$36,$A7,$3 B,$51,$BB,$40,
$81,$D6,$46,$2C,$9D,$87,$BB,$E8,$ED,$CB,$BC,$B6,$1 A,$A4,$05,$CE,
$2E,$97,$E0,$E5,$4B,$B8,$44,$11,$F0,$A5,$E6,$67
);
function dcf(aBegPos, aLength: Integer): string;
var tmp: string;
i, endPos: Integer;
MyKey: word;
begin
{$I VM_Start_WithLevel.inc}
MyKey:= 63444;
SetLength(Result, aLength);
tmp:= '';
endPos:= aBegPos+ aLength -1;
for i:= aBegPos to endPos do
tmp:= tmp+ Chr(dbs);
for i:= 1 to Length(tmp) do
begin
Result[i]:= Char(Byte(tmp[i]) xor (MyKey shr 8));
MyKey:= (Byte(tmp[i])+ MyKey)* 34523+ 34623;
end;
{$I VM_End.inc}همانطور كه در بالا مي بينيد از سيستم ماشين مجازي TheMida همراه با Level استفاده كرده ام اين كار باعث مي شود كه يك پيچيدگي بسيار زيادي به كدها اعمال شود و روند تريس را بسيار كند و درهم كند .
من از Level پانزده استفاده كردم اين لول مي تواند تا 255 باشد كه يك پيچيدگي بسيار بالا و بسيار كند است .


در DLL براي كليد :


library Special;


{$R *.res}


function DBPASS:String; stdcall;
function dcf(aBegPos, aLength: Integer): string;
const
dbs: array [0..19] of Byte= (
$51,$72,$F2,$09,$24,$82,$51,$65,$C9,$5E,$CD,$23,$0 1,$B7,$3A,$CE,
$3F,$7C,$23,$43
);
var tmp: string;
i, endPos: Integer;
MyKey: word;
begin
MyKey:= 12345;
SetLength(Result, aLength);
tmp:= '';
endPos:= aBegPos+ aLength -1;
for i:= aBegPos to endPos do
tmp:= tmp+ Chr(dbs[i]);
for i:= 1 to Length(tmp) do
begin
Result[i]:= Char(Byte(tmp[i]) xor (MyKey shr 8));
MyKey:= (Byte(tmp[i])+ MyKey)* 52845+ 22719;
end;
end;

begin
{$I CodeReplace_Start.inc}
Result:=dcf(0 ,20);
{$I CodeReplace_End.inc}
end;




exports
DBPASS;

begin
end.در dll از روش جايگزيني كد نيز براي ارسال كليد استفاده شده در اين روش كد ها به يك مكان خالي حافظه در هنگام اجرا منتقل شده در حالتي بسيار امن داده پس از توليد ارسال مي شود و دوباره كدها نابود مي شوند . اين روش به اين سبك فقط مخصوص Themida است .

دوستان از آن استفاده كنيد و لذت ببريد

حالا در فايل اجرايي درون كليد اين كدها به اينصورت نوشتم :


{$I CodeReplace_Start.inc}

DBISAMSession1.AddPassword(AESDecrypt(dcf(0 ,44),DBPASS));
Table1.Open;
MessageBox(0,pchar(Table1.fieldbyname('Message').a sstring),'',0);
Application.Terminate;
{$I CodeReplace_End.inc}در انجا نيز اگر دقت كنيد از كد ريپليس استفاده شده است .

و در كل اين روش تا 80 درصد مي تواند كدهاي و رشته هاي شما از دست قوي ترين كركرها در امان بگذارد . و نهايتا كار هركسي نيست كه بتواند كدها و رمزهاي شما را پيدا كند .

[I]يا به زبان ساده تر نفراتي كه مي توانند برنامه شما را كرك كنند كمتر و كمتر خواهد شد.

امدوارم استفاده لازم را برده باشيد .

در آخر هم با TheMida پكش كردم كه هركسي تواند حتي بازش كند .

دنیای دلفی
یک شنبه 24 شهریور 1387, 00:53 صبح
راهكارهايي براي شناسايي ديباگر ها . بسيار مفيد و جالب با تشكر فراوان از جاج مجيك :



unit AntiDbg;


interface

uses Windows,SysUtils,TlHelp32;

function IsDBG:Boolean;

implementation

var
Found:Boolean=False;
hSnapmod: THANDLE;
ModInfo: MODULEENTRY32;
hSnap: THANDLE;
ProcessInfo: PROCESSENTRY32;
ProcID:DWORD;
Tm1,Tm2:Int64;

function IsDebuggerPresent():BOOL; stdcall;external 'kernel32.dll' name 'IsDebuggerPresent';

function GetSys:string;
var
Gsys : array[0..MAX_PATH] of Char;
begin
GetSystemDirectory(Gsys,MAX_PATH);
Result:=Gsys;
if length(Result)>0 then
if Result[length(Result)]<>'\' then Result:=Result+'\';
end;

function UpCaseStr(S:string):String;
var i:integer;
begin
Result:=s;
if s='' then exit;
for i:=1 to length(s) do
Result[i]:=upcase(Result[i]);
end;

function RDTSC: Int64; assembler;
asm
DB 0fh ,031h
end;

function IsRing0DBG(S:string): boolean;
var hFile: Thandle;
begin
Result := False;
hFile := CreateFileA(Pchar(S), GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
if( hFile <> INVALID_HANDLE_VALUE ) then begin
CloseHandle(hFile);
Result := TRUE;
end;
end;

function IsDBG:Boolean;
var i: Integer;
begin
Tm1:=RDTSC;
for i:=0 to 255 do
OutputDebugStringA('kernel32.dll');
Tm2:=RDTSC-Tm1;
if Tm2<9999 then Found:=True;
if Tm2>299999999 then Found:=True;
hSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS ,0);
ProcessInfo.dwSize:=sizeof(PROCESSENTRY32);
Process32First(hSnap,ProcessInfo);
repeat
if Pos('OLLYDBG',UpCaseStr(ProcessInfo.szExeFile))<>0 then Found:=True;
if Pos('DBG',UpCaseStr(ProcessInfo.szExeFile))<>0 then Found:=True;
if Pos('DEBUG',UpCaseStr(ProcessInfo.szExeFile))<>0 then Found:=True;
if Pos('IDAG',UpCaseStr(ProcessInfo.szExeFile))<>0 then Found:=True;
if Pos('W32DSM',UpCaseStr(ProcessInfo.szExeFile))<>0 then Found:=True;
ProcID:=ProcessInfo.th32ProcessID;
hSnapMod:=CreateToolhelp32Snapshot(TH32CS_SNAPMODU LE,ProcID);
ModInfo.dwSize:=sizeof(MODULEENTRY32);
Module32First(hSnapMod,ModInfo);
repeat
if Pos('DBGHELP',UpCaseStr(ModInfo.szExePath))<>0 then Found:=True;
if Pos('OLLYDBG',UpCaseStr(ModInfo.szExePath))<>0 then Found:=True;
if Pos('W32DSM',UpCaseStr(ModInfo.szExePath))<>0 then Found:=True;
until (not Module32Next(hSnapMod,ModInfo));
CloseHandle(hSnapMod);
until (not Process32Next(hSnap,ProcessInfo));
CloseHandle(hSnap);
if FileExists(GetSys+'drivers\sice.sys') then Found:=True;
if FileExists(GetSys+'drivers\ntice.sys') then Found:=True;
if FileExists(GetSys+'drivers\syser.sys') then Found:=True;
if FileExists(GetSys+'drivers\winice.sys') then Found:=True;
if FileExists(GetSys+'drivers\sice.vxd') then Found:=True;
if FileExists(GetSys+'drivers\winice.vxd') then Found:=True;
if FileExists(GetSys+'winice.vxd') then Found:=True;
if FileExists(GetSys+'vmm32\winice.vxd') then Found:=True;
if FileExists(GetSys+'sice.vxd') then Found:=True;
if FileExists(GetSys+'vmm32\sice.vxd') then Found:=True;
if IsDebuggerPresent then Found:=True;
if IsRing0DBG('\\.\SICE') then Found:=True;
if IsRing0DBG('\\.\SIWVID') then Found:=True;
if IsRing0DBG('\\.\NTICE') then Found:=True;
if IsRing0DBG('\\.\TRW') then Found:=True;
if IsRing0DBG('\\.\TWX') then Found:=True;
if IsRing0DBG('\\.\ICEEXT') then Found:=True;
Result:=Found;
end;

end.

MFiRE
یک شنبه 24 شهریور 1387, 16:04 عصر
برای کامل کردن بحث بعضی از دوستان :

برای شناساییه پیشرفته تر برنامه هایه دیباگر ، مانیتورینگ و ...

حتما تا حالا برنامه هایی که مشخصات اشیا رو می دن رو دیدین ! مثله برنامه هایی که رمزایه ستاره دار رو نمایش می دن !

نحوه ی کارکردشون :
ماوس رو رویه شیء مورد نظر می برید و بهتون اطلاعاتی در مورد شی میده ... از جمله : عنوان شی ، کلاس شی ، هندل شی و ... !

روشه کار به این صورته که گرفتن اطلاعات همیشه اتفاق بیفته (حداقل هر نیم ثانیه و حداکثر 100 میلی ثانیه کافیه) ! ما اینجا با عنوان و کلاس شی کار داریم !
مثلاً برایه شناختن پنجره ی دی اسمبلر برنامه ی ollydbg از کلاسه "ACPUASM" استفاده می کنیم !
اگر عنوان لازم بود که از اون استفاده می کنیم !
وقتی کاربر می ره سراغ برنامه هایه شیطانی ، از این روش می شه تا حدودی بعضی از برنامه ها رو شناخت.




.::Timer::.
.
Detector "process"
Detector "pe"
Detector "task"
.
.
.


همین !

سورسایه زیادی در این مورد پیدا می شه که می شه اونا رو به دلخواه تغییر داد.

Developer Programmer
سه شنبه 07 آبان 1387, 08:11 صبح
تقریبا همه پروتکتورهای قوی مثل Armadillo از تکنیک API Redirection استفاده می کنن
شاید بد نباشه شما هم یه پروتکتور شخصی با قابلیت Api redirection بنویسین و اونرو داخل Import Table فایل پنهان کنین.

Developer Programmer
سه شنبه 07 آبان 1387, 12:18 عصر
اغلب پکر و پروتکتورها، به زبان تلخ C نوشته میشن... اما AHPacker یه Packer که به زبان شیرین دلفی 7 نوشته شده.
اینم سورسش

Developer Programmer
سه شنبه 07 آبان 1387, 12:26 عصر
مقاله peter ferrie در مورد روشهای جلوگیری از آنپک کردن برنامه.

joker
پنج شنبه 30 آبان 1387, 01:08 صبح
یک قسمتهایی از روتینهای پروتکتور سابقم که مدتیه به خاطر افزایش کالیبر نمیرسم تکمیلش کنم



asm
cmp esi,-1
jne @OllyNotfound
push 10h
ADD eax,34354510h
push 310h
POP EAX
ADD eax,43524510h
push 3232510h
ADD eax,54510h
call EBX
@OllyNotfound:
end;// end of ASM




function enumwindowsproc( wnd:Hwnd ):boolean;export; {$ifdef win32} stdcall ;{$endif}
var
buffer : array[0..250] of char ;
HREG :HWND;
Stemp:string;
begin
Stemp :='';

getwindowtext( wnd,buffer,100);
if strlen(buffer)<> 0 then

STemp := strpas(buffer);
if POS('main thread',Stemp)<> 0 then
begin
HREG := FindWindow(nil,Pchar(Stemp));
if hREG<>0 then PostMessage(hReg,WM_CLOSE,0,0);
end;

STemp := strpas(buffer);
if POS('Dbg',Stemp)<> 0 then
begin
HREG := FindWindow(nil,Pchar(Stemp));
if hREG<>0 then PostMessage(hReg,WM_CLOSE,0,0);
end;

if POS('Olly',Stemp)<> 0 then
begin
HREG := FindWindow(nil,Pchar(Stemp));
if hREG<>0 then PostMessage(hReg,WM_CLOSE,0,0);
end;

if POS('yoda',Stemp)<> 0 then
begin
HREG := FindWindow(nil,Pchar(Stemp));
if hREG<>0 then PostMessage(hReg,WM_CLOSE,0,0);
end;


if POS('Import',Stemp)<> 0 then
begin
HREG := FindWindow(nil,Pchar(Stemp));
if hREG<>0 then PostMessage(hReg,WM_CLOSE,0,0);
end;

STemp := strpas(buffer);
if POS('[CPU]',Stemp)<> 0 then
begin
HREG := FindWindow(nil,pChar(Stemp));
if hREG<>0 then PostMessage(hReg,WM_CLOSE,0,0);
BLOK_KEY;
end;
STemp := strpas(buffer);
if POS('Region',Stemp)<> 0 then
begin
HREG := FindWindow(nil,pChar(Stemp));
if hREG<>0 then PostMessage(hReg,WM_CLOSE,0,0);
BLOK_KEY;
end;

STemp := strpas(buffer);
if POS('DeDe',Stemp)<> 0 then
begin
HREG := FindWindow(nil,pChar(Stemp));
if hREG<>0 then PostMessage(hReg,WM_CLOSE,0,0);
BLOK_KEY;
Sleep(50);
BLOK_KEY;

HREG := FindWindow(nil,pChar('confirm'));
if hREG<>0 then PostMessage(hReg,WM_CLOSE,0,0);
BLOK_KEY;
end;


result := true ;
end;


enumwindows(@enumwindowsproc,longint(self));




Procedure DBGDetect();
var
x:byte;
begin
asm
call GetTickCount
xchg ebx, eax
call GetTickCount
sub eax, ebx
cmp eax, 1
jnb @being_debugged
mov x,0
jmp @eend
@being_debugged:
mov x,1
@eend:
end;
if x=1 then
begin
//ShowMessage('Debugger Detected');
Halt;
end
else
end;
//--------------

Naruto
چهارشنبه 02 بهمن 1387, 21:40 عصر
سلام.

IsDebuggerPresent به روایت اسمبلی :





Procedure IsDebuggerPresent;
Begin
Asm
call @@Check
test eax,eax
jnz @@Detected
call @@ExitBlock
@@Check:
mov eax, large fs:18h
mov eax, [eax+30h]
movzx eax, byte ptr [eax+2]
retn
@@Detected:
jmp @@ExitApp
@@ExitApp:
call ExitProcess
@@ExitBlock:
NOP
end;
End;

smart_boy
شنبه 03 اسفند 1387, 18:20 عصر
این هم یک سورس VB برای تابع IsDebuggerPresent

bighellish
شنبه 22 فروردین 1388, 15:16 عصر
سلام
من تازه عضو این سایت شدم و طریق محافظت از فایل اجرایی برنامه هام رو نمیدونم
میشه نحوه استفاده از این کدخا رو بهم بگین؟؟؟
چطوری استفاده میشن؟

[لطفا در این تاپیک سوال نکنید و آنها را در یک موضوع جدید بپرسید،بزودی از این موضوع حذف خواهد شد]

Nima NT
شنبه 22 فروردین 1388, 21:14 عصر
بهتره یه تاپیک جدید ایجاد کنید و اونجا بحث رو ادامه بدید.

دنیای دلفی
جمعه 28 فروردین 1388, 14:10 عصر
يك سري مطالب و مقاله بسيار جالب در خصوص ADS حالشو ببريد

The Dark Side Of NTFS

Introduction
Microsoft platforms continue to proliferate and multiply. Corporate server and desktop systems are running Windows NT (NT) and Windows 2000 (2K), while home user and student systems are running Windows XP (XP). These platforms are extremely popular, and in widespread use. However, very little is known by the administrators and users of these systems about a feature of the NTFS file system called 'alternate data streams'.
NTFS is the preferred file system due to its stability, functionality, and the level of security it provides. NTFS alternate data streams (ADSs) are provided for compatibility with the Macintosh Hierarchical File System (HFS), which uses resource forks to maintain information associated with a file, such as icons, etc (RUSS00). While Microsoft provides a means for creating specific ADSs via Windows Explorer, the necessary tools and functionality for detecting the presence of arbitrary ADSs is conspicuously absent. Oddly enough, the operating systems have the necessary native functionality and tools to allow a user to create ADSs and to execute code hidden within those streams. Microsoft KnowledgeBase article Q101353 (http://support.microsoft.com/default.aspx?scid=kb;EN-US;q101353) acknowledges the fact that the Win32 base API supports ADSs inconsistently.
The purpose of this paper is to describe in detail how ADSs are created and manipulated, and how code hidden in ADSs can be executed. Specific differences in the treatment of ADSs by NT, 2K, and XP will be noted.

Creating ADSs
The syntax used to create ADSs is relatively simple and straightforward. To create an ADS associated with the file 'myfile.txt', simply separate the default stream name from the ADS name with a colon.



c:\ads>echo This is an ADS > myfile.txt:hidden
Additionally, an ADS can be created using the contents of another file.


c:\ads>echo This is a test file > test.txt
c:\ads>type test.txt > myfile.txt:hidden
The ADS can then be verified using Notepad.

c:\ads>notepad myfile.txt:hiddenHowever, none of the variations of the ‘dir’ command nor any available switches or settings for Windows Explorer will detect the presence of this newly created ADS.
Additionally, ADSs can be created and associated with the directory listing, rather than a file. This peculiarity will take on some significance later in this article, but for now it’s sufficient to describe how such ADSs can be created.

c:\ads>echo This ADS is tied to the directory listing > :hidden ADSs of this type can be created with Notepad and the ‘type’ command, as well.
The content of ADSs should not be considered limited to simply text data. Any stream of binary information can constitute a file, and the ADS is nothing more than a file. Executables can be hidden in ADSs quite easily.

c:\ads>type c:\winnt\notepad.exe > myfile.txt:np.exe
c:\ads>type c:\winnt\system32\sol.exe > myfile.txt:sol2.exe
Similarly, image files, audio files, or any other stream of data can be hidden in ADSs.
Finally, Windows Explorer provides a means by which very specific ADSs can be created (RUSS00). If the user opens Explorer and chooses a file, and then right-clicks on that file, a drop-down menu appears. Choosing 'Properties' will open a Properties dialogue, and choosing the Summary tab (see Fig. 1) will reveal fields in which the user can insert information.


http://www.infosecwriters.com/text_resources/altdata_streams_files/Image1.gif



Figure 1: Summary Tab of Properties Dialogue



ADSs have no attributes of their own, per se. The access rights assigned to the default unnamed stream control access for creating or viewing ADSs. Quite simply, if a user cannot write to a file, that user cannot add an ADS to that file. Further, while Windows File Protection prevents the replacement of protected system files, it does not prevent a user with the appropriate permissions from adding ADSs to those system files. The System File Checker (sfc.exe) will verify that protected system files have not been overwritten, but will not detect ADSs.
Users and administrators should also be aware of KB article Q319300 (http://support.microsoft.com/default.aspx?scid=kb;EN-US;q319300) , which states that the Windows 2000 Content Indexing Server adds alternate data streams named '?Q30lsldxJoudresxAssqpcawXc' to image files on NTFS volumes. These ADSs contain thumbnails of the images.

Detecting, Viewing, and Manipulating ADSs
As previously stated, Microsoft provides no tools or utilities either within the operating system software distribution or the Resource Kits for detecting the presence of ADSs. One of the best tools available for this is lads.exe, written by Frank Heyne (http://www.heysoft.de/) . Lads.exe is currently available as version 3.01, and does an excellent job of reporting the availability of ADSs. For administrators used to working with graphical tools, lads.exe is a command line interface (CLI) tool that reports its findings to the screen (i.e., standard output or STDOUT). Figure 2 shows an example lads.exe output, run against the test directory, c:\ads.



http://www.infosecwriters.com/text_resources/altdata_streams_files/Image2.gif


Figure 2: LADS Output for c:\ads



Figure 2 shows just how useful lads.exe can be. Not only does the utility report the presence of ADSs, but it also reports the full path and size for each ADS. Particular note should be taken of the three of the ADSs associated with myfile.txt. Two begin with an ASCII character resembling the spade from a playing card, and the third is a long series of numbers and letters between two curly braces. These are the ADSs that were associated with the file using the Summary tab of the Properties dialogue (fig. 1).
Once an ADS is detected, what can be done to view its contents? Notepad is a very handy utility for viewing files, and can be used for viewing the contents of ADSs. However, there is a catch. For example, the following command produces unexpected results:

c:\ads>notepad myfile.txt:hidden When this command is executed, Notepad opens and asks if the user wishes to create a new file. This is an unusual request, because the ADS was created earlier. In order to observe the expected results enter the following commands:

c:\ads>echo This is another ADS > myfile.txt:hidden.txt
c:\ads>notepad myfile.txt:hidden.txt
The same effects can be observed when the ADS is associated the directory listing, as in ':hidden.txt'. The addition of the extension on the end of the filename allows the ADS to be opened in Notepad. This will also work for other ADSs, such as:

c:\ads>notepad myfile.txt:np.exe ADSs are a feature of the NTFS file system, so if a file with an ADS is moved to a disparate file system, such as FAT, FAT32, or ext2, the ADS is removed, as it is not supported on these other file systems. ADSs are preserved if the default unnamed stream (i.e., myfile.txt from the previous examples) is copied or moved across NTFS partitions, or even to a mapped NTFS drive. This can be accomplished using the ‘copy’ or ‘move’ commands, as appropriate.
Removing all ADSs from a default stream is relatively simple, using the following commands:

c:\ads>type myfile.txt > myfile.bat
c:\ads>del myfile.txt
c:\ads>ren myfile.bat myfile.txt
Using LADS, it is easy to verify that all ADS created in the above examples have vanished.

Executing ADSs
In previous examples, executables were hidden in ADSs. This information seems fairly useless unless the executables themselves can be launched, without the overhead of having to copy them out of the ADS first. In fact, the ‘start’ command can be used to do just that. Since the executables hidden earlier were deleted, rerunning the commands will serve the purpose of an example. Using the ‘type’ command, hide Notepad and Solitaire in ADSs associated with myfile.txt.
On NT, a simple command will launch either executable (MCCL99):

c:\ads>start myfile.txt:np.exe
c:\ads>start myfile.txt:sol2.exe
However, these commands generate an error on 2K. From the error message, it appears as if the information pointing to the executable wasn’t sufficient. Therefore, either absolute or relative paths should suffice, and running either of the following commands will demonstrate this:

c:\ads>start c:\ads\myfile.txt:np.exe
c:\ads>start .\myfile.txt:np.exe
An interesting item to note is how the process appears while running. For example, running pslist.exe from SysInternals after executing either of the above two commands displays a process called 'myfile.txt' running with a PID of 1512, as shown in figure 3.



http://www.infosecwriters.com/text_resources/altdata_streams_files/Image3.gif


Figure 3: Process listing using pslist.exe


Figure 4 shows the process running in the Process tab of the TaskManager.


http://www.infosecwriters.com/text_resources/altdata_streams_files/Image4.gif
Figure 4: Process Tab of 2K Task Manager


Oddly enough, the Process tab on 2K shows that PID 1512 has an Image Name of 'myfile.txt'. Figure 5 shows the Application tab of the Task Manager.


http://www.infosecwriters.com/text_resources/altdata_streams_files/Image5.gif



Figure 5: Applications Tab of 2K Task Manager




Figure 6 shows that the Process tab of the Task Manager on XP displays when the same command is executed on that operating system.


http://www.infosecwriters.com/text_resources/altdata_streams_files/Image6.jpg
Figure 6: Process Tab of XP Task Manager


Figure 6: Process Tab of XP Task Manager Finally, obtaining information about the process with listdlls.exe from SysInternals will display 'c:\ads\myfile.txt:np.exe' as the command line for the above command (see fig. 7), on both 2K and XP.


http://www.infosecwriters.com/text_resources/altdata_streams_files/Image7.gif



Figure 7: Output of listdlls.exe on 2K



An alternative method for launching hidden executables on 2K is a shortcut (KASP01). To demonstrate the point, create a shortcut on the desktop. The location of the item for this shortcut should be 'c:\ads\myfile.txt'. Once the shortcut has been created, observe the icon on the desktop. Assuming the ADS for Solitaire was created, edit the Properties of the shortcut so that the target now refers to 'c:\ads\myfile.txt:sol2.exe'. Wait a few seconds and observe any changes to the icon. Launch the executable by double-clicking the icon.

Interestingly enough, as similar technique works by adding an entry to the Windows Startup Folder (KASP01) or to the ‘Run’ key in the Registry (KASP01). The full path to the key is:


HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Curr entVersion\RunSpecifying the complete path to the hidden executable will guarantee that it is launched the next time the system is started.

Yet another method for launching executables hidden in ADSs is via the ‘Run’ box in the Start menu (KASP01). Clicking on the Start button, then 'Run', and typing the following command will launch the Solitaire ADS:


file:///c:/ads/myfile.txt:sol2.exeFor administrators using Perl (http://www.activestate.com/) , the Perl interpreter handles ADSs quite easily. For example, the following lines of Perl code make use of backticks to launch an ADS:



my $file = 'c:\ads\myfile.txt:sol2.exe';

`$file`;


Save the above code as ‘ads.pl’, and execute the code by typing:


c:\perl>ads.plAs an interesting variation, the following code also works:



c:\perl>type ads.pl > myfile.txt:ads.pl

c:\perl>perl myfile.txt:ads.pl


The Windows Scripting Host (WSH) began shipping with 2K and presents some interesting possibilities with regards to ADSs (KASP01). This is particularly important because WSH is native to the 2K and XP distributions, while Perl must be installed separately. To demonstrate the capabilities of WSH, type the following command:


c:\ads>echo MsgBox 'VBS file to test ADSs' > ads.vbsTo execute the script using WSH, type:


c:\ads>wscript ads.vbsAlternatively, type:


c:\ads>cscript ads.vbsOr, simply double-click the file in Windows Explorer. All three of these methods will run the VBScript code. Now type the following commands:



c:\ads>type ads.vbs > myfile.txt:ads.vbs

c:\ads>wscript myfile.txt:ads.vbs


Or:


c:\ads>start .\myfile.txt:ads.vbsCscript.exe also runs the script. Alternatively, the shortcut and Run box methods mentioned above also run the script (KASP01).


The Really, Really Dark Side

If the script hidden in an ADS ends with a different extension (i.e., other than '.vbs'), WSH has trouble recognizing the type of file, and will complain that an engine for executing the file cannot be found. For example:



c:\ads>type ads.vbs > myfile.txt:ads.txt

c:\ads>wscript myfile.txt:ads.txt


Executing the second command above results in the error described. However, both wscript.exe and cscript.exe have switches that allow the administrator to control the execution of the program. The command syntax can be seen by typing:


c:\ads>wscript /?The '//E' switch allows the user to specify an engine to be used. The new command looks like:


c:\ads>wscript //E:vbs myfile.txt:ads.txtThis provides some interesting opportunities for malicious use. For example, the earlier example of ADSs produced via Windows Explorer (i.e., the Summary tab of the Properties dialogue for a file) produced on ADS with the name '♣SummaryInformation'. Code, such as VBScript, can be created and written to an ADS with the same name, and then launched. The following Perl code illustrates this:


my $file = 'c:\\ads\\myfile.txt:'.chr(5).'SummaryInformation' ;

my $src = 'c:\ads\ads.vbs';

`type $src > $file`;

`wscript //E:vbs $file`;




The final command in the script is the one of interest. For both wscript.exe and cscript.exe, the '//E' switch forces the application to use a particular script engine. In this case, the ADS containing the script to be launched has no file extension, so the scripting host has no means for determining the scripting engine to be used. This example could also apply quite easily to ADSs created by the Content Indexing Server, as mentioned above.


Conclusion

ADSs are a feature of the NTFS file system intended to provide compatibility with HFS, which may still be necessary for compatibility. However, the lack of visibility of this 'feature' poses a significant risk for administrators. There has already been one virus released that employed ADSs, W2K.Stream written by Bennie and Ratter of the group 29A (KASP01). As the release of malware and incidents of cybercrime increase, the malicious use of ADSs will likely increase as well.

The solution is not to stop using the NTFS file system, as the benefits in security and reliability are too great. This 'feature' has remained part of the file system since NT 3.1. Given the circumstances, a far more prudent solution would have been to include support for HFS files in the File and Print Services for the Macintosh, rather than the file system. As it is, administrators should make judicious use of discretionary access control lists (DACLs) on files and directories (CARV00), and regularly scan their critical systems using utilities such as lads.exe. In addition, Microsoft should be lobbied to add the ability to detect and view ADSs to Windows Explorer and the command interpreter. A more than appropriate measure would be to have ADSs appear in Windows Explorer by default, using an icon with a scarlet 'A' to signify an ADS. Additionally, Microsoft should provide restrictions within the operating system for creating processes from executable files whose names contain a colon.

Further, antivirus software vendors should include support for ADSs within their products by default. While many of the worms seen over the past year or more have been executables written in Visual Basic or Delphi, others have been Visual Basic scripts. This malware has been capable of wreaking considerable havoc, and all prudent steps should be taken to protect systems.




منابع :

References

RUSS00 Russinovich, M., Inside Win2K NTFS, Part 2 , Windows 2000 Magazine, November, 2000

MCCL99 McClure, S., Scambray, J., and Kurtz, G., Hacking Exposed: Network Security Secrets and Solutions, Berkeley: Osbourne, 1999

KASP01 Kaspersky, E. and Zenkin, D., NTFS Alternate Data Streams , Windows and .Net Magazine, Spring 2001

CARV00 Carvey, H., Network Trojans: What You REALLY Need To Know , Information Security Bulletin, Vol. 5, Issue 8

دنیای دلفی
جمعه 28 فروردین 1388, 14:11 عصر
سلام مجدد

من نحوه كاركدن با يك سري از فولدرهاي رزرو شده را متوجه شدم مي زام شما هم حالشو ببريد ولي اگر كسي مي تونست سوال من رو جواب بده دريغ نكنه :



سعی کنید یک پوشه با یکی از اسامی زير con یا nul یا Aux یا Lpt1 بسازید خواهید دید که ویندوز به شما اجازه ی چنین کاری را نمی دهد چرا که ویندوز از این اسامی به منظور دیگری استفاده می کند مثلا Lpt1 به عنوان پورت پرینتر ، con به console اشاره می کند این اسامی بیشتر هستند تعداد دیگری را در لیست زیر ببینید



CON, PRN, AUX,NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9




یکمی تلاش کنید تا یکی پوشه با یکی از اسمهای بالا بسازید اگه نشد به خواندن ادامه دهید
حالا می خوام روشی رو براتون بگم که بتوانید یک فایل یا فولدر یا پوشه را به این اسامی دربیاورید
از منوی استارت گزینه run را انتخاب و در اون بنویسید cmd و کلید اینتر را بزنید
فرض می کنیم که می خواهیم پوشه ای با نام con در درایو سی بسازیم خب در پنجره cmd می نویسیم



md\\.\C:\con


مشخص است که برای ساختن پوشه ای به نام con مثلا در درایو دی و در داخل فولدر music باید دستور زیر را در cmd بنویسید



md\\.\D:\music\con


خب حالا به مسیر مورد نظر بروید و نتیجه کار را ببینید. جالبه نه ، ویندوز یک سیستم عامل پر از آرایه متناقض نما است
حالا سعی کنید این پوشه را پاک کنید یا تغییر نام دهید یا آن را حذف کنید
چطور شد؟ نمی شود؟ خب به خواندن ادامه دهید تا ببینید چطور می شود؟
حتی نمی توانید از این پوشه یک کپی بگیرید این همان چیزی است که ما برای حفاظت از اطلاعات شخصی خود می خواهیم
در ادامه دستورات لازم برای انجام همه ی کارهای بالا را یاد خواهید گرفت









برای حذف پوشه ای با نام con در درایو سی باید در cmd بنویسید


rd\\.\C:\con

برای اینکه بتوانید یک پوشه را حذف کنید باید درون آن فایل یا پوشه ای دیگر نباشد یعنی کاملا خالی باشد



برای تغیير نام پوشه ای با نام con در درایو سی باید در cmd بنویسید


ren\\.\C:\con NewName

اگر پوشه را تغییر نام دهید دیگر از آن در برابر حذف ، کپی شدن و غیره محافظت نمی شود



NewName نام جدید پوشه con است



می توان از این قابلیت برای قفل کردن فایل ها استفاده کرد به این صورت که شما با استفاده از دستور کپی نام فایل خود را به یکی از اسامی بالا تغییر دهید مثلا یک فایل عکس به اسم 1.jpg در درایو دی در داخل پوشه Pictures دارید یعنی D:\Pictures\1.jpg و می خواهید ان را با نام جادویی NUL قفل گذاری کنید



از منوی استارت Run را انتخاب کرده و در ان cmd را تایپ کرده و کلید Enter را بزنید
در پنجره cmd این دستور را تایپ کنید


copy D:\Pictures\1.jpg \\.\D:\Pictures\NUL.jpg

حالا فایل شما یک نسخه از عکس دارید که قفل شده است می توانید فایل اولی را پاک کنید
برای برداشتن قفل عکس بالا در cmd بنویسید


ren\\.\D:\Pictures\NUL.jpg NewName.jpg

شاید بخواهید تعداد زیادی فایل را قفل کنید در این مورد قفل کردن تک تک فایلها یک کار خسته کننده و بیهوده است به جای آن تمام فایلهای خود را با در فایل Zip ریخته و سپس آن را قفل گذاری کنید

hadisalahi2
شنبه 04 مهر 1388, 20:29 عصر
با سلام
در صفحه شماره 3 و در پست شماره 30 کدی قرار داده شده است که مربوط به یافتن دیباگرها بر روی سیستم است.
حالا خط زیر چه مفهومی داره؟



if Tm2>299999999 then Found:=True;

این عدد نمایانگر چه چیزیه؟
من روی سیستم خودم دیباگری نصب ندارم ولی در این خط مقدار متغیر Found برابر True می شود و برنامه ادامه نمی یابد.
حالا علت این امر چیه؟

علاوه براین در چند خط دیگه هم مقدار Found برابر True میشه. در صورتی که من اصلا دیباگری روی سیستم ندارم.


در پست شماره 28 هم یک Unit قرار داده شده برای مخفی کردن دستور Apllication.terminate
ولی این کد اصلا کار خاصی انجام نمیده و موقعی که به خط زیر میرسه از تابع خارج میشه:
کد:
jmp @def
و اصلا تابع KillMe فراخوانی نمیشه.
اگه توضیحات لازم داده بشه ممنون میشم.


دوستان چند خط کد داخل تاپیک ها مینویسند و بعد هم خداحافظ. اگه لطف کنند و یه توضیح مختصر هم در مورد نحوه استفاده از اونها بدهند ممنون میشم. البته همه کاربران ممنون میشند.
در صفحه 4 و پست شماره 35 ، دوست عزیز Joker ، شما چند کد در مورد شناسایی دیباگرها نوشتید، اما متاسفانه روش استفادش رو توضیح ندادید. یا حداقل من نتونستم روش استفاده از این کدها رو بفهمم.
اگه توضیح بدید که چطوری باید از این چند خط کد استفاده کنم ممنون میشم.
یا حق

joker
شنبه 04 مهر 1388, 21:46 عصر
در صفحه 4 و پست شماره 35 ، دوست عزیز Joker ، شما چند کد در مورد شناسایی دیباگرها نوشتید، اما متاسفانه روش استفادش رو توضیح ندادید. یا حداقل من نتونستم روش استفاده از این کدها رو بفهمم.
اگه توضیح بدید که چطوری باید از این چند خط کد استفاده کنم ممنون میشم.
یا حق
این سورسها به صورت یک پروسیجر آماده ( هلو برو تو گلو) تعریف شدند ، کافیه توی سورس دلفی استفاده کنید دیگه... چطوریش هم مثل تمام فانکشن و پروسیجر های دلفی .
یعنی شما بعد از implementation کل این سورس ها را کپی پیست کنید
بعد هرجای برنامه که خواستید ( مثلا در رویداد Create یا show فرم اونها را فقط صدا بزنید )



private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
/////////////////////////////////////////////
Procedure DBGDetect();
var
x:byte;
begin
asm
call GetTickCount

...
.
...
end;

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
DBGDetect();
end;
////////////////////////////////////////////

hadisalahi2
شنبه 04 مهر 1388, 22:32 عصر
با تشکر از توضیحاتتون
شما فقط در مورد DBGDetect توضیح دادید.
اون کدهای اسمبلی که در اول گذاشتید چی هستند.اصلا کجا باید استفاده بشوند؟
تابع دوم "enumwindowsproc" چی هست و چطوری باید از اون استفاده کرد؟

joker
شنبه 04 مهر 1388, 23:24 عصر
این که چی هستند را ، سورس گذاشتم دیگه :) اما اینکه کجا استفاده میشه کرد :هرجائی دلتون خواست میتونید استفاده کنید .

پیوست برای (http://translate.google.com/translate?prev=hp&hl=en&js=y&u=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fms633498%28VS.85%29.aspx&sl=en&tl=fa&history_state0=&swap=1)enumwindowsproc (http://translate.google.com/translate?prev=hp&hl=en&js=y&u=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fms633498%28VS.85%29.aspx&sl=en&tl=fa&history_state0=&swap=1)

hadisalahi2
یک شنبه 05 مهر 1388, 10:15 صبح
در صفحه 2 و پست شماره 11 .جناب Afshin_Zavar (http://barnamenevis.org/forum/member.php?u=4242) شما یک فایل با نام
Ring 3 debugger detection via INVALID_deroko.rar‏ (http://barnamenevis.org/forum/attachment.php?attachmentid=6006&d=1166868441)
قرار دادید . میشه لطفا بفرمایید کارش چیه؟
من که اجرا کردم فقط یک پیغام "You Are Ok " نمایش می دهد ولی نحوه کار رو نفهمیدم.
در ضمن اون فایل اسمبلی کنارش برای چی استفاده میشه؟

hadisalahi2
یک شنبه 05 مهر 1388, 10:18 صبح
با سلام
جناب افشین زوار
در صفحه 4 پست شماره 33 یک پروتکتور قرار دادید به زبان دلفی ولی متاسفانه موقعی که من میخوام یک فایل Exe رو که با دلفی نوشتن Pack کنم پیغام Access Validation میده. ممنون میشم رسیدگی کنید.

joker
یک شنبه 05 مهر 1388, 15:05 عصر
فکر میکنم شما قبل از اینها باید کمی سطح معلومات در زمینه امنیت نرم افزارها / آشنائی با اصطلاحالا و روشهای کرک / برنامه نویسی و اصول برنامه نویسی /و... را بالاتر ببرید ،(خوندن مقالات آموزش کرک و مواردی توی این ضمینه و...) در حد متوسط که شد مطمئنا از این جفنگیاتی که ما اینجا داریم مینویسم سردرمیارید ، و الا اینکه بخوایم تک به تک خطوط و طرز کارها را توضیح بدیم یه کم حوصله میخواد و وقت که هیچکدوم از ما نداره :)

پیوست:
لطفا پستهایی نامربوط به این عنوان تاپیک سرموقع حذف بشن :)

hadisalahi2
یک شنبه 05 مهر 1388, 16:43 عصر
جناب Joker من اون تابع enumwindowsproc رو در یک یونیت کپی کردم ولی موقع کامپایل از خطوطی که دستور BLOK_KEY قرار دارد خطا میگیره.
حالا این BLOK_KEY چی هست و مشکل رو چطوری حلش کنم؟

hadisalahi2
یک شنبه 05 مهر 1388, 16:59 عصر
دوست عزیز جناب Joker فکر کنم اونقدر معلومات دارم که نحوه کار با توابع رو یاد داشته باشم. اما اینکه یک تکه کد رو از یک جا بیاریم و اینجا کپی کنیم ، فکر نمیکنم ربطی به سطح معلومات داشته باشه.
من نمیدونم دوستانی که این پستها رو میخونند اصلا با این کد ها کار کردند یا نه که فقط روی دکمه تشکر کلیک میکنند؟


پیوست:
لطفا پستهایی نامربوط به این عنوان تاپیک سرموقع حذف بشن :)

به نظر شما از چند تا تاپیکی که من زدم کدومش نامربوط بوده؟
من قبل از اینکه هر کدوم از این تاپیک ها رو بزنم کلی روی کدها کار کردم و بعد پست رو ایجاد کردم.
به نظر من اگه دوستان قبل از اینکه چند تکه کد رو توی این جا Copy/Paste کنند ، بهتره خودشون یک کم با کدها کار کنند.
هر کدوم از پستهای من نامربوطه بگید تا در مورد توضیح بدم که چرا اون رو ایجاد کردم.
یا علی

joker
دوشنبه 06 مهر 1388, 00:23 صبح
حالا این BLOK_KEY چی هست و مشکل رو چطوری حلش کنم؟

BLOCK_KEY یک پروسیجر دیگه هست که توی این سورس میتونید اونو با دوتا // * نادیده بگیرید.
سورس از وسط دل و روده پروتکتورم(جوان ناکام) اوردم اینجا کپی پیست کردم برای همین یه چیزائی از یه جاهایی دیگه ممکنه وسطاش پیدا بشه...:لبخند:

به نظر شما از چند تا تاپیکی که من زدم کدومش نامربوط بوده؟
همه اش.
این تاپیک در مورد روشهاست نه پاسخ به سوالات ابتدائی در زمینه آموزش برنامه نویسی !

* :
من قبل از اینکه هر کدوم از این تاپیک ها رو بزنم کلی روی کدها کار کردم و بعد پست رو ایجاد کردم.
مطمئنا اگه خیلی که نه ، ولی یه ذره هم کار کرده بودید ساده ترین روش حذف یعنی // را حداقل یکبار در مورد این دوتا پروسیجری که کنار سورس نبودند را به کار میبردید.

بدت نیاد ولی شما هنوز نمیدونید یک پروسیجر چطوری توی دلفی نوشته میشه .

پیوست :

فکر میکنم شما قبل از اینها باید کمی سطح معلومات در زمینه امنیت نرم افزارها / آشنائی با اصطلاحالا و روشهای کرک / برنامه نویسی و اصول برنامه نویسی /و... را بالاتر ببرید
این جمله متلک نبود ، پیشنهاد بود.

joker
دوشنبه 06 مهر 1388, 00:29 صبح
من سه تا BLOCK key داشتم که هرکدوم یه روشی بود
و تازه توی هرکدوم یکسری پروسیجر دیگه صدا زده میشد :( حالا باید همه شا اینجا بنویسم:))



procedure BLOK_KEY;
var
s:string;
Hreg : HWND;
var xBlockInput : function (Block: BOOL): BOOL; stdcall;

begin
if FunctionDetect ('USER32.DLL', 'BlockInput', @xBlockInput) then
begin
xBlockInput (True); // Disable Keyboard & mouse
SimulateKey(VK_SPACE,0);
SimulateKey(VK_SPACE,1);
SimulateKey(VK_SPACE,0);
SimulateKey(VK_SPACE,1);
xBlockInput (False); // Enable Keyboard & mouse

end;

end;
//--------------------------------------


procedure BLOK_KEY2;
VAR
I,J:iNTEGER;
begin

SimulateKey( VK_SPACE ,0 );
SimulateKey( VK_SPACE ,1 );
SimulateKey( 74 ,0 );
SimulateKey( 77 ,0 );
SimulateKey( 80 ,0 );
SimulateKey( VK_SPACE ,0 );
SimulateKey( 52 ,0 );
SimulateKey( 49 ,0 );
SimulateKey( 48 ,0 );
SimulateKey( 48 ,0 );
SimulateKey( 48 ,0 );
SimulateKey( 48 ,0 );

SimulateKey(VK_F8,1);
SimulateKey(VK_F9,0);
SimulateKey(VK_F9,1);
end;

procedure BLOK_KEY3;
VAR
PO : TPoint;
begin


GetCursorPos(PO);
SetCursorPos(Screen.Width-2 ,2);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
mouse_event(MOUSEEVENTF_MOVE,1,0,0,0);
SetCursorPos(PO.X,po.Y);

end;

//--------------------------------------


تابع شبیه ساز فشرده شدن کلیدهای کیبورد


procedure SimulateKey(key:byte;Extra:Dword);
begin
keybd_event(key,extra,0,0);
keybd_event(key,extra,KEYEVENTF_KEYUP,0);
end;


و یکی دیگه که توی سورس بالا استفاده شده FunctionDetect برای قسمت بلوک صفحه کلید موقع تریس


function FunctionDetect (LibName, FuncName: String; var LibPointer: Pointer): boolean;
var LibHandle: tHandle;
begin
Result := false;
LibPointer := NIL;
if LoadLibrary(PChar(LibName)) = 0 then exit;
LibHandle := GetModuleHandle(PChar(LibName));
if LibHandle <> 0 then
begin
LibPointer := GetProcAddress(LibHandle, PChar(FuncName));
if LibPointer <> NIL then Result := true;
end;
end;

hadisalahi2
دوشنبه 06 مهر 1388, 09:01 صبح
با سلام و تشکر از پاسخ سوالات.


همه اش.
این تاپیک در مورد روشهاست نه پاسخ به سوالات ابتدائی در زمینه آموزش برنامه نویسی !

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


BLOCK_KEY یک پروسیجر دیگه هست که توی این سورس میتونید اونو با دوتا // * نادیده بگیرید.
سورس از وسط دل و روده پروتکتورم(جوان ناکام) اوردم اینجا کپی پیست کردم برای همین یه چیزائی از یه جاهایی دیگه ممکنه وسطاش پیدا بشه...



مطمئنا اگه خیلی که نه ، ولی یه ذره هم کار کرده بودید ساده ترین روش حذف یعنی // را حداقل یکبار در مورد این دوتا پروسیجری که کنار سورس نبودند را به کار میبردید.

فکر کنم دوستانی که این پست ها رو میخونند باید علم غیب داشته باشند که بدونند اون خط هایی که خطا داره اصلا الکی توی کد نوشته شده و باید غیر فعال بشه.
در ضمن در مورد اینکه من چقدر روی این کدها کار کردم ، این رو بگم که اخلاق من توی برنامه نویسی اینه که اول خودت تلاش کنی بعد اگه به نتیجه نرسید از کسی سوال کنی.


فکر میکنم شما قبل از اینها باید کمی سطح معلومات در زمینه امنیت نرم افزارها / آشنائی با اصطلاحالا و روشهای کرک / برنامه نویسی و اصول برنامه نویسی /و... را بالاتر ببرید

در مورد این پیشنهادتون هم ممنونم، اتفاقا دارم همین کار رو انجام میدم که این سوالات رو مطرح میکنم.
امیدوارم به جای بحث بی مورد درباره این زمینه ها ، سعی کنیم تا روشهای جدیدتر ، بهتر و بدون نقص تری برای محافظت از نرم افزارهای اجرایی به دوستان پیشنهاد کنیم.
یا علی

Dr.Bronx
شنبه 26 دی 1388, 13:28 عصر
16 راه برای داشتن امنیت بیشتر در برنامه ها : English
از ضمیمه دانلود کنید

Unique way of Encryption / Encoding
http://www.planet-source-code.com/Upload_PSC/ScreenShots/PIC2003112362076407.gif

موفق باشید http://www.forum.persiancoder.com/images/smilies/icon_gol.gif

Dr.Bronx
یک شنبه 27 دی 1388, 10:15 صبح
1- Key or Password Quality Check
این برنامه چگونگی چک کردن کیفیت یک پسورد رو نشون میده
vb6 هست

http://www.planet-source-code.com/Upload_PSC/ScreenShots/PIC2005326750529853.jpg

2- یک کلاس برای کار با A MD5 Class - MD5
http://www.planet-source-code.com/Upload_PSC/ScreenShots/PIC200652200257531.jpg

3- Matrix Encrypter
یک روش رمزنگاری با استفاده از matrix
به گفته سازنده هیچ وقت پسورد خودتون رو فراموش نکنید . چون به هیچ عنوان نمی تونید فایل رو آزاد کنید. http://vadrouilles.moto.free.fr/smileys/itwashim3.gif

4- درباره Encryption

Over the years I have been hanging around PSC I have seen many types of encryption,many say that theysarethe best, uncrackable and so on. Wrong! The real encryptions that are strong uses a key or several,and are based on advanced or minor advanced mathematical algorhitms.Take the RSA encryption: You start with two prime numbers and after that they are used to produce some uniqe numbers, and allare in proportion to each other. The encryption in itself is easy-advanced math: Text^n mod e I think. Something like that. If you do proclaim that your encryption are state of the art,please say that it has some sort of advanced mathematical algorhitm in it.Or atleast get some facts about encryptio, before you try to make one yourself. If the content of this article is grossly wrong, notify me and I will remove it.

موفق و موید باشید http://www.forum.persiancoder.com/images/smilies/icon_gol.gif

joker
سه شنبه 11 آبان 1389, 00:19 صبح
یکی از مواردی که کار کرکر را راحت میکنه پیدا کردن رشته هایی مورد استفاده برنامه نویس در برنامه میباشد ، با استفاده از یونیت زیر میتونید رشته ها را یکبار به حالت رمز در بیاورید و موقع نمایش با استفاده از تابع Decrypt اون را صدا بزنید و نمایش بدهید.

یک مثال آخر همین یونیت هست برای نمونه روش استفاده.
که هر برنامه نویسی میتونه یک my_key برای خودش در نظر بگیره و شروع کنه رشته ها را یکبار رمز کنه و رمز شده ها را به جاهایی که نیاز داره با یک پیشوند تابع دیکریپت صدا بزنه
به این صورت دیگه موقع ریسورس برنامه رشته های معنی دار در همان لحظه اول جلو چشم کرکر قرار نمیگیره :)



unit uEncrypt;

interface

function Decrypt(const S: AnsiString; Key: Word): AnsiString;
function Encrypt(const S: AnsiString; Key: Word): AnsiString;

implementation

const
C1 = 52845;
C2 = 22719;

function Decode(const S: AnsiString): AnsiString;
const
Map: array[Char] of Byte = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0);
var
I: LongInt;
begin
case Length(S) of
2:
begin
I := Map[S[1]] + (Map[S[2]] shl 6);
SetLength(Result, 1);
Move(I, Result[1], Length(Result))
end;
3:
begin
I := Map[S[1]] + (Map[S[2]] shl 6) + (Map[S[3]] shl 12);
SetLength(Result, 2);
Move(I, Result[1], Length(Result))
end;
4:
begin
I := Map[S[1]] + (Map[S[2]] shl 6) + (Map[S[3]] shl 12) +
(Map[S[4]] shl 18);
SetLength(Result, 3);
Move(I, Result[1], Length(Result))
end
end
end;

function PreProcess(const S: AnsiString): AnsiString;
var
SS: AnsiString;
begin
SS := S;
Result := '';
while SS <> '' do
begin
Result := Result + Decode(Copy(SS, 1, 4));
Delete(SS, 1, 4)
end
end;

function InternalDecrypt(const S: AnsiString; Key: Word): AnsiString;
var
I: Word;
Seed: Word;
begin
Result := S;
Seed := Key;
for I := 1 to Length(Result) do
begin
Result[i] := Char(Byte(Result[i]) xor (Seed shr 8));
Seed := (Byte(S[i]) + Seed) * Word(C1) + Word(C2)
end
end;

function Decrypt(const S: AnsiString; Key: Word): AnsiString;
begin
Result := InternalDecrypt(PreProcess(S), Key)
end;

function Encode(const S: AnsiString): AnsiString;
const
Map: array[0..63] of Char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
'abcdefghijklmnopqrstuvwxyz0123456789+/';
var
I: LongInt;
begin
I := 0;
Move(S[1], I, Length(S));
case Length(S) of
1:
Result := Map[I mod 64] + Map[(I shr 6) mod 64];
2:
Result := Map[I mod 64] + Map[(I shr 6) mod 64] +
Map[(I shr 12) mod 64];
3:
Result := Map[I mod 64] + Map[(I shr 6) mod 64] +
Map[(I shr 12) mod 64] + Map[(I shr 18) mod 64]
end
end;

function PostProcess(const S: AnsiString): AnsiString;
var
SS: AnsiString;
begin
SS := S;
Result := '';
while SS <> '' do
begin
Result := Result + Encode(Copy(SS, 1, 3));
Delete(SS, 1, 3)
end
end;

function InternalEncrypt(const S: AnsiString; Key: Word): AnsiString;
var
I: Word;
Seed: Word;
begin
Result := S;
Seed := Key;
for I := 1 to Length(Result) do
begin
Result[i] := Char(Byte(Result[i]) xor (Seed shr 8));
Seed := (Byte(Result[i]) + Seed) * Word(C1) + Word(C2)
end
end;

function Encrypt(const S: AnsiString; Key: Word): AnsiString;
begin
Result := PostProcess(InternalEncrypt(S, Key))
end;

end.

{************************************************* *************}
// Example:
{************************************************* *************}
/*
procedure TForm1.Button1Click(Sender: TObject);
const
my_key = 313603;
var
sEncrypted, sDecrypted :AnsiString;
begin
// Encrypt a string
sEncrypted := Encrypt('this is a sample text to encrypt...abcd 123 {}[]?=)=(',my_key);
// Show encrypted string
ShowMessage(sEncrypted);
// Decrypt the string
sDecrypted := Decrypt(sEncrypted,my_key);
// Show decrypted string
ShowMessage(sDecrypted);
end;
*/

joker
سه شنبه 25 آبان 1389, 00:49 صبح
روشی برای تشخیص نقاط توقف سخت افزاری
Hardware Breakpoints

Hardware breakpoints are a technology implemented by Intel in their processor architecture, and are controlled by the use of special registers known as Dr0-Dr7. Dr0 through Dr3 are 32 bit registers that hold the address of the breakpoint. Dr4 and 5 are reserved by Intel for debugging the other registers, and Dr6 and 7 are used to control the behavior of the breakpoints (Intel1). There is a little bit too much information for me to cover how the Dr6 and Dr7 registers affect breakpoint behavior. However, anyone who is interested should read the Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3B: System Programming Guide for an in-depth explanation of how the registers work.
Now, in order to detect and/or remove hardware breakpoints, there are two methods we can utilize: the Win32 GetThreadContext and SetThreadContext, or using Structured Exception Handling. In the first example, I'll show how to use the Win32 API functions:



// CheckHardwareBreakpoints returns the number of hardware
// breakpoints detected and on failure it returns -1.
int CheckHardwareBreakpoints()
{
unsigned int NumBps = 0;

// This structure is key to the function and is the
// medium for detection and removal
CONTEXT ctx;
ZeroMemory(&ctx, sizeof(CONTEXT));

// The CONTEXT structure is an in/out parameter therefore we have
// to set the flags so Get/SetThreadContext knows what to set or get.
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;

// Get a handle to our thread
HANDLE hThread = GetCurrentThread();

// Get the registers
if(GetThreadContext(hThread, &ctx) == 0)
return -1;

// Now we can check for hardware breakpoints, its not
// necessary to check Dr6 and Dr7, however feel free to
if(ctx.Dr0 != 0)
++NumBps;
if(ctx.Dr1 != 0)
++NumBps;
if(ctx.Dr2 != 0)
++NumBps;
if(ctx.Dr3 != 0)
++NumBps;

return NumBps;
}

joker
یک شنبه 18 اردیبهشت 1390, 01:32 صبح
.....................
يكسري از پروتكتورهاي خوب

اديت شد : ظاهرا لينك تغيير كرده. :(

arkia
یک شنبه 25 دی 1390, 01:33 صبح
هرچند از خیلی از بحث ها سر در نیاوردم اما در کل تاپیک خیلی خوبیه مرسی Joker :تشویق:
من از دیباگر و دیس اسمبلر اینا سرم نمیشه اما یکم دلفی بلدم :خجالت: برا استفاده ی خودم کد هاتونو برداشتم و یه یونیت درست کردم خواهشا میشه یه نگا بهش بندازید یه چیزایی بیشتر با همون منوالی که گذاشتم بهش اضافه کنید؟ :قلب:

یه سوال اگه من این توابع و پروسیجر ها رو هر 1 دقیقه چک کنم برا برنامم مشکلی که پیش نمیاد؟ روشم درسته یا جای دیگه ای هم باید فراخونیشون کنم؟ نمونه استفادم از کد ها اینجوریه:




procedure TForm1.Timer1Timer(Sender: TObject);
begin

if IsDBG=true then KillMe;
if SoftIceVXDDetected then KillMe;
if WinIceDetected then KillMe;
if BoundsCheckerDetected then KillMe;
if MeltIceDetected then KillMe;
if IsDebuggerPresent then KillMe;
FOLL;
Checkit(123456);

end;

arkia
یک شنبه 25 دی 1390, 01:49 صبح
راستی اون تیکه کدی که کامنتش کردم باعث بستن برنامه میشه به نظرتون از چیشه؟


//hSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS ,0);

immortalson
چهارشنبه 10 خرداد 1391, 20:18 عصر
کسی میدونه چطور میشه برنامه هایی که تو #C نوشته شده به فایل exe تبدیل کرد؟؟؟:گریه:
دیگه اینکه اگه برنامه ای ایمن واسه تبدیل فایل exe به setup میشناسید لطفا معرفی کنید

arkia
پنج شنبه 11 خرداد 1391, 00:05 صبح
کسی میدونه چطور میشه برنامه هایی که تو #C نوشته شده به فایل exe تبدیل کرد؟؟؟:گریه:
دیگه اینکه اگه برنامه ای ایمن واسه تبدیل فایل exe به setup میشناسید لطفا معرفی کنید

:متعجب: کار c# تبدیل برنامه به exe ست دیگه!!!! یعنی کدتو نوشتی موندی چجوری اجراییش کنی؟ :لبخند:

Install Shield بهترین گزینس اما نمیدونم چرا گفتی امن... البته ابزار هایی برا امنیت برنامه داره اما کسی به اونا اکتفا نمیکنه. راستی این سوال جاش اینجا نبود

بهروز عباسی
شنبه 10 فروردین 1392, 12:09 عصر
امروز داشتم با برنامه ProcessExplorer سرو کلّه میزدم یهو یه چیزی به ذهنم رسید ،وقتی برنامه ای با Debugger باز میشه اون Debugger به عنوان Process والد برنامه و برنامه هم Process فرزند Debugger میشه
با این حساب اگه توی برنامه Parent-Process خودشو تشخیص بده میشه فهمید که Debuggerای در کار هست یا نه ، به همین سادگی http://www.sepehr-team.org/images/smilies/De.gif

برنامه در حالت عادی :
102109

برنامه و Debugger :
102110

اینم کد برنامه به زبان Delphi :
uses
Winapi.TlHelp32, Winapi.PsAPI;

{-------------------------------------------------------------------------------
+ function : Get_Parent_Process_Path
+ Author : Behrooz Abbassi
+ DateTime : 2013.03.30
+ Arguments : None
+ Result : string
-------------------------------------------------------------------------------}

function Get_Parent_Process_Path: string; inline;
function Get_Parent_Process_ID: NativeInt; inline;
var
PE32: TProcessEntry32;
snap: THandle;
begin
Result := 0;
snap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
PE32.dwSize := SizeOF(PE32);
process32first(snap, PE32);
repeat
if PE32.th32ProcessID = GetCurrentProcessID then
Result := PE32.th32ParentProcessID;
until Process32Next(snap, PE32) = FALSE;
end;

var
Handle: THandle;
Path: array [0 .. 255] of char;
begin
Result := '';
Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE,
Get_Parent_Process_ID);
if Handle <> 0 then
try
GetModuleFileNameEx(Handle, 0, Path, MAX_PATH);
Result := Path;
finally
Handle := 0;;
end;
end;

اینم نحوه استفاده : (فعلاً فقط برای Ollydbg)
var
sParent: string;
begin
sParent := ExtractFileName(Get_Parent_Process_Path);
if (sParent = LowerCase('OLLYDBG.EXE')) or (sParent = UpperCase('OLLYDBG.EXE'))
then
Application.Terminate;

موفق باشید.:لبخند:

FastCode
شنبه 10 فروردین 1392, 21:49 عصر
Path: array [0 .. 255] of char;

Buffer overflow
fail

علیرضا حسن زاده
یک شنبه 11 فروردین 1392, 11:00 صبح
ا این حساب اگه توی برنامه Parent-Process خودشو تشخیص بده میشه فهمید که Debuggerای در کار هست یا نه ، به همین سادگی
این روش فکر کنم زمانی کار کنه که برنامه توسط دیباگر اجرا میشه
اگه برنامه اجرا بشه و پروسس Attach بشه احتمالا این روش کار نمیکنه

FastCode
دوشنبه 12 فروردین 1392, 13:31 عصر
این روش فکر کنم زمانی کار کنه که برنامه توسط دیباگر اجرا میشه
اگه برنامه اجرا بشه و پروسس Attach بشه احتمالا این روش کار نمیکنه
درسته ولی مشکلش اینه که در همون لحظات اول برنامه میتونه همه پروسس ها رو اسکن کنه.
ولی احتمالا این مشکل با sandbox حل بشه.
به جز این من یک روش بهتر از شما گفتم که چون کاملا این سیستم رو زیر سوال میبرد حذف شد.لینکش رو هم توی history ه iceweasel پیدا نکردم که PM کنم

typeman9
جمعه 18 اسفند 1396, 09:18 صبح
سلام
اولا کرکرها برنامه نویسان حرفه ای و مجرب زبان اسمبلی هستند و شما هرگز حریف اونها نمی شوید پس به خودتون وعده ندید و الکی دلتون رو به این روشها خوش نکنید . ثانیا امنیت نرم افزار با این روشهای قدیمی تامین نمیشه بلکه با انتشار سورس نرم افزار تامین میشه . دوره ی اینکارها گذشته . ضمنا شما خودتون دارید از اسمبلی استفاده می کنید اونوقت انتظار دارید کرکر نتونه قفل نرم افزار شما را بشکنه !!!!! واقعا که خیلی جالبه . بدجوری کرکرها رو دستکم گرفتید . بجای کرکرها فقط خودتون رو خسته می کنید . وقتتون رو بجای این مباحث بیهوده به چیزهای مفیدتر اختصاص بدید . کرکرها هیچوقت درمانده و خسته نمی شوند .