PDA

View Full Version : چطوری باز شدن برنامه هامونو توسط دیباگرها تشخیص بدیم



new delhpi coder
شنبه 19 اسفند 1391, 20:40 عصر
سلام
تاجایی که من میدونم برای کرک کردن برنامه ها باید از دیباگرها استفاده کرد
توی دلفی چطوری میشه این کارو کرد؟

بهروز عباسی
شنبه 19 اسفند 1391, 20:50 عصر
سلام
تاجایی که من میدونم برای کرک کردن برنامه ها باید از دیباگرها استفاده کرد
توی دلفی چطوری میشه این کارو کرد؟

درود
یه سری به برو بچ بخش امنیت بزنی بهتره

اما :
function IsDebugerPresent: Boolean;
var
ntGlobalFlags: DWORD;
const
FLG_HEAP_ENABLE_TAIL_CHECK = $10;
FLG_HEAP_ENABLE_FREE_CHECK = $20;
FLG_HEAP_VALIDATE_PARAMETERS = $40;
begin
asm
mov eax,fs:$30
mov eax,[eax + 68h]
mov ntGlobalFlags,eax
end;
Result := (ntGlobalFlags and $70) = $70;
end;

procedure antidbg;
var
ok: Boolean;
begin
ok := False;
try
asm
INT 2Dh
nop
end;
except
ok := True;
end;
if not ok then
Application.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
antidbg;



// if IsDebugerPresent then
// ShowMessage('Debuging...!');

// if InDebugger then
// ShowMessage('Debuging...!');

// if IsDebuggerPresent then
// ShowMessage('Debuging...!');
//
// if DebugHook <> 0 then
// ShowMessage('Debuging...!');

end;


موفق باشی.:کف:

بهروز عباسی
شنبه 26 اسفند 1391, 20:37 عصر
درود

اینم یه نمونه دیگه که نمونه های بالا هم مثل این عمل میکنن .
اما اینو خودم با Inline Assembly نوشتم :لبخند:
function ISDebuger: BOOL;
var
hKrnl32: NativeUInt;
pExitProcess, pIsDebuggerPresent: pointer;

BEGIN
hKrnl32 := GetModuleHandle('kernel32');
pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess');
pIsDebuggerPresent := GetProcAddress(hKrnl32, 'IsDebuggerPresent');

asm
MOV EAX,pIsDebuggerPresent
CALL EAX
MOV RESULT,EAX
TEST EAX,EAX

JNZ @@_IS_DEBUG
JZ @@_ISNOT_DEBUG

@@_IS_DEBUG:
PUSH EAX
MOV EAX,pExitProcess
CALL EAX
POP EAX

@@_ISNOT_DEBUG:
// ;
end;
END;
مثلاً :
if ISDebuger then
Caption := 'is'
else
Caption := 'No';
البته در حالت عادی برنامه رو اجرای کن توی دیباگر خود دلفی هستی هیچ وقت اجرا شدن برنامتو نمی بینی:شیطان:
موفق باشی

بهروز عباسی
یک شنبه 04 فروردین 1392, 09:46 صبح
اینم یکی دیگه :کف: :
function Is_DBG: Bool;
{Coded by me}
Var
Caption: AnsiString;
begin
Caption := 'My App Name';
asm

push $00
push Caption

mov eax, fs:[30h]
movzx eax, byte ptr[eax+$2]
or al,al
jz @@_False
jmp @@_True

@@_False:
xor eax, eax
leave
ret

@@_True:
mov eax, $1
leave
ret

end;
end;

lord_viper
دوشنبه 05 فروردین 1392, 15:10 عصر
// Check winXp automatically create the "debug object",
// Not open ProcessDebugFlags class, when the debugger is present, it will return false
function FD_NtQueryInfoProc_DbgFlags(): Boolean;
var
Func_Addr: Pointer;
hModule: Cardinal;
ReturnLength: PULONG;
dwDebugPort: PDWORD;
begin
result := false;
hModule := GetModuleHandle('ntdll.dll');
if hModule = INVALID_HANDLE_VALUE then exit;
Func_addr := GetProcAddress(hModule, 'ZwQueryInformationProcess');
if (Func_addr <> nil) then begin
asm
lea eax, ReturnLength
push eax
push 4
lea eax, dwDebugPort
push eax
push $1F
push $FFFFFFFF
call Func_addr
mov eax, [dwDebugPort]
test eax, eax
jz @IsDebug
jmp @exit
@IsDebug:
mov @result, 1
@exit:
end;
end;
end;

lord_viper
پنج شنبه 08 فروردین 1392, 15:44 عصر
// Use int 2dh anomaly detection interrupt
function FD_INT_2d(): Boolean;
begin
try
asm
int 2dh
inc eax //any opcode of singlebyte.
//;or u can put some junkcode,
//"0xc8"..."0xc2"..."0xe8"..."0xe9"
mov @result, 1
end;
except
Result := false;
end;
end;

بهروز عباسی
پنج شنبه 08 فروردین 1392, 17:29 عصر
اینم یکی دیگه:کف:
{ -------------------------------------------------------------------------------
+ Procedure : Is_DBG
+ Author : Behrooz Abbassi
+ DateTime : 2013.03.28
+ Arguments : None
+ Result : Bool
------------------------------------------------------------------------------- }
function Is_DBG: Bool;
(* PEB!NtGlobalFlags *)
asm
(* Create Backup *)
pusha //
pushf //
(* ------------- *)

mov eax, fs:[30h]
mov eax, [eax+68h]
and eax, 70h
test eax, eax


jz @@_False // Isn't dbg
jnz @@_True // Is dbg

@@_False: // Return False
mov Result,$0
jmp @@_Exit

@@_True: // Return True
mov Result,$1

@@_Exit:

(* Restore Backup *)
popf //
popa //
(* ------------- *)
end;


منبع :
Windows Anti-Debug Reference (http://www.symantec.com/connect/articles/windows-anti-debug-reference?ref=oc)

حتماً بخونیدش ،راه های جالبی داره.
موفق باشید:متفکر:

بهروز عباسی
پنج شنبه 08 فروردین 1392, 18:33 عصر
اینم یکی دیگه :لبخند:
در واقع همونیه که در پست 6 توسط lord_viper (http://barnamenevis.org/member.php?9257-lord_viper) معرفی شد ، اما این بهتره (حداقل برای من) چون اگه بخواید ازش Shell-Code تهیه کنید راحتره!!
به خاطر اینکه مدیریت استثناها هم با Assembly نوشتم و نه دلفی توی Shell-Code هم نمیشه از exception handler خود دلفی استفاده کرد:لبخند:

{ -------------------------------------------------------------------------------
+ Function : Int2D_DBG
+ Author : Behrooz Abbassi
+ DateTime : 2013.03.28
+ Result : Bool
------------------------------------------------------------------------------- }
Function Int2D_DBG(): Bool;
{ Exception Based Anti-Debugging }
ASM
mov Result,$0 // Return False

@@_TRY :
pushad
mov esi, offset @@_Handler
push esi
push FS:[0]
mov FS:[0], ESP

// ---------------------
int 2Dh
nop
// ---------------------

@@_EXCEPT:
mov Result,$1 // Return True
jmp @@_NoException

@@_Handler:
mov esp, [esp + 8]
pop dword ptr fs:[0]
add esp, 4
popad

@@_TRY_END :
jmp @@_ExceptionHandled

@@_NoException:
pop dword ptr fs:[0]
add esp, 32 + 4

@@_ExceptionHandled:

End;

مثال :
if Int2D_DBG = True then
ShowMessage('IS DBG')
else
ShowMessage('Is not DBG');
موفق باشید.

MohsenB
پنج شنبه 08 فروردین 1392, 20:23 عصر
سلام

اینجا (http://barnamenevis.org/showthread.php?104440) مباحث خوبی قبلا مطرح شده بود


موفق باشید