PDA

View Full Version : نوشتن در رچيستري با كاربري كه دسترسي فول به آن ندارد



pad_kay
شنبه 06 مهر 1387, 16:21 عصر
با سلام و خسته نباشيد خدمت شما دوستان گرامي
فكر كنم عنوان سوال كاملا گويا باشد ولي براي آشنايي بيشتر توضيحات زير را اظافه مي كنم :

1-همانگونه كه مي دانيد سرويس هاي ويندوز هيچگونه دسترسي به HKEY_CURRENT_USER ندارنند و تنها به HKEY_LOCAL_MACHINE دسترسي دارنند .
2- كاربران معمولي هيچكونه دسترسي به قسمت HKEY_LOCAL_MACHINE د رحالت عادي در مورد نوشتن ندارنند و تنها با دادن دسترسي در كد مي توانيم از آن بخوانيم

بنا به دلايلي من در رچيستري و در قسمت HKEY_LOCAL_MACHINE مي خواهم با استفاده از سرويس هم بنويسم و هم بخوانم مشكل اينجاست كه كاربر سيستم معمولي بود و من نيز نمي خواهم تغييري در دسترسي هاي كاربر دهم
دنبال راهي مي گردم كه از طريق كد بتوانم در رچيستري بخوانم و بنويسم

vcldeveloper
شنبه 06 مهر 1387, 18:20 عصر
-همانگونه كه مي دانيد سرويس هاي ويندوز هيچگونه دسترسي به HKEY_CURRENT_USER ندارنند و تنها به HKEY_LOCAL_MACHINE دسترسي دارنند .
بخاطر این هست که وقتی سرویس اجرا میشه، هنوز کاربری لاگین نکرده، پس نباید سرویس به شاخه اختصاصی کاربر دسترسی داشته باشه.


دنبال راهي مي گردم كه از طريق كد بتوانم در رچيستري بخوانم و بنويسم
همون محدودیتی که برای کاربر اعمال میشه، برای برنامه هایی که توسط کاربر اجرا میشند هم اعمال میشه. نمیشه انتظار داشت کاری که کاربر مجاز به انجام آن نیست را برنامه کاربر انجام بده. راهش همین هست که مجوز کاربر یا برنامه ایی که کاربر داره استفاده میکنه، برای دسترسی به اون کلید خاص ارتقاء پیدا کنه. یا اینکه یک نفر نقطه ضعف امنیتی در ویندوز پیدا کنه و از اون طریق این مسئله را برطرف کنه، که این میشه هک.

mi5coder
شنبه 06 مهر 1387, 18:54 عصر
با سلام
برای نوشتن در HKEY_CURRENT_USER با یک برنامه که به عنوان سرویس هست از HKEY_USERS استفاده کن.
هر چند پیدا کردن کاربر active و ... نیاز به دانستن API داره

واسه نوشتن در در HKEY_LOCAL_MACHINE میتونی به صورت موقت یک برنامه سرویس نصب کنی.

یک چیزهایی هم از تابع زیر یادم هست, نمیدونم مشکلت با این حل میشه و یا نه !
خودت تست کن.(اسم تابع رو تو گوگل سرچ کن)
SetTokenPrivileges

Mask
شنبه 06 مهر 1387, 22:35 عصر
بنا به دلايلي من در رچيستري و در قسمت HKEY_LOCAL_MACHINE مي خواهم با استفاده از سرويس هم بنويسم و هم بخوانم مشكل اينجاست كه كاربر سيستم معمولي بود و من نيز نمي خواهم تغييري در دسترسي هاي كاربر دهم
دنبال راهي مي گردم كه از طريق كد بتوانم در رچيستري بخوانم و بنويسم
با سلام
دوست عزیز اگر می خواهی در خود ویندوز این دسترسی رو ایجاد کنی با زبان دلفی به نظر من میشه بگی غیر ممکن ولی با زبان c یا c++ یا c# من دیده ام که در قسمت کاربر محدود به تمامی قسمتهای ریجستری بشه تغیرات ایجاد کرد یا از اون خوند یا در ریجستری بنویسی ، که به فرموده جناب کشاورز این میشه حالا یا هک یا اکسپلویت که با توجه به قوانین سایت نه من و نه کس دیگه نمیشه راهنماییتون کرد.
اما از طریق قابلیت های سیستم عامل در محیط داس چنین امکانی وجود داره . البته نه با درست کردن برنامه بلکه با دستورات داس به اضافه یک برنامه که دقیقا محیط داس رو شبیه به ویندوز میکنه.(از نظر دستوری).

vcldeveloper
یک شنبه 07 مهر 1387, 02:18 صبح
دوست عزیز اگر می خواهی در خود ویندوز این دسترسی رو ایجاد کنی با زبان دلفی به نظر من میشه بگی غیر ممکن ولی با زبان c یا c++ یا c# من دیده ام که در قسمت کاربر محدود به تمامی قسمتهای ریجستری بشه تغیرات ایجاد کرد یا از اون خوند یا در ریجستری بنویسی ،
ربطی به زبان برنامه نویسی نداره، چه دلفی چه C یا ++C یا #C باید نهایتا از APIهای ویندوز استفاده کنند، پس همه شان تا زمانی که به APIهای ویندوز دسترسی داشته باشند، با هم در این مورد یکسان هستند.


اما از طریق قابلیت های سیستم عامل در محیط داس چنین امکانی وجود داره .
در ویندوزهای برپایه NT مثل 2000, XP, و Vista چیزی به اسم داس یا محیط داس وجود نداره. داس یک سیستم عامل 16 بیتی بود که بصورت Real mode کار می کرد. برنامه های Console ویندوز که ظاهری شبیه برنامه های داس دارند (رابط کاربر گرافیکی ندارند) بصورت 32 بیتی و Protected Mode اجرا میشند.

pad_kay
دوشنبه 08 مهر 1387, 08:59 صبح
با سلام خدمت دوستان مشكل من به راحتي و بدون استفاده از توابع api توانستم با سرويس هنگامي كاربري دسترسي فول به رچستري ندارد هم كليد ايجاد كنم و هم مقدار به آن اختصاص دهم آن هم با استفاده از كد زير :
reg:=TRegistry.Create(KEY_WRITE or KEY_CREATE_SUB_KEY);
گفتم با بيان اين موضوع بتوانم مشكلي از مشكلات ديگر دوستان را حل كنم
و اينكه "خواستن ، توانستن است"

vcldeveloper
دوشنبه 08 مهر 1387, 10:02 صبح
و بدون استفاده از توابع api توانستم با سرويس هنگامي كاربري دسترسي فول به رچستري ندارد هم كليد ايجاد كنم و هم مقدار به آن اختصاص دهم
اون کلاس TRegistry که استفاده کردید، از توابع API ویندوز استفاده میکنه.

Mask
دوشنبه 08 مهر 1387, 18:46 عصر
با سلام خدمت دوستان مشكل من به راحتي و بدون استفاده از توابع api توانستم با سرويس هنگامي كاربري دسترسي فول به رچستري ندارد هم كليد ايجاد كنم و هم مقدار به آن اختصاص دهم آن هم با استفاده از كد زير :
reg:=TRegistry.Create(KEY_WRITE or KEY_CREATE_SUB_KEY);
گفتم با بيان اين موضوع بتوانم مشكلي از مشكلات ديگر دوستان را حل كنم
و اينكه "خواستن ، توانستن است"

حاجی اگه کاربرت لیمیت باشه و ریجستری هم پروتکت ،این کد اجرا نمیشه.

ربطی به زبان برنامه نویسی نداره، چه دلفی چه C یا ++C یا #C باید نهایتا از APIهای ویندوز استفاده کنند، پس همه شان تا زمانی که به APIهای ویندوز دسترسی داشته باشند، با هم در این مورد یکسان هستند.


شرمنده جناب کشاورز اما همه ما در همه چیز تخصص نداریم و اگه کاری رو نمی تونیم انجام بدیم به نظر من نباید گفت نمیشه. چون بنده این موضوع را دیده ام که خود اون کاربر چنین برنامه ای نوشته بود که در یوزر محدود با اینکه ریجستری پروتکت بود راحت باهاش کار می کرد و هم ازش می خوند و هم می نشت.

در ویندوزهای برپایه NT مثل 2000, XP, و Vista چیزی به اسم داس یا محیط داس وجود نداره. داس یک سیستم عامل 16 بیتی بود که بصورت Real mode کار می کرد. برنامه های Console ویندوز که ظاهری شبیه برنامه های داس دارند (رابط کاربر گرافیکی ندارند) بصورت 32 بیتی و Protected Mode اجرا میشند.
شما درست می فرمایید من اشتبا ها گفتم داس اما منظورم بوت کردن سیستم با سی دی یا فلاپی بوتیبل بود .
این برنامه که گفتم بر روی سیدی ریخته شده و با اون سیستم بالا می یاد و هر کاری خاستی دیگه میشه انجام داد.(تا حدودی مثل ویندوز پرتابل می مونه)

vcldeveloper
سه شنبه 09 مهر 1387, 04:16 صبح
شرمنده جناب کشاورز اما همه ما در همه چیز تخصص نداریم و اگه کاری رو نمی تونیم انجام بدیم به نظر من نباید گفت نمیشه. چون بنده این موضوع را دیده ام که خود اون کاربر چنین برنامه ای نوشته بود که در یوزر محدود با اینکه ریجستری پروتکت بود راحت باهاش کار می کرد و هم ازش می خوند و هم می نشت.
دوست عزیز، من نگفتم نمیشه، جنابعالی گفتید که امکانش با دلفی تقریبا غیر ممکن هست! اون پست به شما میگه که کار خاصی نیست که در C یا #C امکان پذیر باشه، ولی در دلفی امکان پذیر نباشه.

pad_kay
سه شنبه 09 مهر 1387, 09:23 صبح
حاجی اگه کاربرت لیمیت باشه و ریجستری هم پروتکت ،این کد اجرا نمیشه.

با سلام خدمت شما دوست عزيز
اگر تاپيك اول خوب مطالعه كرديد حتما متوجه مي شديد كه منظور من سرويس است نه برنامه ، در سرويس چيزي به عنوان كاربر نداريم كه بخواهيم آن را محدود كنيم

pad_kay
سه شنبه 09 مهر 1387, 09:33 صبح
اون کلاس TRegistry که استفاده کردید، از توابع API ویندوز استفاده میکنه.
نكته كه شما بيان نموديد درست است :خجالت: ولي منظور من به صورت مستقيم و استفاده از توابع خاص است
:لبخند: