delphi4arab منتديات دلفي للعرب

نسخة كاملة : سؤال حول كتابة Plugin لتجاوز دالة IsDebuggerPresent
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
السلام عليكم ورحمة الله و بركاته 

أردت كتابة اضافة للمنقح لتجاوز دالة IsDebuggerPresent وواجهتني بعض المشاكل .
الفكرة كالتالي

1- جلب مقبض الملف المحمل الى المنقح لنسميه Target مثلا
2- استعمال الدالة NtQueryInformationProcess


PHP كود :
__kernel_entry NTSTATUS NtQueryInformationProcess(
  IN HANDLE           ProcessHandle,
  IN PROCESSINFOCLASS ProcessInformationClass,
  OUT PVOID           ProcessInformation,
  IN ULONG            ProcessInformationLength,
  OUT PULONG          ReturnLength
); 



البنية ProcessInformationClass تقوم بجلب مؤشر للبنية PEB التي تحوي على ال BeingDebugged Flag و الذي تستعمله الدالة IsDebuggerPresent في التعرف على المنقح !
3- التغيير على البايت BeingDebugged  يحتاج دالة WriteProcessMemory على ما أعتقد ؟
4- استعمال الدالة  ReadProcessMemory لقراءة البنية PEB
5- اكمال سير البرنامج
هل تحليلي صحيح ؟

المشاكل التي واجهتني حتى الان هي :

كيف احصل على مقبض ملف تنفيذي و هو قيد التنقيح ؟

كيف استعمل دالة WriteProcessMemory للتغيير على البايت BeingDebugged ؟

(قمت بالتجربة سابقا و فشلت في تغييرها , بدل القيمة 1 مثلا احصل عى قيمة عشوائية مثل 99...) طبعا القيمة غير مهمة مادامت لا تساوي الصفر , لكن اريد ان احصل على القيمة التي احددها انا , و ليس قيمة عشوائية ان شاء الله تكون مفهومة



[صورة: YkFGPPD.png]


حاليا اقوم بتجربة على ملف تنفيذي خارجي سميته Target و يستعمل الدالة IsDebuggerPresent


PHP كود :
type
  
//-----------------------------------------
 
PEB record
    Reserved1
: array [.. 1of Byte;
    BeingDebuggedByte;
    Reserved2Byte;
    Reserved3: array [.. 1of Pointer;
    LdrPointer;
    Reserved4: array [.. 102of Byte;
    Reserved5: array [.. 51of Pointer;
    PostProcessInitRoutinePointer;
    Reserved6: array [.. 127of Byte;
    Reserved7Pointer;
    SessionIdULONG;
  end;
  //-----------------------------------------
    PROCESS_BASIC_INFORMATION record
    Reserved1
Pointer;
    PebBaseAddressPointer;
    Reserved2: array [.. 1of Pointer;
    UniqueProcessIdcardinal;
    Reserved3Pointer;
  end;
  //-----------------------------------------
function NtQueryInformationProcess(ProcessHandleTHANDLEProcessInformationClassDWORDProcessInformationPointer;
ProcessInformationLengthULONGReturnLengthPULONG): LongIntstdcallexternal 'ntdll.dll';

procedure TForm1.Button1Click(SenderTObject);
  var
    TargetHandle THandle;
    ProcessBasicInfo PROCESS_BASIC_INFORMATION;
    length:cardinal;
    buf PAnsiChar;
    EB PEB;
    buffer byte;
begin
    TargetHandle 
:= findwindow(nil,'Target');
    memo1.Lines.add('handle : $' +IntToHex(TargetHandle,8));
    NtQueryInformationProcess(TargetHandle,0,@ProcessBasicInfo,sizeof(ProcessBasicInfo),@length);
    memo1.lines.Add('Pointer to PEB  : $' Format('%p', [ProcessBasicInfo.PebBaseAddress]));
    ReadProcessMemory(TargetHandle, @ProcessBasicInfo.PebBaseAddress, @EBsizeof(PEB), length);
    Memo1.Lines.Add('Being Debugged : ' IntToStr(EB.BeingDebugged));
    end;
end
هذا نموذج اولي Plugin ... 
وجدت طريقة جلب الملف التي يتم تنقيحه ....
المشكل الان هو ان نقاط التوقف لا تعمل داخل دلفي ؟  (أريد ان اتفقد ما اذا تم ملأ البنية PocessBasicInfo)
كود :
library AADebug;

uses
  SysUtils, plugin, Windows, Classes;

{$R *.res}

type
  PEB = record
    Reserved1: array [0 .. 1] of Byte;
    BeingDebugged: Byte;
  end;

  PROCESS_BASIC_INFORMATION = record
    Reserved1: Pointer;
    PebBaseAddress: Pointer;
  end;

resourcestring
  PLUGIN_NAME = 'Anti IsDebuggerPresent';

var
  g_hwndOlly: HWND;  // OllyDbg Window Handle
  ProcessBasicInfo : PROCESS_BASIC_INFORMATION;
  Length: Cardinal;
  EB : PEB;
  targethandle : Integer;

function ODBG_Plugininit(ollydbgversion: Integer; hWndOlly: HWND; features: PULONG): Integer; cdecl;
begin
  g_hwndOlly := hWndOlly;
  Addtolist(0, 0, PAnsiChar(PLUGIN_NAME));
  Result := 0;
end;

function ODBG_Plugindata(name: PChar): Integer; cdecl;
begin
  StrLCopy(name, PChar(PLUGIN_NAME), 32);
  Result := PLUGIN_VERSION;
end;

function NtQueryInformationProcess(ProcessHandle: THANDLE;
                                   ProcessInformationClass: DWORD;
                                   ProcessInformation: Pointer;
                                   ProcessInformationLength: ULONG;
                                   ReturnLength: PULONG): LongInt;
                                   stdcall; external 'ntdll.dll';


procedure Getinfo;
begin
  targethandle := PluginGetValue(VAL_HPROCESS);
  MessageBox(g_hwndOlly, PChar(IntToHex(targethandle,8)), PChar('info'), MB_ICONINFORMATION);
  NtQueryInformationProcess(targethandle, 0, @ProcessBasicInfo, sizeof(PEB), @length);
end;

procedure ODBG_Pluginaction(origin: Integer; action: Integer; pItem: Pointer); cdecl;
begin
  if (origin = PM_MAIN) then
  begin
    Getinfo;
  end;
end;

exports
  ODBG_Plugininit    name '_ODBG_Plugininit',
  ODBG_Plugindata    name '_ODBG_Plugindata',
  ODBG_Pluginaction  name '_ODBG_Pluginaction';
begin

end.
يبدو ان مثل هذه المواضيع لا تلقى ترحيب مثل ما كانت سابقا ؟
اغلب المواضيع حاليا تتمحور حول مشاكل قواعد البيانات ! لا باس ...
السلام عليكم للاسف الكثير من الاعضاء المميزين رحلو عن المنتدى...
شكرا على المشاركة المفيدة
ساقوم بنقل الموضوع الى دلفي والتعامل مع النظام و الذاكرة
(03-04-2020, 01:49 AM)Rever7eR كتب : [ -> ]يبدو ان مثل هذه المواضيع لا تلقى ترحيب مثل ما كانت سابقا ؟
اي موضوع مرحب به والدليل رد مشرفين بالموضوع...
عندما لا تجد رد اصبر حتى يشاهده من له باع بالأمر ولا تتفاجئ ان لم يفهم الموضوع 90%
كود :
function GetProcessIsBeingDebugged(ProcessHandle: THandle; var IsBeingDebugged: Boolean): Boolean;
var
  DebugPort: PVOID;
  TargetProcessHandle: THandle;
  SourceProcessHandle: THandle;
  DuplicateResult: BOOL;
  DesiredAccess: ACCESS_MASK;
begin
  Result := False;
  try
    if (@NtQueryInformationProcess <> nil) then
    begin
      DuplicateResult := False;
      TargetProcessHandle := 0;
      DuplicateResult := DuplicateHandle(GetCurrentProcess(), ProcessHandle, GetCurrentProcess(), @TargetProcessHandle, 0, False, DUPLICATE_SAME_ACCESS);
      if DuplicateResult then
      begin
        try
          if NtQueryInformationProcess(
            TargetProcessHandle,
            7,
            @DebugPort,
            SizeOf(PVOID),
            nil
            ) = 0 then
            Result := True;
          if DebugPort <> nil then
            IsBeingDebugged := True;
        finally
          if TargetProcessHandle <> 0 then
            CloseHandle(TargetProcessHandle);
        end;
      end;
    end;
  except
  end;
end;
(03-04-2020, 01:56 PM)Hs32-Idir كتب : [ -> ]
كود :
function GetProcessIsBeingDebugged(ProcessHandle: THandle; var IsBeingDebugged: Boolean): Boolean;
var
  DebugPort: PVOID;
  TargetProcessHandle: THandle;
  SourceProcessHandle: THandle;
  DuplicateResult: BOOL;
  DesiredAccess: ACCESS_MASK;
begin
  Result := False;
  try
    if (@NtQueryInformationProcess <> nil) then
    begin
      DuplicateResult := False;
      TargetProcessHandle := 0;
      DuplicateResult := DuplicateHandle(GetCurrentProcess(), ProcessHandle, GetCurrentProcess(), @TargetProcessHandle, 0, False, DUPLICATE_SAME_ACCESS);
      if DuplicateResult then
      begin
        try
          if NtQueryInformationProcess(
            TargetProcessHandle,
            7,
            @DebugPort,
            SizeOf(PVOID),
            nil
            ) = 0 then
            Result := True;
          if DebugPort <> nil then
            IsBeingDebugged := True;
        finally
          if TargetProcessHandle <> 0 then
            CloseHandle(TargetProcessHandle);
        end;
      end;
    end;
  except
  end;
end;

شكرا استاذ
لماذا ضاعفت الهاندل ؟
(03-04-2020, 09:44 AM)S.FATEH كتب : [ -> ]السلام عليكم للاسف الكثير من الاعضاء المميزين رحلو عن المنتدى...

اجل لاحظت ذلك أيضا للأسف .

(03-04-2020, 09:51 AM)onexite كتب : [ -> ]شكرا على المشاركة المفيدة
ساقوم بنقل الموضوع الى دلفي والتعامل مع النظام و الذاكرة

ليست مفيدة ما دمت لم اتوصل الى حل بعد  Big Grin العفو اخي العزيز

(03-04-2020, 01:37 PM)B.M.AbdelAziZ كتب : [ -> ]اي موضوع مرحب به والدليل رد مشرفين بالموضوع...
عندما  لا تجد رد اصبر حتى يشاهده من له باع بالأمر ولا تتفاجئ ان لم يفهم الموضوع 90%

صحيح , شكرا لك استاذ و اعتذر عن ما قلت سابقا  Blush

(03-04-2020, 01:56 PM)Hs32-Idir كتب : [ -> ]function GetProcessIsBeingDebugged(ProcessHandle: THandle; var IsBeingDebugged: Boolean): Boolean

شكرا على اهتمامك اخي العزيز لكن الدالة لا تعمل , لاحظت ان لها 2 برامترات ؟ اظن انها تحتاج بارامتر واحد و هو مقبض الملف على ما أظن ؟ لأن المتغير IsBeingDebugged هو ما نبحث عنه و ليس هو ما نمرره للدالة ؟ هذا ما فهمته و الله اعلم ايضا لاحظت انك استعملت PVOID في تعريف المتغير DebugPort الاصح هو Pointer على ما اعتقد . اذا كنت على خطأ فالرجاء ترشدني للطريقة الصحيحة من فضلك
في حالتي ، تتحقق الوظيفة مما إذا كانت process is Being Debugged ، لذا إذا كان صحيحًا ، فيمكنك محاولة فصلها عن Debugger
هذه ترجمة C ++ ، في دلفي PVOID = POINTER
لجعلها تعمل حاولRunAsAdmin
اجعله يعمل تحت المؤقت (Timer)
فيمكنك محاولة فصلها ب NtRemoveProcessDebug

آسف للغتي ، لدي لوحة مفاتيح ,qwerty
هل يمكنني النشر باللغة الإنجليزية أو لغات أخرى

(03-04-2020, 10:07 PM)حسن لطفى كتب : [ -> ]
(03-04-2020, 01:56 PM)Hs32-Idir كتب : [ -> ]
كود :
function GetProcessIsBeingDebugged(ProcessHandle: THandle; var IsBeingDebugged: Boolean): Boolean;
var
  DebugPort: PVOID;
  TargetProcessHandle: THandle;
  SourceProcessHandle: THandle;
  DuplicateResult: BOOL;
  DesiredAccess: ACCESS_MASK;
begin
  Result := False;
  try
    if (@NtQueryInformationProcess <> nil) then
    begin
      DuplicateResult := False;
      TargetProcessHandle := 0;
      DuplicateResult := DuplicateHandle(GetCurrentProcess(), ProcessHandle, GetCurrentProcess(), @TargetProcessHandle, 0, False, DUPLICATE_SAME_ACCESS);
      if DuplicateResult then
      begin
        try
          if NtQueryInformationProcess(
            TargetProcessHandle,
            7,
            @DebugPort,
            SizeOf(PVOID),
            nil
            ) = 0 then
            Result := True;
          if DebugPort <> nil then
            IsBeingDebugged := True;
        finally
          if TargetProcessHandle <> 0 then
            CloseHandle(TargetProcessHandle);
        end;
      end;
    end;
  except
  end;
end;

شكرا استاذ
لماذا ضاعفت الهاندل ؟
لجعلهم same access
مناسب للعمل في process المستهدفة.
الصفحات : 1 2