View Full Version : طریقه استفاده از ZwDeleteValueKey
30yavash
دوشنبه 24 فروردین 1388, 22:35 عصر
با سلام خدمت همه دوستان.
من می خام با دلفی یه برنامه بنویسم که با استفاده از توابع api ویندوز موجود در فایل ntdll.dll مقدار خاصی رو در رجیستری پاک کنه.
حالا مشکل من اینه که نمی دونم چه طور باید آدرس اون مقدار رو به تابه ZwDeleteValueKey بفهمونم.گویا باید از ZwOpenKey یا ZwCreateKey استفاده کنم ولی چه طورش رو نمی دونم؟
NTSTATUS ZwDeleteValueKey( IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName );
اینو می دونم که در تابع ZwDeleteValueKey آرگومان دوم همون مقدار ما هست که باید حذف بشه ولی آرگومان اول گویا باید با ZwCreateKey مقدار دهی بشه ولی نمی دونم چه جوری.
دوستان اگر نمونه کدی بذارن ، ممنون می شم.
نکته:
من نمی خام از توابع registry موجود در advapi32 استفاده کنم.
vcldeveloper
سه شنبه 25 فروردین 1388, 10:55 صبح
ZwDeleteValueKey یک تابع سطح کرنل هست. بطور عادی نمی تونید در دلفی کد Kernel Mode بنویسید.
30yavash
سه شنبه 25 فروردین 1388, 13:52 عصر
ZwDeleteValueKey یک تابع سطح کرنل هست. بطور عادی نمی تونید در دلفی کد Kernel Mode بنویسید.
بعضی از توابع Ring0 از طریق فایل ntdll.dll در اختیار نرم افزارهای Ring3 گذاشته شده.که این توابع هم از اون دسته هستن.
من در حقیقت می خام ZwDeleteValueKey رو هوک کنم.همه چیز اوکیه فقط مشکلم اینه که نمی تونم بگم مقدار رو از چه کلیدی حذف کنه.
یعنی فقط با پارامتر دوم می تونم کار کنم و نمی دونم چه طور باید آدرس value مورد نظر رو از پارامتر اول استخراج کنم.
vcldeveloper
سه شنبه 25 فروردین 1388, 17:19 عصر
من در حقیقت می خام ZwDeleteValueKey رو هوک کنم.همه چیز اوکیه فقط مشکلم اینه که نمی تونم بگم مقدار رو از چه کلیدی حذف کنه.
یعنی فقط با پارامتر دوم می تونم کار کنم و نمی دونم چه طور باید آدرس value مورد نظر رو از پارامتر اول استخراج کنم. آدرس Value را از پارامتر اول استخراج نباید بکنید، بلکه پارامتر اول هندل مربوط به کلید حاوی Value مورد نظر شما ست، و پارامتر دوم نام Value مربوطه.
یعنی شما باید اول با استفاده از توابعی مثل ZwCreateKey یا ZwOpenKey کلید رجیستری حاوی آن Value را باز کنید. در این صورت، این دو تابع یک هندل به شما بر می گردانند، که این هندل را باید به عنوان پارامتر اول تابع ZwDeleteValueKey استفاده کنید.
بعضی از توابع Ring0 از طریق فایل ntdll.dll در اختیار نرم افزارهای Ring3 گذاشته شده.که این توابع هم از اون دسته هستن.
برای استفاده از این توابع در User Mode، باید از پیشوند nt در نام تابع بجای Zw استفاده کنید:
NtDeleteKeyValue
NtCreateKey
NtOpenKey
FiACKER
سه شنبه 25 فروردین 1388, 18:22 عصر
بطور عادی نمی تونید در دلفی کد Kernel Mode بنویسید.
مي شه بگيد براي نوشتن برنامه هاي سطح كرنل در دلفي بايد چه كرد ؟
البته من جايي خوندم كه نمي شه با دلفي سطح كرنل برنامه نوشت!
ولي ايا با اسمبلي هم نمي شه تويه دلفي ، سطح كرنل نوشت ؟
30yavash
سه شنبه 25 فروردین 1388, 19:15 عصر
آدرس Value را از پارامتر اول استخراج نباید بکنید، بلکه پارامتر اول هندل مربوط به کلید حاوی Value مورد نظر شما ست، و پارامتر دوم نام Value مربوطه.
یعنی شما باید اول با استفاده از توابعی مثل ZwCreateKey یا ZwOpenKey کلید رجیستری حاوی آن Value را باز کنید. در این صورت، این دو تابع یک هندل به شما بر می گردانند، که این هندل را باید به عنوان پارامتر اول تابع ZwDeleteValueKey استفاده کنید.
دوست عزیز همون طور که توی پست اول گفتم دقیقا مشکل من همین دوتابع ZwCreateKey و ZwOpenKey هستند.نمی دونم چه طور باید از این دوتا استفاده کنم.
یه مثال برام بزنید ، ممنونتون می شم.
برای استفاده از این توابع در User Mode، باید از پیشوند nt در نام تابع بجای Zw استفاده کنید:
NtDeleteKeyValue
NtCreateKey
NtOpenKey
کاملا درسته
30yavash
سه شنبه 25 فروردین 1388, 19:19 عصر
مي شه بگيد براي نوشتن برنامه هاي سطح كرنل در دلفي بايد چه كرد ؟
البته من جايي خوندم كه نمي شه با دلفي سطح كرنل برنامه نوشت!
ولي ايا با اسمبلي هم نمي شه تويه دلفي ، سطح كرنل نوشت ؟
با دلفی نمی شه درایور نوشت.
مشکل اسمبلی یا دلفی نیست.مشکل اینه که شما نمی تونی برنامت رو برای تولید فایل درایور کامپایل کنی.
باید از c++ یا c برای درایور نویسی استفاده کنی و با wddk اونو کامپایل کنی.
برای نسخه های قدیمی دلفی (فکر کنم 4) یه برنامه بود که می تونست درایور بسازه ولی تا اونجا که یادمه رسمی نبود یعنی تولید شرکت بورلند نبود.
vcldeveloper
چهارشنبه 26 فروردین 1388, 01:50 صبح
همون طور که توی پست اول گفتم دقیقا مشکل من همین دوتابع ZwCreateKey و ZwOpenKey هستند.نمی دونم چه طور باید از این دوتا استفاده کنم.اون وقت دیگه موضوع تاپیک "طریقه استفاده از ZwDeleteValueKey" نمیشه، بلکه میشه "طریقه استفاده از ZwCreateKey".
یه مثال برام بزنید ، ممنونتون می شم.در لینک زیر یک مثال درباره ایجاد کلید رجیستری با استفاده از NTCreateKey هست. می تونید با مطالعه آن، متوجه چگونگی استفاده از آن بشید:
http://www.shivi.de/eddb/pdf.php?cat=35&id=2159&lang=de
مشکل اسمبلی یا دلفی نیست.مشکل اینه که شما نمی تونی برنامت رو برای تولید فایل درایور کامپایل کنی.
باید از c++ یا c برای درایور نویسی استفاده کنی و با wddk اونو کامپایل کنی.حتی اگر هم میشد، تمام header های مربوطه با C هستند، و برای دلفی ترجمه نشدند. مثال ها هم همینطور. کلا DDK برای C\C++ نوشته شده. سرمایه گزاری روی نوشتن برنامه سطح کرنل ویندوز با زبان هایی غیر از C\C++ چندان منطقی نیست.
30yavash
پنج شنبه 27 فروردین 1388, 17:02 عصر
ممنونم دوست عزیز.
مثال خیلی خوبی بود.روشش رو تست کردم جواب داد.
30yavash
پنج شنبه 27 فروردین 1388, 21:07 عصر
مشکل عجیبی که من دارم اینه که من توابع ZwDeleteValueKey یا ZwDeleteKey رو هوک می کنم و وقتی با regedit یه کلید رو حذف می کنم این دوتابع همیشه هندل ثابتی رو به من می دن!
اوایل با نرم افزارهای APISpy تست می کردم می گفتم شاید مشکل از برنامست ولی الان این هندل رو از توی برنامه خودم توی محیط دیباگ پرینت می کنم و همیشه یه عدد ثابت می بینم!
مگه می شه هندل تکراری باشه! حالا من چه کنم! از کجا بدونم طرف چه کلیدی رو می خاد حذف کنه؟
mahmood0197
سه شنبه 09 اسفند 1390, 09:13 صبح
با سلام از توابع دیگر api هم می تونید استفاده کنید. من یک سوالی توی ذهنم این فایل ntdll که در user mode سیستم عامل آیا توانایی ارتباط با kernel mode رو داره؟؟ اگه داره چطوری!!!!
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.