مشاهدة النسخة كاملة : [تمرين] الكل يسأل و الكل يجيب
STRELiTZIA
05-08-2009, 06:47 PM
السلام عليكم و رحمة الله
موضوع التمرين :
يضع اي عضو دالة يختارها هو و يحاول باقي الأعضاء شرح هدفها و برامتراتها دون البحث في النت، يعتمدون فقط على معلوماتهم في البرمجة :D
ابدا انا :
function MoveFileEx(ExistingFileName: PChar; NewFileName: PChar; Flags: DWORD): Boolean; stdcall; external
'Kernel32.dll' Name 'MoveFileExA';
و هذه طريقة استدعاءها.
MoveFileEx(PChar(FileName), nil, MOVEFILE_DELAY_UNTIL_REBOOT);
بالتوفيق ان شاء الله
Goblin
05-08-2009, 08:48 PM
فكرة جيدة ! سابدأ بدالة معروفة:
ما هي الدالة DialogBoxParam ؟
mohfa
05-08-2009, 09:24 PM
MoveFileEx(PChar(FileName), nil, MOVEFILE_DELAY_UNTIL_REBOOT);
اخي STRELiTZIA هنا تقصد حذف الملف FileName عند اعادة تشغيل ال Win , هل صلحت معك اقصد هل جربتها و تم بالفعل حذف الملف المراد بعد اعادة تشغيل ال Win ؟
لاني رائت ان اغلب المبرمجين يشتكون من عدم فاعليتها ومنهم كاتب التعقيب ...:D
راقب ال Quee في ال SessionManager لل Regedit ولاحظ كيف يكون مسار الملف المراد حذفه ...
hanipino
06-08-2009, 07:01 AM
هل ممكن الاستعانة بال Help :)
STRELiTZIA
06-08-2009, 10:09 AM
اخي STRELiTZIA هنا تقصد حذف الملف FileName عند اعادة تشغيل ال Win , هل صلحت معك اقصد هل جربتها و تم بالفعل حذف الملف المراد بعد اعادة تشغيل ال Win ؟
لاني رائت ان اغلب المبرمجين يشتكون من عدم فاعليتها ومنهم كاتب التعقيب ...:D
راقب ال Quee في ال SessionManager لل Regedit ولاحظ كيف يكون مسار الملف المراد حذفه ...
نعم اخي mohfa جربتها و هي تعمل بنجاح...
المرفق لـــ Michael Puff - من احست المبرمجين الذين يعتمدون على دوال الــ API - يحتوي على مثال تطبيقي مع الملفات المصدرية.
هل ممكن الاستعانة بال Help
طبعا اخي hanipino فالهدف هو التعلم :) و لكن كآخر وسيلة...
يمنع فقط النسخ و اللصق الغبي :D للتعاريف و ارفاقها،
ما هي الدالة DialogBoxParam ؟
اخي Goblin حاول عمل Context للسؤال لما تريد مع اضافة برامترات معينة للدالة التي وضعت.
بالتوفيق ان شاء الله
mohfa
06-08-2009, 10:21 AM
اخي STRELiTZIA من فظلك راقب ال File Delete Quee في ال Session Manager و ستعرف عن ماذا انا اتكلم .
راقب مسار الملف الموضوع في ال Quee .
ملاحظة في ال Win7 الوضع تغيير تماما .
STRELiTZIA
06-08-2009, 10:44 AM
هذا :
\??\C:\Documents and Settings\Utilisateur\Bureau\DelFileOnReboot\Test.t xt
هل تعاملت من قبل مع مسارات الملفات انطلاقا من Driver :D
اليك مثال حصري لا وجود له في النت اطلاقا من انتاج Delphi4Arab يمكنك تجربته :
unit driver;
interface
uses Windows, nt_status, native, hal, fcall, macros, ntoskrnl;
function _DriverEntry(DriverObject: PDriverObject; RegistryPath: PUnicodeString): NTSTATUS; stdcall;
implementation
procedure DriverUnload(pDriverObject: PDriverObject); stdcall;
begin
DbgPrint('Test Driver :: Unloaded');
end;
function _DriverEntry(DriverObject: PDriverObject; RegistryPath: PUnicodeString): NTSTATUS; stdcall;
var UNICODESTRING: UNICODE_STRING;
obj: OBJECT_ATTRIBUTES;
begin
DbgPrint('Test Driver :: Loaded');
DriverObject^.DriverUnload := @DriverUnload;
RtlInitUnicodeString(UNICODESTRING, '\??\C:\test.exe');
InitializeObjectAttributes(obj, @UNICODESTRING, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, 0, nil);
Result := ZwDeleteFile(@obj);
if Result = STATUS_SUCCESS then
begin
DbgPrint('File deleted sucessfully Result:0x%.8X', Result);
end else
begin
DbgPrint('Fail to Delete File Result:0x%.8X', Result);
DbgPrint('Object name :%wZ', obj.ObjectName);
end;
Result := STATUS_SUCCESS;
end;
end.
mohfa
06-08-2009, 12:22 PM
لم تفهم قصدي اخي STRELiTZIA او يمكن انني لم اعرف كيف اوصل لك الفكرة :
في ال MSDN تجد انه عندما يتم استعمال ال MOVEFILE_DELAY_UNTIL_REBOOT فان الملف المراد اعادة تسميته او حذفه يسكون في الطابور او ال Quee تحت ال PendingFileRenameOperations تحت ال HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager
ولكن المشكلة في بعض الاحيان ان مسار الملف لايكون كاملا مثلا تجده :
C:\Documents and Settings\Utilisateur\Bureau\DelFileOnReboot\Test.t xt
احيان اخرى لايوجد اصلا اي ملف او مسار في ال Quee ايان اخرى تجده Relative Path .
انظر هذا التعقيب : http://support.microsoft.com/kb/202071/en-us
***
هل تعاملت من قبل مع مسارات الملفات انطلاقا من Driver
ومارئك اخي STRELiTZIA ؟؟؟:D
طبعا عزيزي STRELiTZIA :D
STRELiTZIA
06-08-2009, 12:44 PM
ومارئك اخي STRELiTZIA ؟؟؟
:D:D:D
اعلم ايضا انك بدات البرمجة قبلي بسنين :D
على كل حال لتفادي اي اشكال مع صلاحيات النظام و طبيعة الملف المراد حذفه في قبول اوامر الدالة : MoveFileExA
افضل طريقة الكاسبر في استعمال الدرايفر في حذف الملفات مع اعادة التشغيل...
mohfa
06-08-2009, 12:56 PM
اخي STRELiTZIA ال KAV يستعمل الطريقة نفسها في التعامل مع الملفات الملراد خذفها باستعمال نفس الدالة مع او عدم استعمال Driver لهذا الغرض لان النتيجة واحدة في الاخير .
سوف اعطيك مثال :
اجعل ال KAV يضع ملف في ال Delet after reboot Quee و قم انت يتحريك الملف في ال Quee اقصد مثلا من المرتبة 1 الى 2 او العكس - لان الترتيب جد مهم و حساس في ال Delete File after reboot Quee ..
و سترى النتيجة :
اما ان ال KAV يعتبر ان الملف قد تم جذفه او انه يعطيك نفس الرسالة عند ما قام بالمسح و ايجاده للملف الذي وضعه في الطابور .
رغم ان الملف لم يتم حذفه وهو موجود و كذلك موجود في الطابور لهذا ال OS في كل مرة يقوم بتنفيذ ال Session Manager سوف يبجث على نفس الملف يعني Looping thru same file او مايدعى بال LTF .
الحل الوحيد انك تعمل MMF للملف المراد حذفه و تقوم انت بال Force Deleting وبالطبع هذا خطير جدا .
**
حسب علمي ال KAV يستعمل ال MoveFileExW للتنعامل مع ال Unicode لان النظام يتعامل بنسبة 98% بال Unicode
شكرا اخي STRELiTZIA على فتح هكذا مواضيع .
بالتوفيق
STRELiTZIA
06-08-2009, 01:59 PM
شكرا اخي strelitzia على فتح هكذا مواضيع .
بارك الله فيكم انتم اخواني اعضاء المنتدى على اثراء المواضيع...
فكرة رائعة بارك الله فيك يا أستاذ :D:
الدالة ZwLoadDriver
Function ZwLoadDriver;External 'NtDll.Dll' Name 'ZwLoadDriver';
1- الهدف من الدالة : تحميل الدريفر للنظام أما عن مود التحميل لا أعلم .. ؟؟.
2- لها براماتر وحيد (هل كتابة الدالة صحيحة ؟؟؟) :
Function ZwLoadDriver(DriverServiceName:PUNICODE_STRING):NT STATUS; stdcall;
In_DriverServiceName : اليونيكوند الخاص بتحويل مسار الدريفر من الريجيستري نتحصل عليه بالدالة :
RtlInitUnicodeString مثال :
Registry > Machine > SystemCurrent > ControlSet > Services > DriverName
Var UNICODESTRING: PUNICODE_STRING;
RtlInitUnicodeString(UNICODESTRING,'Machine\System \CurrentControlSet\Services\DriverName.Sys');
ZwLoadDriver(UNICODESTRING);
في إنتظار التصحيح .. بالتوفيق ,,
ممكن أخطأت في المثال :
procedure RtlInitUnicodeString; external 'ntoskrnl.exe' name 'RtlInitUnicodeString';
var UNICODESTRING: UNICODE_STRING;
obj_Attrib: OBJECT_ATTRIBUTES;
RtlInitUnicodeString(UNICODESTRING, 'Machine\System\CurrentControlSet\Services\DriverN ame.Sys');
InitializeObjectAttributes(obj_Attrib, @UNICODESTRING, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, 0, nil);
ZwLoadDriver (@obj_Attrib);
STRELiTZIA
08-08-2009, 01:56 PM
الدالة zwloaddriver
يعني الحكاية اليوم على الدرافرات :Cup:
في انتظار تعاليق الاخوة اولا :crazy:
STRELiTZIA
09-08-2009, 11:44 AM
السلام عليكم و رحمة الله
ممكن أخطأت في المثال :
الدالة تنتظر براميتر من نوع Pointer على المسار الريجستري الذي هو بدوره Unicode.
1- يجب ان يكون الدرايفر مسجل من قبل في النظام لتستطيع الدالة تحميلة و تشغيله.
2- الدالة لا تعمل Unload يجب استدعاء الدالة ZwUnloadDriver لتحرير الدرايفر - تعمل بنفس برامترات دالة التحميل.
ZwLoadDriver (@obj_Attrib);
لا...... ادخال البراميتر بهذه الطريقة يعتبر خطأ قاتل : BSOD :bangin: Blue Screen of Death
لا يوجد عندك Object بل مسار ريجيستري unicode فقط.
http://img411.imageshack.us/img411/144/bsod.png
المرفق يحتوي على مثال تطبيقي للدالة :
طريقة كتابة الدالة، لم اغير هيكل الدالة الأولى لعدم تعقيد الأمور.
function _DriverEntry(DriverObject: PDriverObject; RegistryPath: PUnicodeString): NTSTATUS; stdcall;
var UNICODESTRING: UNICODE_STRING;
begin
DbgPrint('Test Driver :: Loaded');
DriverObject^.DriverUnload := @DriverUnload;
RtlInitUnicodeString(UNICODESTRING, '\Registry\Machine\System\CurrentControlSet\Servic es\ZwDeleteFile');
Result := ZwLoadDriver(@UNICODESTRING);
if Result = STATUS_SUCCESS then
begin
DbgPrint('Driver loaded sucessfully Result:0x%.8X', Result); // Result to get Error Code
end else
begin
DbgPrint('Fail to load driver Result:0x%.8X', Result); // Result to get Error Code
end;
Result := STATUS_SUCCESS;
end;
اخي TF6M الطريقة التي كتبت اولا و ظننت انك اخطأت فيها هي الصحيحة :thumbsup:
قارن بين الكود الذي وضعت و ستجد الأخطاء التي يجب اصلاحها...
طريقة استعمال المرفق :
يــــــرجى اتباع المراحل بالترتيب الدقيق.
- تشغيل الأداة Dbgview لاتقاط رسائل الكرنل.
- تشغيل نسخة من اداة KmdManager و اختيار درايفر ZwDeleteFile
- تسجيل فقط الدرايفر ZwDeleteFile.
- تشغيل نسخة ثانية من اداة KmdManager و اختيار الدرايفر ZwLoadDriver.
- تسجيل و تشغيل الدرايفر ZwLoadDriver.
و بالطبع الاطلاع على رسائل الكرنل التي تظهر في DbgView.
يعني اننا سنقوم بتشغيل الدرايفر ZwLoadDriver و منه يتم استدعاء دايفر ثاني مسجل في النظام اسمه ZwDeleteFile و هذا الأخير يحاول حدف ملف تجريبي اسمه test.exe موجود في قرص C.
بالتوفيق ان شاء الله
السلام عليكم
1- يعن بواسطة الدريفر ZwLoadDriver حملنا الدريفر ZwDeleteFile المسجل مسبقا في الريجيستري .
2- طريقة كتابة الدالة بالدلفي ؟؟ ... يعني صحيحة لكن أين أضيفها هل في System أم في NtDll
3- الدالة ZwCreateFile و توزظيفها هي نفسها CreateFile في الـ User Mode :
ملاحظة : لكن إذا أردنا أن نستدعيها من الـ User Mode نستعمل NtCreateFile في مكان ZwCreateFile .
المثال :
uses
nt_status, ntoskrnl, ntifs, native, winioctl, fcall, macros;
Var
RtnCode: NTSTATUS;
oa: OBJECT_ATTRIBUTES;
iosb: IO_STATUS_BLOCK;
hDirectory: HwnD;
{ function _DriverEntry(pDriverObject:PDRIVER_OBJECT;
pusRegistryPath:PUNICODE_STRING): NTSTATUS; stdcall;}
RtnCode := ZwCreateFile(@hDirectory, SYNCHRONIZE, @oa, @iosb, nil,
FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN_IF,
FILE_DIRECTORY_FILE + FILE_SYNCHRONOUS_IO_NONALERT,
nil, 0);
if RtnCode = STATUS_SUCCESS then
begin
if iosb.Information = FILE_CREATED then
begin
DbgPrint('FileWorks: Directory created'#13#10);
end else if iosb.Information = FILE_OPENED then
begin
DbgPrint('FileWorks: Directory exists and was opened'#13#10);
end;
ZwClose(hDirectory);
end;
- بالطبع نتيجة الدالة من NTSTATUS لأن كل رقم مرجع يوافق حالة ما مسجلة مسبقا أو غير مسجلة في الوحدة nt_status كما يمكننا أن نستعمل حاصل دالة IoStatusBlock كالـ IoResult لتحقق من الأخطاء .
- صيغة الدالة (****ا أن تكون صحيحة) :
Function ZwCreateFile(FileHandle:PHANDLE; DesiredAccess:ACCESS_MASK;ObjectAttributes:POBJECT _ATTRIBUTES;
IoStatusBlock:PIO_STATUS_BLOCK ;AllocationSize:PLARGE_INTEGER ;
FileAttributes,ShareAccess,CreateDisposition,Creat eOptions:ULONG ;
EaBuffer:PVOID;EaLength:ULONG):NTSTATUS;StdCall;
بالتوفيق ,,
AvimimuS
09-08-2009, 10:45 PM
السلام عليكم
function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle;Stdcall;
External'kernel32.dll' Name 'CreateToolhelp32Snapshot';
1-شرح هدفها
2-كيفية ادخال ال Parameters الخاصة بهذه الدالة
ان شاء الله غدا في مثل هذا الوقت ساضع الشرح مع مثال توضيحي
STRELiTZIA
10-08-2009, 01:01 PM
السلام عليكم
- صيغة الدالة (****ا أن تكون صحيحة) :
بالتوفيق ,,
و عليكم السلام و رحمة الله
جيد اخي TF6M اخذت المثال الخاص بــ KmdKit4D :thumbsup:
نفس الدالة بعد بعض التعديل و التنظيم.
function _DriverEntry(DriverObject: PDriverObject; RegistryPath: PUnicodeString): NTSTATUS; stdcall;
var
UnicodeDirPath: UNICODE_STRING;
UnicodeFilePath: UNICODE_STRING;
DirObject: OBJECT_ATTRIBUTES;
FileObject: OBJECT_ATTRIBUTES;
hDirectory: THANDLE;
hFile: THANDLE;
IOSTATUSBLOCK: IO_STATUS_BLOCK;
begin
DbgPrint('Test Driver :: Loaded');
DriverObject^.DriverUnload := @DriverUnload;
RtlInitUnicodeString(UnicodeDirPath, '\??\C:\Delphi4Arab');
RtlInitUnicodeString(UnicodeFilePath, '\??\C:\Delphi4Arab\Test.txt');
InitializeObjectAttributes(DirObject, @UnicodeDirPath, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, 0, nil);
InitializeObjectAttributes(FileObject, @UnicodeFilePath, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, 0, nil);
Result := ZwCreateFile(@hDirectory,
SYNCHRONIZE,
@DirObject,
@IOSTATUSBLOCK,
nil,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OPEN_IF,
FILE_DIRECTORY_FILE + FILE_SYNCHRONOUS_IO_NONALERT,
nil,
0);
if Result = STATUS_SUCCESS then
begin
if IOSTATUSBLOCK.Information = FILE_CREATED then
begin
DbgPrint('Directory Created Sucessfully');
end else
if IOSTATUSBLOCK.Information = FILE_OPENED then
begin
DbgPrint('Directory Already Exists and Was Opened');
end;
ZwClose(hDirectory);
end;
Result := ZwCreateFile(@hFile,
SYNCHRONIZE,
@FileObject,
@IOSTATUSBLOCK,
nil,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_CREATE,
FILE_SYNCHRONOUS_IO_NONALERT,
nil,
0);
if Result = STATUS_SUCCESS then
begin
DbgPrint('File Created Sucessfully');
ZwClose(hFile);
end else
begin
DbgPrint('Can''t Create File - Already Exists Status: %08X', Result);
end;
Result := STATUS_SUCCESS;
end;
الدريفر مرفق ايضا.
شكرا بارك الله فيك .
فقط ماذا عن 1,2 .
STRELiTZIA
10-08-2009, 01:43 PM
شكرا بارك الله فيك .
فقط ماذا عن 1,2 .
1- يعن بواسطة الدريفر ZwLoadDriver حملنا الدريفر ZwDeleteFile المسجل مسبقا في الريجيستري .
دالة LoadDriver سواء كان استدعائها من الــ User mode او الــ Kernel modeتحمل فقط الدرايفرات المسجلة مسبقا في النظام.
نعم في المثال السابق قمنا بتحميل درايفر ZwDeleteFile.sys انطلاقا من الــ kernel mode بواسطة الدرايفر ZwLoadDriver.sys.
2- طريقة كتابة الدالة بالدلفي ؟؟ ... يعني صحيحة لكن أين أضيفها هل في System أم في NtDll
لا...
اذا اردت التعامل مع تصديرات Exports الكرنل ntoskrnl.exe يجب اضافتها في المكتبة الأصلية ntoskrnl.pas الخاصة بــ KmdKit4D.
بالتوفيق ان شاء الله
AvimimuS
11-08-2009, 02:14 PM
السلام عليكم
الشرح عام ومبسط
دور الدالة هو الحصول على قائمة البرامج النشطة في الذاكرة.
بالنسبة البراماتر الاول يحدد ما المراد ارجاعه
th32ProcessID البرامترالثاني ياخذ رقم التعريف الخاص ب ال Process
Var
Handle: THandle;
Struc: TProcessEntry32;
begin
AdjustProcessPrivilege(GetCurrentProcess,'SeDebugP rivilege');
begin
Handle:=CreateToolHelp32SnapShot($00000002, 0);
Struc.dwSize:=Sizeof(TProcessEntry32);
if Process32First(Handle, Struc) then
ProcList.Items.Add(Struc.szExeFile);
while Process32Next(Handle, Struc) do
ProcList.Items.Add(Struc.szExeFile);
end;
end;
بالنسبة لدالة AdjustProcessPrivilege فهي تعطينا صلاحيات في النظام لاضهار processes
المثال التوضيحي مرفق
STRELiTZIA
11-08-2009, 06:31 PM
و عليكم السلام و رحمة الله
الشرح عام ومبسط
جيد جدا :Cup:
ماذا لو اردنا اغلاق Process معين ؟ :g:
o15s19
11-08-2009, 09:00 PM
ماذا لو اردنا اغلاق Process معين ؟ :g:
شرح مبسط
TerminateProcess(hProcess,0)
و hProcess نحصل عليها بواسطة
OpenProcess(PROCESS_TERMINATE,binheritHandle,dwPro cessID)
و dwProcessID نحصل عليها من
TProcessEntry32.th32ProcessID
STRELiTZIA
20-08-2009, 12:40 PM
السلام عليكم
الشرح عام ومبسط
دور الدالة هو الحصول على قائمة البرامج النشطة في الذاكرة.
بالنسبة البراماتر الاول يحدد ما المراد ارجاعه
th32ProcessID البرامترالثاني ياخذ رقم التعريف الخاص ب ال Process
Var
Handle: THandle;
Struc: TProcessEntry32;
begin
AdjustProcessPrivilege(GetCurrentProcess,'SeDebugP rivilege');
begin
Handle:=CreateToolHelp32SnapShot($00000002, 0);
Struc.dwSize:=Sizeof(TProcessEntry32);
if Process32First(Handle, Struc) then
ProcList.Items.Add(Struc.szExeFile);
while Process32Next(Handle, Struc) do
ProcList.Items.Add(Struc.szExeFile);
end;
end;
بالنسبة لدالة AdjustProcessPrivilege فهي تعطينا صلاحيات في النظام لاضهار processes
المثال التوضيحي مرفق
السلام عليكم و رحمة الله
كل من حمل و جرب المرفق الخاص بالمشاركة :
http://www.delphi4arab.com/forum/showpost.php?p=9604&postcount=20
يقوم بفحص جهازه... المرفق ملوث بفيروس : W32/Induc-A
http://www.delphi4arab.com/forum/showthread.php?p=9745#post9745
بالتوفيق ان شاء الله
AvimimuS
23-08-2009, 12:07 PM
المرفق ملوث بفيروس : W32/Induc-A
وعليكم السلام ورحمة الله وبركاته
بالنسبة لمرفق اسف لم اكن علي علم بانه ملوث بهذا الفيروس :monster2:
عملت مثال ZwCreateFile بطريقتين :
1- طريقة xxagri من موقعKmD
2- طريقة STRELiTZIA
لكن المشكل عند فتح الدريفر بـ Cff أجد أن المثال الدي أرفقه STRELiTZIA يحمل 17 دالة أما :
(1) يحمل دالتين .
(2) يحمل 3 دوال .
- عند تجريب كل منهما يطفأ الجهاز و الحمد لله نجوت من BSOD :oops: .
أنتظر ملاحظاتكم ؟؟؟ .
STRELiTZIA
27-08-2009, 05:05 PM
السلام عليكم و رحمة الله
- عند تجريب كل منهما يطفأ الجهاز و الحمد لله نجوت من BSOD
مبروك عليك اول BSOD :) لقد اختنق الجهاز :monster2:
نعم طريقة تحليلك صحيحة 100% المشكل في الــ Imports.
هل استعملت السروس الذي وضعته في هذه المشاركة ؟
كيف قمت باضافة دالة ZwCreateFile الى المكتبة الأصلية ؟
هل في Make اظهر لك رسالة تتحدث على انشاء الدريفر بــ Force و اخبرك انه ممكن ان لا يعمل ؟
بالتوفيق ان شاء الله
مبروك عليك اول BSOD :) لقد اختنق الجهاز :monster2: العقوبة للجميع :tong:
هل استعملت السروس الذي وضعته في هذه المشاركة ؟ : نعم !!!! .
كيف قمت باضافة دالة ZwCreateFile الى المكتبة الأصلية ؟ :
Function ZwCreateFile(FileHandle:PHANDLE; DesiredAccess:ACCESS_MASK;ObjectAttributes:POBJECT _ATTRIBUTES;
IoStatusBlock:PIO_STATUS_BLOCK ;AllocationSize:PLARGE_INTEGER ;
FileAttributes,ShareAccess,CreateDisposition,Creat eOptions:ULONG ;
EaBuffer:PVOID;EaLength:ULONG):NTSTATUS;StdCall;
implementation
Function ZwCreateFile; external NtKernel name '_ZwCreateFile';
هل في Make اظهر لك رسالة تتحدث على انشاء الدريفر بــ Force و اخبرك انه ممكن ان لا يعمل ؟ : نعم !!!! .
بارك الله فيك ,,
STRELiTZIA
27-08-2009, 05:44 PM
هل في Make اظهر لك رسالة تتحدث على انشاء الدريفر بــ Force و اخبرك انه ممكن ان لا يعمل ؟ : نعم !!!!
جيد...
هناك رسائل تخص انواع البرامترات... عن ماذا كانت تتحدث ؟
بعد اضافة الدالة الى المكتبة الأصلية قل قمت بعمل آخـــــــــر و نقل الناتج الى المجلد include ؟
1 - بعد التعديل أصبح يحمل 4 دوال فقط أظفت '_' ZwCreateFile .
2- لم أظف أي شيء أو أعمل تعديلات .. لكن عندما بدلت Dcu لم يتغير شيء نفس النتيجة .
3- ممكن لأني أظفت :
Procedure InitializeObjectAttributes; external NtKernel name '_InitializeObjectAttributes';
Procedure InitializeObjectAttributes(InitializedAttributes:O BJECT_ATTRIBUTES ;
ObjectName:PUNICODE_STRING;Attributes:ULONG ;RootDirectory:HANDLE ;
SecurityDescriptor: PSECURITY_DESCRIPTOR); stdcall;
:cryss:
STRELiTZIA
27-08-2009, 06:06 PM
غير ملف ntoskrnl.dcu الذي عندك بالذي في المرفق و جرب من جديد... لتعرف مكان الخطأ في المكتبة او في الأوامر التي تعاملت معها...
الملفات المصدرية ساضعها لاحقا حينما انتهي من بعض التعديل عليها...
جرب الآن.... حالا...... و اخبرني :)
للأسف بدلتها و بقي نفس المشكل :kick: .
ممكن لأني عند عمل Make أظع كل من الوحدات Native + NtosKrl + Nt_Status لأنه لو لم أظفها
لم أنجح في عمل الدريفر و الخطأ :
http://img521.imageshack.us/img521/3631/457575.jpg
الدالة InitializeObjectAttributes غير معرفة ؟؟؟؟ .
STRELiTZIA
27-08-2009, 06:34 PM
للأسف بدلتها و بقي نفس المشكل
هل وضعتها في مجلد include ؟
المكتبة التي ارفقت هي التي اعمل بها حاليا....
ارفق مشروعك كاملا...
هل وضعتها في مجلد include ؟ : نعم !!! .
:cryss:
STRELiTZIA
27-08-2009, 06:48 PM
نبدأ بتصحيح الأخطاء:
NAME=driver
DCC=dcc32
rmcoff=C:\KmdKit4D\bin\rmcoff
link=C:\KmdKit4D\bin\rmcoff
INCLUDE=c:\KmdKit4D\include
LIB_PATH=c:\KmdKit4D\lib
الصحيح :
link=C:\KmdKit4D\bin\link
جرب قبل ان اكمل فحص مشروعك...
STRELiTZIA
27-08-2009, 07:01 PM
DCC=C:\KmdKit4D\bin\dcc32
افضل من
DCC=dcc32
استعمل هذا الــــ Makefile
NAME=Driver
rmcoff=C:\KmdKit4D\bin\rmcoff
link=C:\KmdKit4D\bin\link
DCC=C:\KmdKit4D\bin\dcc32
INCLUDE=C:\KmdKit4D\include
LIB_PATH=C:\KmdKit4D\lib
DCCFLAGS=-U$(INCLUDE) -B -CG -JP -$A-,C-,D-,G-,H-,I-,L-,P-,V-,W+,Y- -O+
LIBS=ntutils.lib ntoskrnl.lib hal.lib win32k.lib ntdll.lib
LINKFLAGS=/NOLOGO /ALIGN:32 /BASE:0x10000 /SUBSYSTEM:NATIVE /DRIVER /LIBPATH:$(LIB_PATH) /FORCE:UNRESOLVED /FORCE:MULTIPLE /ENTRY:DriverEntry
all : $(NAME).sys
$(NAME).sys : $(NAME).obj
$(link) $(LINKFLAGS) $(NAME).obj $(LIBS) /out:ZwCreateFile.sys
$(NAME).obj : $(NAME).pas
$(DCC) $(DCCFLAGS) $(NAME).pas
$(rmcoff) $(NAME).obj
clean :
del *.obj
del *.dcu
del *.sys
لا تنسهى حذف الملفات المنتجة الأخرى حين تقم بتغيير في السورس مثل ملف object و غيره...
ليس هدا هو المشكل ؟؟ هههه أخطاء الـ Copy / Coller .
لعي وجدت الخطأ :
http://img507.imageshack.us/img507/4073/59494.jpg
STRELiTZIA
27-08-2009, 07:14 PM
بالنسبة للصورة يجب اضافة الدالة في المكتبة الأصلية.
----
مشروعك يعمل عندي تمام بعد تصحيح الأخطاء التي ذكرتها و استعمال ملف makefile الذي كتبت...
غدا ان شاء الله نكمل حديثنا الآن وقت : :monster6:
تقبل الله صيامكم و قيامكم...
بالتوفيق ان شاء الله
بارك الله فيك يا أستاذ في إنتظار ك:rtfm: .
و صح فطورك ... بالتوفيق ,,
الحمد لله توصلت لحل المشكلة ظهرت بسيطة جدا :kick:
1- لما قارنت الدريفر الدي أرفقته كمثال للدالة ZwCreateFile لم يكن يخص الكود سورس الدي وضعته
لأنه يحمل دوال من ntoskrnl لم تكتب أصلا في السورس كود :Ida + Cff
2- الخطأ أني أظفت دالة InitializeObjectAttributes لـ ntoskrnl و هذا خطأ لأنها في الوحدة macros
3- تعديل ملف الـ Make في ما يخص Link + rmcoff ض :thanks:
4- تم نجاح عملية المايك فايل :clap2: و تم تحميل 4 دوال DbgPrint,RtlInitUnicodeString,ZwCreateFile
و ZwClose .
STRELiTZIA
28-08-2009, 07:53 AM
السلام عليكم و رحمة الله
رائع... هذه الأخبار الجميلة :)
هل جربت تشغيل الدرايفر ؟ هل قام بالعمل الذي برمج له ؟
انا جربت الدرايفر و ساخبرك بالنتيجة بعد ان تجيب :)
بالتوفيق ان شاء الله
هل جربت تشغيل الدرايفر ؟ : نعم !!!! .
هل قام بالعمل الذي برمج له ؟ : نعم !!!! .
انا جربت الدرايفر و ساخبرك بالنتيجة بعد ان تجيب :نعم مشكل في تسمية الـ driver.pas :thumbs:.
بارك الله فيك ,,
STRELiTZIA
28-08-2009, 04:58 PM
انا جربت الدرايفر و ساخبرك بالنتيجة بعد ان تجيب :نعم مشكل في تسمية الـ driver.pas
نعم الدرايفر يعمل بنجاح.. و عندك خطأ في تسمية وحدة الدرايفر.
ارأيت ان برمجة الدرايفرات حساسة جدا جدا، و اي خطأ بسيط يقودك مباشرة الى bsod.
بالتوفيق ان شاء الله
me&delphi
04-09-2009, 02:53 AM
السلام عليكم
سؤالي ليس برمجي وهو لمادا هده الضجة حول تقنية الدوت نت ولازالت أغلب البرامج المبرمجة والحديثة تبرمج ب
دلفي و سي بلس بلس
أعلم أن أحد الأسرار هو السهولة الكبيرة لكني أرى أن هده التقنية ضلت حبيسة البرامج الموجهة للشركات أي
أنها ليست للمشاريع الضخمة جدا التي نراها مثلا winrar مبرمج ب C++Builder ولا داعي لدكر برامج الدلفي
MjIrIm
06-09-2009, 11:37 PM
السلام عليكم
سؤالي ليس برمجي وهو لمادا هده الضجة حول تقنية الدوت نت ولازالت أغلب البرامج المبرمجة والحديثة تبرمج ب
دلفي و سي بلس بلس
أعلم أن أحد الأسرار هو السهولة الكبيرة لكني أرى أن هده التقنية ضلت حبيسة البرامج الموجهة للشركات أي
أنها ليست للمشاريع الضخمة جدا التي نراها مثلا winrar مبرمج ب C++Builder ولا داعي لدكر برامج الدلفي
في البداية السلام عليكم
الأسباب تعود لكون شركة Microsoft ماديا قوية جدا
مما جعلها تكون سوق كبيرة محيطة بها أو تتعامل معها
الطرق كثيرة التي اعتمدها فهي لا تنتظر المبرمجين بل تقصدهم الى ديارهم
و تعطيهم أجور تسيل اللعاب حتى يتواجدون معها (الأمثلة كثيرة)
و الشهائد التي تضعها في كل الدول تقريبا في شكل مناظرات تساعدها كثيرا
من ناحية البرمجيات لم تدخل شركة Microsoft كثيرا هذه السوق
و لكل ميدان لغة البرمجة المناسبة له, لذلك المقارنة تبقى دائما رهن الميدان
المنافسة الان بدأت تكبر و تشتد
لعلمك الان أصبحت الحواسيب غير مدعمة بأحد أنظمة التشغيل الخاصة ب Microsoft
لكل من شركة Hp أو Dell
و أصبحت تدرج مع حواسيبها اما نسخة من Ubuntu
أو تترك Free Dos فقط
شركة Google منافسة لها و Embarcadero أيضا و القادم مازال يخفي الكثير
يبقى لكل شخص ميولاته الخاصة و لغة البرمجة المفضلة
الموضوع يمكن أن يقال فيه الكثير
و السلام.
me&delphi
07-09-2009, 03:20 AM
أوافقك الرأي أخي الكريم أما من ناحية الميولات و اللغة المفضلة فهدا شيء معروف فكما تلاحظ فجيل مبرمجي
الدوت نت نادرا مايتعاملون مع المؤشرات بالاظافة الى غياب الأسمبلي في لغتهم و العديد من مكامن القوة أما
السهولة فهدا الشيء الدي لمسته فيها وهكدا سيضلون تابعين لميكروسفت في كل صغيرة و كبيرة
لاأقول أنها سيئة بل لا يجب على المبرمج ان يعتمد عليها كليا فلا بد من أسمبلي و سي بلس بلس
MjIrIm
07-09-2009, 03:01 PM
في البداية السلام عليكم
لاطلاع أكثر, تم تناول الحديث في خصوص هذه الموضوع
بهذه المشاركة لدى الفريق العربي للهندسة العكسية
حوار : دلفي أم فيجوال دوت نت؟ (http://www.at4re.com/f/showthread.php?t=6568)
و السلام.
السلام عليكم
هدا سورس كود لعمل Load & Unload لـ دريفر من اليوزر مود :
{$OPTIMIZATION ON}
{$WARNINGS OFF}
{$HINTS OFF}
uses
Winsvc;
procedure CallDriver(sysName: string);
var
hSCManager, hService, hDevice: Hwnd;
dwBytesReturned: DWORD;
lpTemp: PChar;
begin
hSCManager := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
if hSCManager <> 0 then
begin
hService := CreateService(hSCManager, 'Sample',
'For Practise !!!',
SERVICE_START or SERVICE_STOP or _DELETE,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_IGNORE,
PChar(sysName),
nil, nil, nil, nil, nil);
if hService <> 0 then
begin
StartService(hService, 0, lpTemp);
DeleteService(hService);
CloseServiceHandle(hService);
end else
begin
ShowMessage('Can''t Create Service .');
end;
CloseServiceHandle(hSCManager);
end else
begin
ShowMessage('Can''t connect to Service Control Manager Data Base .');
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with OpenD do
begin
Execute;
if FileName = '' then Exit;
CallDriver(FileName);
end;
end;
أصل الكود بلغة c/c++ :
int _cdecl main(void)
{
HANDLE hSCManager;
HANDLE hService;
SERVICE_STATUS ss;
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
printf("Load Driver\n");
if(hSCManager)
{
printf("Create Service\n");
hService = CreateService(hSCManager, "Example",
"Example Driver",
SERVICE_START | DELETE | SERVICE_STOP,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_IGNORE,
"C:\\example.sys",
NULL, NULL, NULL, NULL, NULL);
if(!hService)
{
hService = OpenService(hSCManager, "Example",
SERVICE_START | DELETE | SERVICE_STOP);
}
if(hService)
{
printf("Start Service\n");
StartService(hService, 0, NULL);
printf("Press Enter to close service\r\n");
getchar();
ControlService(hService, SERVICE_CONTROL_STOP, &ss);
DeleteService(hService);
CloseServiceHandle(hService);
}
CloseServiceHandle(hSCManager);
}
return 0;
}
الأن ممكن رسم توضيحي لهندسة الكيرنل المعتمدة من طرف الـ wIndows :
http://technet.microsoft.com/en-us/library/Bb496993.uamv1c1_02_big(en-us,TechNet.10).gif
كما نلاحظ الطريقة المعتمدة لا نحتاج فيها إلى تسجيل الدريفر في الريجيسترى بل
مباشرة و بكل سهولة .
الدالة CreateService تتيح لنا بإختيار مود التحميل في البارامتر dwStartType
كما يلي :
SERVICE_AUTO_START : يتم تحميل السيرفيس أليا وقت تشغيل النظام .
SERVICE_BOOT_START : يتم تحميل السيرفيس بلودر النظام مود boot
SERVICE_DEMAND_START : يحمل مباشرة فور إستدعاء الدالة StartService
IoInitSystem ## : SERVICE_SYSTEM_START
SERVICE_DISABLED : إبطال السيرفيس محاولا تشغيله في مود الخطأ و ذلك بإرجاع
ERROR_SERVICE_DISABLED
و عليه سنتمكن من عمل Loader بسيط مع التحكم في كيفية أو مود التحميل ...
procedure CallDriver(sysName: string;LoadMode:Byte);
var
hSCManager, hService, hDevice: Hwnd;
dwBytesReturned: DWORD;
lpTemp: PChar;
begin
hSCManager := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
if hSCManager <> 0 then
begin
hService := CreateService(hSCManager, 'Sample',
'For Practise !!!',
SERVICE_START or SERVICE_STOP or _DELETE,
SERVICE_KERNEL_DRIVER,
LoadMode,
SERVICE_ERROR_IGNORE,
PChar(sysName),
nil, nil, nil, nil, nil);
if hService <> 0 then
begin
StartService(hService, 0, lpTemp);
DeleteService(hService);
CloseServiceHandle(hService);
end else
begin
ShowMessage('Can''t Create Service .');
end;
CloseServiceHandle(hSCManager);
end else
begin
ShowMessage('Can''t connect to Service Control Manager Data Base .');
end;
end;
حيث loadMode :
// Start Type
//
{$EXTERNALSYM SERVICE_BOOT_START}
SERVICE_BOOT_START = $00000000;
{$EXTERNALSYM SERVICE_SYSTEM_START}
SERVICE_SYSTEM_START = $00000001;
{$EXTERNALSYM SERVICE_AUTO_START}
SERVICE_AUTO_START = $00000002;
{$EXTERNALSYM SERVICE_DEMAND_START}
SERVICE_DEMAND_START = $00000003;
{$EXTERNALSYM SERVICE_DISABLED}
SERVICE_DISABLED = $00000004;
****ا المشاركة و طرح الأفكار و التوضيحات بارك الله فيكم ,,
khiro.alg
27-08-2011, 08:02 AM
السلام عليكم
كيف يمكن إنشاء درايفرات sys. إنطلاقا من دلفي ؟ (يعني الخطوات المبسطة من ترجمة وربط ..ما الملفات التي نربطها وبماذا؟)
vBulletin® , Copyright ©2008-2012