Anti-RCE & Anti-Debugger
#1
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله
باختصار لأن الموضوع طويل...
بداية هذه بعض الطرق والخدع لاكتشاف المنقح:
FindWindow: البحث عن واجهة OllyDbg باستخدام FindWindow
PHP كود :
function IsOllyDbgRunnig:Boolean;
const
  
OllyName='ollydbg';
begin
  Result 
:= (FindWindow(OllyName,nil) <> 0) or (FindWindow(PChar(UpperCase(OllyName)),nil) <> 0);
end; 
طبعا ollydbg أو OLLYDBG أو احتمالات/منقحات أخرى...
IsDebuggerPresent: التابع IsDebuggerPresent من المكتبة Kernel32
PHP كود :
function IsDebuggerPresent: BOOL; stdcall; external 'kernel32.dll'; 
أو بطريقة أخرى لاستعمالها باسم آخر:
كود :
function IsDebugging: Boolean; var DllHnd: HWND; DebugPresentFunc: function: BOOL; stdcall; begin DllHnd := LoadLibrary('kernel32.dll'); if DllHnd <> INVALID_HANDLE_VALUE then begin DebugPresentFunc := GetProcAddress(DllHnd, 'IsDebuggerPresent'); Result := DebugPresentFunc; end else Result := False; end;
CheckRemoteDebuggerPresent: التابع CheckRemoteDebuggerPresent من Kernel32
PHP كود :
function CheckRemoteDebuggerPresent(hProcess: HWND; out pbDebuggerPresent: BOOL): BOOL; stdcall; external 'kernel32.dll'; 
تستخدم بارسال Handle ملف البرنامج (بـ CreateFile مثلا) للتأكد فيما إذا كان تحت التنقيح
أيضا يمكن استخدام اسم مستعار.
ProcessName: فحص اسم الـ Process مثال:
PHP كود :
uses
  tlhelp32
;

function 
GetPidByPName(Selected_Process: String): DWORD;
var
  
hSnap: THandle;
  
lppe: TProcessEntry32;
  
dwPID: DWORD;
begin
  dwPID 
:= 0; //initializing the variable
  
lppe.dwSize := sizeof(lppe);
  
hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  if 
Process32First(hSnap, lppe) <> False then
   begin
   
if lppe.szExeFile = Selected_Process then dwPID := lppe.th32ProcessID;
   while 
Process32Next(hSnap, lppe) do
   if 
lppe.szExeFile = Selected_Process then dwPID := lppe.th32ProcessID;
   
end;
  
Result := dwPID;
end; 
مثال الاستخدام:
PHP كود :
if GetPidByPName('ollydbg.exe') <> 0 then
    MessageBox
(0, 'OllyDbg detected!', 'Warning', MB_OK + MB_ICONEXCLAMATION) 
Check parent process: البحث عن الـ Process الأب للتحقق فيما إذا كان البرنامج يشتغل تحت Process آخر
PHP كود :
//***************************************************
// Check the parent process to detect OllyDBG
//*************************************************** 
function CheckParentProcess:Boolean;
const
  
ParentName='\EXPLORER.EXE';
var
  
hSnap,hProcess:THandle;
  
szBuffer:array[0..MAX_PATH] of char;
  
FileName:array[0..MAX_PATH] of char;
  
Process32:PROCESSENTRY32;
  
LoopFlag:BOOL;
begin
  Result
:=False;
  
//// List of snapshots of all processes 
  
hSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if 
hSnap=INVALID_HANDLE_VALUE then
  begin
    Result
:=False;
    Exit;
  
end;
  
Process32.dwSize:=sizeof(PROCESSENTRY32);
  
// Find process  
  
LoopFlag:=Process32First(hSnap,Process32);
  if 
LoopFlag=False then
  begin
    CloseHandle
(hSnap);
    
Result:=False;
    Exit;
  
end;
  while 
Integer(LoopFlag)<>0 do
    
begin
      
if Process32.th32ProcessID=GetCurrentProcessId() then
        begin
          hProcess
:=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Process32.th32ParentProcessID);
          if 
hProcess<>0 then
            begin
              
if GetModuleFileNameEx(hProcess,0,FileName,MAX_PATH)<>0 then
                begin
                  
//Get the system directory
                  
GetWindowsDirectory(szBuffer,MAX_PATH);
                  
//Merge the system directory and \ EXPLORER.EXE 
                  
StrCat(szBuffer,ParentName);
                  
//Converted to uppercase compare the current debugger after the process is the parent process
                  
if UpperCase(String(FileName))<>UpperCase(String(szBuffer)) then
                    Result
:=True
                  
else
                    
Result:=False;
                
end;
            
end
          
else
            
Result:=False;
        
end;
      
LoopFlag:=Process32Next(hSnap,Process32);
    
end;
  
CloseHandle(hSnap);
end; 
BeingDebugged: فحص القيمة BeingDebugged من خلال البنية PEB. طريقة مختصرة:
PHP كود :
//***************************************
//Use the PEB structure inspection OllyDBG 
//***************************************
function IsBeingDebugged:Boolean; //detection of the debugger
asm
  mov eax
,fs:[$30]
  
//Get PEB offset value 2h Department BeingDebugged
  
movzx eax,byte ptr[eax+$2]
end; 
... هذه أشهر الخدع، وهناك خدع أخرى...
التوابع السابقة موجهة لاكتشاف المنقح الشهير OllyDbg ويمكن تنفيذها على بقية برامج التنقيح بنفس المبدأ

طبعا كل الطرق السابقة يتم تجاوزها دون تعب، بسهولة باستخدام الإضافات (Plugins) الشهيرة
...لكن هناك خدعة صغيرة لم يبرمج لها أي Plugin حتى الآن Big Grin

قبل أن أطرح الكود، دعونا نجعله في تمرين صغير Wink
المثال مرفق لاكتشاف الخدعة، وهو مشفر بتوابع مكتوبة بدلفي سأرفقها أيضا

المطلوب: فك التشفير ثم اكتشاف اسم التابع/النمط المستخدم (المطلوب ليس الكسر، هذا ليس CrackMe)

ملاحظة: التشفير المستخدم يتسبب في False Positive لدى بعض المضادات (Kaspersky بالتجربة)
التمرين سهل جدا فلا تترددوا
بالتوفيق.


الملفات المرفقة
.rar   OllyDbgDetective.rar (الحجم : 7.93 ك ب / التحميلات : 92)
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد


الردود في هذا الموضوع
Anti-RCE & Anti-Debugger - بواسطة kachwahed - 26-05-2010, 03:09 PM
Anti-RCE & Anti-Debugger - بواسطة STRELiTZIA - 27-05-2010, 06:49 PM
Anti-RCE & Anti-Debugger - بواسطة kachwahed - 27-05-2010, 10:55 PM
Anti-RCE & Anti-Debugger - بواسطة خالد على22 - 07-02-2014, 12:04 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم