01-04-2020, 07:09 PM
السلام عليكم ورحمة الله و بركاته
أردت كتابة اضافة للمنقح لتجاوز دالة IsDebuggerPresent وواجهتني بعض المشاكل .
الفكرة كالتالي
1- جلب مقبض الملف المحمل الى المنقح لنسميه Target مثلا
2- استعمال الدالة NtQueryInformationProcess
البنية ProcessInformationClass تقوم بجلب مؤشر للبنية PEB التي تحوي على ال BeingDebugged Flag و الذي تستعمله الدالة IsDebuggerPresent في التعرف على المنقح !
3- التغيير على البايت BeingDebugged يحتاج دالة WriteProcessMemory على ما أعتقد ؟
4- استعمال الدالة ReadProcessMemory لقراءة البنية PEB
5- اكمال سير البرنامج
هل تحليلي صحيح ؟
المشاكل التي واجهتني حتى الان هي :
كيف احصل على مقبض ملف تنفيذي و هو قيد التنقيح ؟
كيف استعمل دالة WriteProcessMemory للتغيير على البايت BeingDebugged ؟
(قمت بالتجربة سابقا و فشلت في تغييرها , بدل القيمة 1 مثلا احصل عى قيمة عشوائية مثل 99...) طبعا القيمة غير مهمة مادامت لا تساوي الصفر , لكن اريد ان احصل على القيمة التي احددها انا , و ليس قيمة عشوائية ان شاء الله تكون مفهومة
حاليا اقوم بتجربة على ملف تنفيذي خارجي سميته Target و يستعمل الدالة IsDebuggerPresent
أردت كتابة اضافة للمنقح لتجاوز دالة 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...) طبعا القيمة غير مهمة مادامت لا تساوي الصفر , لكن اريد ان احصل على القيمة التي احددها انا , و ليس قيمة عشوائية ان شاء الله تكون مفهومة
حاليا اقوم بتجربة على ملف تنفيذي خارجي سميته 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.