PDA

View Full Version : حرفه ای: Modified کلید های ریجستری



ali reza mansoori 2
سه شنبه 14 آذر 1391, 13:26 عصر
سلام
دوستان میخوام تاریخ آخرین تغییر کلیدهای ریجستری رو داشته باشم
فکر کنم برای این کار باید از RegQueryInfoKey API استفاده کنیم
کسی تا بحال همچین کاری انجام داده یا استفاده از این API رو میدونه؟
فکر کنم این کار با C خیلی راحت تر از زبان های دیگه باشه

#target
سه شنبه 14 آذر 1391, 14:27 عصر
توابع API سی و غیر سی یکیه !
پارامتر آخر همون تابع زمان آخرین نوشتن رو میده . ولی از نوع FILETIME برای همین با تابع FileTimeToSystemTime به زمان معمولی تبدیل میکنیم . نتیجه تابع در یک ساختار از نوع SYSTEMTIME قرار میگیره که اینجا (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v=vs.85).aspx) مقادیرش هست

اینجا یک کد نمونه نوشتم

#include <Windows.h>
#pragma comment(lib , "Advapi32.lib")
int main()
{
HKEY Hnd;
FILETIME Time;
SYSTEMTIME ModifiedTime;
if(!(RegOpenKeyEx(HKEY_LOCAL_MACHINE , "MyKey" , 0 , KEY_ALL_ACCESS , &Hnd)))
{
RegQueryInfoKey(Hnd,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,&Time);
FileTimeToSystemTime(&Time , &ModifiedTime);
RegCloseKey(Hnd);
//ModifiedTime.?
}
return 0;
}

دقت کنید مقدار که تابع FileTimeToSystemTime میده برحسب زمان سیستم هست و احتمالا با زمان فعلی سیستم فرق خواهد کرد (مثلا تهران 3 و نیم ساعت جلوتره) برای حل مشکل میتونی بعدش تابع SystemTimeToTzSpecificLocalTime رو فراخوانی کنی . مثل:
SystemTimeToTzSpecificLocalTime(NULL , &ModifiedTime , &ModifiedTime);

ali reza mansoori 2
سه شنبه 14 آذر 1391, 16:41 عصر
دوست عزیز خیلی ممنون
من تا حالا با C کار نکردم اصلا نمیدونم چجوری باید اینو اجرا کنم
اگر میشه یه نمونه سورس همراه با فایل exe آپلود کنید
شاید این نمونه کد شما منو بیشتر بکشونه سمت C چون با زبان های دیگه امتحان کردن جواب نمیداد (حداقل میدونم که با C این کار شدنیه)
بازم خیلی ممنون

#target
سه شنبه 14 آذر 1391, 18:33 عصر
سایر زبان ها هم باید بتونن انجام بدن . ممکنه تنها مشکل در اونجا دسترسی به این توابع باشه که احتمالا باید دستی تعریف کنید !

ی نمونه کد در Visual Studio 2010 قرار دادم . ببینید . در این نمونه آخرین ویرایش مسیر LOCAL_MACHINE\SOFTWARE نمایش داده میشه

ali reza mansoori 2
چهارشنبه 15 آذر 1391, 14:29 عصر
سایر زبان ها هم باید بتونن انجام بدن
یعنی داخل vb.net هم میشه انجام داد ؟
من هرچی سرچ میکنم چیزی پیدا نمیکنم


در این نمونه آخرین ویرایش مسیر LOCAL_MACHINE\SOFTWARE نمایش داده میشه
برنامه ای که شما نوشتید تاریخ مسیر ها رو میده آیا میشه تاریخ آخرین تغییرات کلید ها رو هم داشته باشیم(مثل کلید های String Value , Binary value , ....)

H_G_G_I
چهارشنبه 15 آذر 1391, 15:00 عصر
برای کار با رجیستری تو دات نت از فضای نام Microsoft.Win32 استفاده کنید !
فکر نکنم با توی سی پلاس فرق داشته باشه .
http://www.codeproject.com/Articles/2422/Working-with-Registry-in-NET
-
اگه کامل نبود می تونید کدها رو در سی پلاس بنویسید و به صورت dll کامپیل کنید و بعد در دات نت یا ... استفاده کنید !

ali reza mansoori 2
چهارشنبه 15 آذر 1391, 15:48 عصر
اگه کامل نبود می تونید کدها رو در سی پلاس بنویسید و به صورت dll کامپیل کنید و بعد در دات نت یا ... استفاده کنید !
منم می خوام همچین کار کنم
یعنی بعد از تکمیل شدن برنامه داخل C اونو به Dll تبدیل می کنم

ولی کد که دوستمون زحمت کشیدن اون چیزی نیست که من می خواستم

#target
چهارشنبه 15 آذر 1391, 16:00 عصر
ببین اون بخشی که من نوشتم SOFTWARE رو به مسیر مورد نظرت تغییر بده . مسیری که داخلش اون مقادیر مورد نظر هست
این تابع یک کلید رو بررسی میکنه و خوب زیر مجموعه ی کلید میتونه چندین مقدار باشه .


بله در وی بی ات نت هم میشه فقط باید توابع رو تک تک بصورت دستی ایمپورت کنی و ساختار ها رو هم دستی بسازی . یا همون دی ال ال انجام بده


م(مثل کلید های String Value , Binary value , ....)
اونا کلید نیستن مقدارن . شما باید مسیر کاملی که اون مقادیر قرار داره رو بذارین

ali reza mansoori 2
چهارشنبه 15 آذر 1391, 16:26 عصر
برای این که بتونم تاریخ آخرین ویرایش مقداری رو که داخل عکس مشخص کردم و بدست بیارم کد زیر رو به چه صورتی باید تغییر بدم
if(!(RegOpenKeyEx(HKEY_LOCAL_MACHINE , L"SOFTWARE" , 0 , KEY_ALL_ACCESS , &Hnd)))

#target
چهارشنبه 15 آذر 1391, 17:07 عصر
سلام
ببینید اون یک Value هست (دقیق اونو نمیتونین بررسی کنین) و باید شما فقط کلیدش رو بررسی کنین (که اون مقدار هم زیر مجموعش هست).
یعنی کد بشه مثل زیر :
if(!(RegOpenKeyEx(HKEY_CURRENT_USER , L"Alireza" , 0 , KEY_ALL_ACCESS , &Hnd)))

ای کاش میگفتی میخوای چکار کنی که شاید میشد با روشهای بهتری راهنمایی کرد . مثلا اگه هدفت این هست که به محض تغییر یک مقدار اگاه بشی . روش گرفتن زمان برا زمانی که برنامه بسته هست منسبه ولی در زمانی که داخل برنامه هستی بهتره از تابع RegNotifyChangeKeyValue استفاده کنی . این تابع به محض تغییر در کلید و مقدار زیر مجموعش به شما اطلاع رسانی میکنه .
ساده ترین روش که همزمانش هست ولی روش ناهمزمان هم داره که با سیگنال دادن به یک Event شما رو آگاه میکنه که کلید تغییر کرده
کد زیر ساده ترین روش روششه !

if(!(RegOpenKeyEx(HKEY_CURRENT_USER , L"Alireza" , 0 , KEY_ALL_ACCESS , &Hnd)))
{
RegNotifyChangeKeyValue(Hnd, 1 , REG_NOTIFY_CHANGE_LAST_SET , 0 , 0 );
printf("Changed !");
}

به اول کدتون #include <stdio.h> اضافه کنین

ali reza mansoori 2
پنج شنبه 16 آذر 1391, 11:52 صبح
ببینید اون یک Value هست (دقیق اونو نمیتونین بررسی کنین) و باید شما فقط کلیدش رو بررسی کنین (که اون مقدار هم زیر مجموعش هست).
بله شما درست میگید خودم هم متوجه شدم:اشتباه:


مثلا اگه هدفت این هست که به محض تغییر یک مقدار اگاه بشی
دقیقا میخوام همچین کاری کنم
کدهای پست های قبلی خیلی عالی بود


if(!(RegOpenKeyEx(HKEY_CURRENT_USER , L"Alireza" , 0 , KEY_ALL_ACCESS , &Hnd)))
{
RegNotifyChangeKeyValue(Hnd, 1 , REG_NOTIFY_CHANGE_LAST_SET , 0 , 0 );
printf("Changed !");
}
آیا میشه این کد رو جوری تغییر داد که به محض تغییرات تو ریجستری مسیر متغیر رو به جای اون پیغام نمایش بده

#target
پنج شنبه 16 آذر 1391, 17:19 عصر
خوب اون خط که چاپ میکنه رو به میل خودتون تغییر بدین
printf("AliReza");

ali reza mansoori 2
جمعه 17 آذر 1391, 10:46 صبح
دوست عزيز واقعا ممنون که جواب ما رو ميديد


خوب اون خط که چاپ ميکنه رو به ميل خودتون تغيير بدين
ديگه اين قدر هم :گیج: نيستم

با اين کدي که شما زحمت کشيديد فقط ميشه از تغييرات مطلع بشيم و اين تقريبا بدون معني هستش خوب اينو همه ميدونن که هنگام کار با ويندوز ريجستري دائم در حال تغيير هستش
من ميخوام به محض تغيير در ريجستري به جاي چاپ کلمات بي معني مسير و مقدار اين تغيير رو چاپ کنه
مثلا اگر هر جاي ريجستري يه کليد ساخته شد برنامه بگه که اين کليد کجا ساخته شده

يا علي

#target
جمعه 17 آذر 1391, 16:39 عصر
اول یک کلید بود الان شد کل رجیستری :لبخند:
خوب اون کد ساده بود شما مثلا برا ی کلید که Notify میذاری قبل از اون یک کپی از تمامی مقادیر زیر مجموعش تو حافظه نگه دار بعد که اون تابع آزاد شد یعنی تغییر کرده و دوباره ی کپی بگیر و مقایسه کن بفهمی چی تغییر کرده
این روش برای بررسی در یک یا چند مسیر مشخص کاربرد داره
کل رجیستری اون طوری تو میخوای به این راحتی با یک تابع نیست !

ali reza mansoori 2
جمعه 17 آذر 1391, 18:12 عصر
اول یک کلید بود الان شد کل رجیستری
هدف من اینه که هر تغییری داخل ریجستری انجام میشه رو بفهمم
اول خواستم از Modified کلید های استفاده کنم ولی اون چیزی که من خواستم رو نتونست برآورده کنه (البته راهنمایی شما خیلی کمکم کرد)
بعد شما گفتید از RegNotifyChangeKeyValue استفاده کنم که اینم خروجی مطلوبی نداره


خوب اون کد ساده بود شما مثلا برا ی کلید که Notify میذاری قبل از اون یک کپی از تمامی مقادیر زیر مجموعش تو حافظه نگه دار بعد که اون تابع آزاد شد یعنی تغییر کرده و دوباره ی کپی بگیر و مقایسه کن بفهمی چی تغییر کرده
اینم روش جالبیه حتما امتحانش میکنم


کل رجیستری اون طوری تو میخوای به این راحتی با یک تابع نیست !
ولی هر جوری که شده پیداش میکنم البته با کمک شما
هر مطلبی یا لینکی که بتونه کمکم کنه بزارید برام

#target
جمعه 17 آذر 1391, 21:34 عصر
برای یک کلید خاص اون بررسی تغییرات رو بنویسید ببین چطوره
با استفاده از توابع قبلی و نوشتن مقداری کد و الگوریتم احتمالا بتونی با همونا تا حدی به هدفت نزدیک بشی.

میشه از API Hooking هم استفاده کرد . مثلا ی DLL تو همه پروسه ها بذاری که به محضی خواستن توابع رجیستری رو فراخوانی کنن مچشون رو بگیره . ولی جالب نیست.