سؤال حول كتابة 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. 
الرد


الردود في هذا الموضوع
سؤال حول كتابة Plugin لتجاوز دالة IsDebuggerPresent - بواسطة Rever7eR - 01-04-2020, 07:09 PM

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


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