سؤال حول كتابة Plugin لتجاوز دالة IsDebuggerPresent
#1
السلام عليكم ورحمة الله و بركاته 

أردت كتابة اضافة للمنقح لتجاوز دالة 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 [0 .. 1] of Byte;
    BeingDebugged: Byte;
    Reserved2: Byte;
    Reserved3: array [0 .. 1] of Pointer;
    Ldr: Pointer;
    Reserved4: array [0 .. 102] of Byte;
    Reserved5: array [0 .. 51] of Pointer;
    PostProcessInitRoutine: Pointer;
    Reserved6: array [0 .. 127] of Byte;
    Reserved7: Pointer;
    SessionId: ULONG;
  end;
  //-----------------------------------------
    PROCESS_BASIC_INFORMATION = record
    Reserved1
: Pointer;
    PebBaseAddress: Pointer;
    Reserved2: array [0 .. 1] of Pointer;
    UniqueProcessId: cardinal;
    Reserved3: Pointer;
  end;
  //-----------------------------------------
function NtQueryInformationProcess(ProcessHandle: THANDLE; ProcessInformationClass: DWORD; ProcessInformation: Pointer;
ProcessInformationLength: ULONG; ReturnLength: PULONG): LongInt; stdcall; external 'ntdll.dll';

procedure TForm1.Button1Click(Sender: TObject);
  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, @EB, sizeof(PEB), length);
    Memo1.Lines.Add('Being Debugged : ' + IntToStr(EB.BeingDebugged));
    end;
end. 
الرد
#2
هذا نموذج اولي 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.
[-] كل من 1 user says قال شكرا ل Rever7eR على المشاركة المفيدة
  • onexite
الرد
#3
يبدو ان مثل هذه المواضيع لا تلقى ترحيب مثل ما كانت سابقا ؟
اغلب المواضيع حاليا تتمحور حول مشاكل قواعد البيانات ! لا باس ...
الرد
#4
السلام عليكم للاسف الكثير من الاعضاء المميزين رحلو عن المنتدى...
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
[-] كل من 1 user says قال شكرا ل S.FATEH على المشاركة المفيدة
  • Rever7eR
الرد
#5
شكرا على المشاركة المفيدة
ساقوم بنقل الموضوع الى دلفي والتعامل مع النظام و الذاكرة
[-] كل من 1 user says قال شكرا ل onexite على المشاركة المفيدة
  • Rever7eR
الرد
#6
(03-04-2020, 01:49 AM)Rever7eR كتب : يبدو ان مثل هذه المواضيع لا تلقى ترحيب مثل ما كانت سابقا ؟
اي موضوع مرحب به والدليل رد مشرفين بالموضوع...
عندما لا تجد رد اصبر حتى يشاهده من له باع بالأمر ولا تتفاجئ ان لم يفهم الموضوع 90%
رَبَّنَا اغْفِرْ لِي وَلِوَالِدَيَّ وَلِلْمُؤْمِنِينَ يَوْمَ يَقُومُ الْحِسَابُ
[-] كل من 1 user says قال شكرا ل محمد عبد العزيز على المشاركة المفيدة
  • Rever7eR
الرد
#7
كود :
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;
الرد
#8
(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;

شكرا استاذ
لماذا ضاعفت الهاندل ؟
الرد
#9
(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 على ما اعتقد . اذا كنت على خطأ فالرجاء ترشدني للطريقة الصحيحة من فضلك
الرد
#10
في حالتي ، تتحقق الوظيفة مما إذا كانت 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 المستهدفة.
الرد


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


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