یه چند وقتی دنبال روشهایی بودم که بتونه کار کرکرها را سخت تر کنه
یه چندتاییش را با توضیحات و کارایی مربوطه اینجا مینویسم
امیدوارم دوستان برنامه نویس از این سورس ها استفاده مربوطه را ببرن
این 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 فعال میشه )