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)
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#2
السلام عليكم و رحمة الله

إقتباس :...لكن هناك خدعة صغيرة لم يبرمج لها أي plugin حتى الآن
GetStartupInfoA خدعة معروفة في عالم RCE و لا تعمل على المنقح الخاص بــIDA Pro

إقتباس :فك التشفير ثم اكتشاف اسم التابع/النمط المستخدم (المطلوب ليس الكسر، هذا ليس crackme)
التشفير يفك نفسه بالتتبع دون وجود عراقيل (AntiXXX) نقطة توقف عند الــ Jmp الأخير و منه F8 نصل الى EP الحقيقي...

الدالة المستدعلة مع خوارزمية التحقق:
[صورة: 022b.png]
الرد
#3
وعليكم السلام ورحمة الله
أولا: شكرا على المشاركة
ثانيا:
إقتباس :التمرين سهل جدا فلا تترددوا
أنت لست معني بالتمرين :laugh:
إقتباس :GetStartupInfoA خدعة معروفة في عالم RCE
قبل أن أطرح الموضوع جربت على Olly ثم WinDbg ثم IDA ولم يكتشف إلا مع IDA
الفكرة تعتمد على فحص بنية STARTUPINFO. المصدر (مترجم):
إقتباس :Check STARTUPINFO structural principle: Windows operating system when the explorer.exe process will create STARTUPINFO structure value set to 0, instead of explorer.exe when creating process will ignore the value of this structure, that is, the structure The value is not 0, so OD can use this to determine whether the debugger.
GetStartupInfoA للحصول على البنية STARTUPINFO
إقتباس :و لا تعمل على المنقح الخاص بــIDA Pro
لذلك قلت:
إقتباس :لاكتشاف المنقح الشهير OllyDbg
إقتباس :نقطة توقف عند الــ Jmp الأخير و منه F8 نصل الى EP الحقيقي...
كان يمكنك فعل ذلك من خلال Olly أيضا
أرفقت المثال، ومثال آخر لـ Magic_h2001 للكشف عن بعض ما يختبئ في Ring0 Big Grin
شكرا كثيرا :bye1:


الملفات المرفقة
.rar   Anti-Debugger.rar (الحجم : 4.84 ك ب / التحميلات : 78)
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#4
رائع أستاذ كاش

مقال غير إعتيادى كهذا لا يصدر إلا من أستاذ
بالتوفيق أخى
الرد


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


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