PDA

View Full Version : بستن پورت usb بطوریکه فقط برنامه خودمان دسترسی داشته باشد



dadvand
یک شنبه 10 شهریور 1392, 22:52 عصر
ممنون میشم یکی راهنمایی کنه
میخوام پورت usb رو ببندم ولی نه کامل ، یعنی فقط برنامه خودم بهش دسترسی داشته باشه.

عجله ای است اگه جواب بدین خیلی خیلی ممنون میشم

بهروز عباسی
دوشنبه 11 شهریور 1392, 00:46 صبح
شما باید یک برنامه نگهبان بنویسی که موقع دسترسی به USB Drive مورد نظرت چک کنه ببینه اون برنامه ای که می خواد بهش دسترسی داشته باشه برنامه شما هست یا نه ! اگر بود مجوز دسترسی رو بهش بده و در غیر اینصورت جلوشو بگیره.

dadvand
دوشنبه 11 شهریور 1392, 23:58 عصر
شما باید یک برنامه نگهبان بنویسی که موقع دسترسی به USB Drive مورد نظرت چک کنه ببینه اون برنامه ای که می خواد بهش دسترسی داشته باشه برنامه شما هست یا نه ! اگر بود مجوز دسترسی رو بهش بده و در غیر اینصورت جلوشو بگیره. تشکر از جواب سریعتون ، فقط چطور چک کنم که برنامه خودم میخواد بهش دسترسی داشته باشه یا یک برنامه دیگه ؟ احتمالا هندل برنامه ای که میخواد دسترسی پیدا کنه رو باید چک کنم ، ولی توی کدی که زحمتش رو کشیدین این هندل رو چطور باید چک کنم ؟

Felony
سه شنبه 12 شهریور 1392, 15:01 عصر
اون کد مادامی که برنامه شما در حال اجرا هست میتونه درایو رو در حالت قفل نگه داره ، از طرف دیگه استفاده از FSCTL_LOCK_VOLUME طبق گفته مایکروسافت :


Locks a volume if it is not in use. A locked volume can be accessed only through handles to the file object (*hDevice) that locks the volume. For more information, see the Remarks section.

با بستن برنامه شما قفلتون هم بی اثر خواهد شد ، در کل این کد فقط جنبه آموزشی داره ، اگر قرار باشه کدی نوشته بشه تا جلوی دسترسی رو بگیره باید یک Driver نوشته بشه تا Permission خواندن / نوشتن رو برای برنامه های مختلف بسته به نیاز اعمال کنه ، اینطوری دیگه قفل هم در User Mode قابل بستن نیست .

Felony
سه شنبه 12 شهریور 1392, 16:48 عصر
در همین سطح هم میتوان برنامه ای نوشت که غیر قابل بستن باشه.
:) با هر روشی دوست داشتید بنویسید ، قرار بدید .

Felony
سه شنبه 12 شهریور 1392, 17:40 عصر
بحث کل ، کل و ... نیست ، بحث افزایش دانش هست ، اتفاقا به هیچ کدوم از این ابزارها فکر نکردم ، شما یه نمونه بده ببینم چه میشه کرد ، یا نظر ما عوض میشه ، یا نظر شما ...

persia_hrn
سه شنبه 12 شهریور 1392, 20:56 عصر
سلام دوستان
آقای گلد یه سوال دارم ، الان برنامه شما بسته نمیشه که این کار رو با CanClose میشه به راحتی انجام داد ولی برنامه به راحتی Kill میشه و بسته میشه .

من برنامه ای نوشتم که به محض Kill شدن دوباره اجرا میشه و توی وضعیت قبلی برنامه قرار میگیره ، فقط یه مشکل دارم اونم اینکه وقتی برنامه اجرا میشه دیگه ویندوز خارج نمیشه یعنی ریست ، خاموش و لاگ آف و ... نمیشه .

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

حالا بعد از این همه داستانی که تعریف کردم میخوام بدونم راهی هست که برنامه تشخیص بده دستور خروج ویندوز مربوط به ریسیته یا خاموش شدن و یا سوئیچ یوز و ... ؟
اینو واسه این میخوام که برنامه خودش خروج از ویندوز رو انجام بده .

Mask
سه شنبه 12 شهریور 1392, 21:09 عصر
برنامه به راحتی Kill میشه
شما برنامه رو kill میکنید؟ مطمئنید؟ هیچ اتفاقی نمیوفته؟
من این نمونه رو بر روی سون 64 بیت و ویندوز xp تنست کردم. به محضی که کاربر بخاد پروسه رو kill کنه ، سیستم ریست میشه.
از چه ویندوزی استفاده میکنید؟

محض Kill شدن دوباره اجرا میشه
عمل تشخیص بسته شدن برنامه رو بوسیله برنامه جانبی انجام میدید یا یک سرویس جانبی؟

فقط یه مشکل دارم اونم اینکه وقتی برنامه اجرا میشه دیگه ویندوز خارج نمیشه یعنی ریست ، خاموش و لاگ آف و ... نمیشه .
از CanClose استفاده میکنید؟
برای این سوالتون پست جدید بزنید تا جواب داده بشه.

اینو واسه این میخوام که برنامه خودش خروج از ویندوز رو انجام بده .
نیاز به تشخیص نداره . پست جدید بزنید.

persia_hrn
سه شنبه 12 شهریور 1392, 21:12 عصر
داداش گلد من از ویندوز سون 32 بیتی استفاده میکنم و به راحتی برنامه kill میشه !

Mask
سه شنبه 12 شهریور 1392, 21:17 عصر
فراموش کرده بودم برنامه رو RunasAdmin کنم.
فایل جدید رو تست کنید.
ویندوز سون من Uac رو غیر فعال کردم. واسه همین Runas نمیخواست.

persia_hrn
سه شنبه 12 شهریور 1392, 21:25 عصر
آقا برنامه درست عمل کرد و به محض kill شدن صفحه آبی Stop ویندوز نمایش داده شد و سیستم ریست شد .

ولی آقا نکنید این کارو ! واسه حال عمومی سیستم خوب نیست به خدا :چشمک: :تشویق:

Felony
سه شنبه 12 شهریور 1392, 22:23 عصر
بحث کل و این حرفا نیستا:خجالت:
مینویسم. تو پست خصوصی میدمت داداش:بوس::قلب:
البته اگه فکر میکنی با برنامه هایی نظیر Kernel Detective یا IceeSword یا ProcessHack که به صورت کرنل مد پروسه برنامه رو کیل میکنه ، بتونی ،در اشتباهی:گیج::بامزه:
چون پروسه کریتیکاله:)))
بازم بنویسم برات بفرستم؟:)

از تابع RtlSetProcessIsCritical برای معرفی پروسه خودتون به عنوان یک پروسه Critical استفاده کردید ، این تابع Undocument سه پارامتر میگیره که اگر پارامتر اول 1 باشه یعنی پروسه Critical هست ، در حین کارکرد برنامه در صورت صدا زدن این تابع با پارامتر اول 0 پروسه به حالت عادی برمیگرده ( از حالت Critical خارج میشه ) و میشه بستش ، من به صورت دستی تو OllyDbg این کارو با برنامتون کردم ( بهش کد اینجکت کردم ) و بعد از اجرای اون کد تزریق شده برنامه خیلی راحت بسته شد ، حالا اگر حرف من رو قبول ندارید براش Patch بنویسم و Runtime کد مورد نظر رو بهش Inject کنم ...

در هر صورت روش شما کارایی برای یک برنامه امنیتی نداره و به موقعش گیر اهلش بیافته ترتیبشو میده :)

********************************************

پیرو بحث قبلی ، صبح اول صبح دیدم بیش از حد انرژی دارم Code Injection ش رو نوشتم :

http://uplod.ir/gpi3qpud6a2i/Code_Injection.swf.htm

روز خوش :)

بهروز عباسی
چهارشنبه 13 شهریور 1392, 12:56 عصر
فعلا بحث این هست که آیا میشه در سطح یوز کاری کرد که برنامه رو کاربر نتونه ببنده . با اجازه:لبخند: .

بستگی داره منظور شما از کاربر چی و کی باشه !!
ابن کار توی نسخه های 32Bit راحت تره ؛ یعنی میشه با هوک یکی دوتا API Function این کارو انجام داد ولی توی نسخه های 64Bit ویندوز نه !! کلاً User-Mode رو باید بی خیال شد .
همونطور که ماهان گفت راه اصولیش Kernel-Modeاه .

توی Kernel-land هم باید رویه Native API های ZwTerminateProcess (http://msdn.microsoft.com/en-us/library/windows/hardware/ff567115%28v=vs.85%29.aspx)و ZwOpenProcess (http://msdn.microsoft.com/en-us/library/windows/hardware/ff567022%28v=vs.85%29.aspx)هوک کنی ،تا اگه قرار بود برنامه شما رو Kill کنه جلو شو بگیری !

Felony
چهارشنبه 13 شهریور 1392, 13:21 عصر
توی Kernel-land هم باید رویه Native API های ZwTerminateProcess و ZwOpenProcess هوک کنی ،تا اگه قرار بود برنامه شما رو Kill کنه جلو شو بگیری !
البته صرفا هوک کردن این دو تابع هم نمیتونه کارساز باشه ، همونطور که خیلی از آنتی ویروس ها این توابع رو برای پروسه خودشون هوک میکنن و پروسه خودشون رو ایزوله میکنن ولی هر چند وقت یک بار روشی پابلیک میشه که تو User Mode ترتیبشونو میده .

بهروز عباسی
چهارشنبه 13 شهریور 1392, 13:32 عصر
البته صرفا هوک کردن این دو تابع هم نمیتونه کارساز باشه ، همونطور که خیلی از آنتی ویروس ها این توابع رو برای پروسه خودشون هوک میکنن و پروسه خودشون رو ایزوله میکنن ولی هر چند وقت یک بار روشی پابلیک میشه که تو User Mode ترتیبشونو میده .
آره یکی مثل Inprise :لبخندساده:
به نقل از (http://barnamenevis.org/showthread.php?18110-TIP&p=111292&viewfull=1#post111292) Inprise (http://barnamenevis.org/member.php?1341-Inprise)



بالاخره تونستم روی Ring3 سرویس KAspersky رو Terminate کنم ؛ :wise1:


Function DebugKillProcess(ProcessId: dword): boolean;
var
pHandle: dword;
myPID: dword;
HandlesInfo: PSYSTEM_HANDLE_INFORMATION_EX;
r: dword;
begin
Result := false;
myPID := GetCurrentProcessId();
if not EnableDebugPrivilege() then
Exit;
if DbgUiConnectToDbg() <> STATUS_SUCCESS then
Exit;
pHandle := OpenProcessEx(ProcessId);
if DbgUiDebugActiveProcess(pHandle) <> STATUS_SUCCESS then
Exit;
HandlesInfo := GetInfoTable(SystemHandleInformation);
if HandlesInfo = nil then
Exit;
for r := 0 to HandlesInfo^.NumberOfHandles do
if (HandlesInfo^.Information[r].Proces sId = myPID) and
(HandlesInfo^.Information[r].ObjectTyp eNumber = $8) then
begin
CloseHandle(HandlesInfo^.Information[r].Handle);
Result := true;
break;
end;
VirtualFree(HandlesInfo, 0, MEM_RELEASE);
end;

DebugKillProcess(GetProcessId('kavmm.exe'));


با اینکه بقیه آنتی ویروسها ارزش صرف چنین وقت ی رو ندارند لیکن روی F-Secure و MCAfee هم جواب داد ؛ احتمالا" بر و بچه های KAV باید یک دوجین API دیگه رو هم به لیست Interceptor شون اضافه کنند ، چون لغو عملکرد ExitProcess و ZwTerminateProcess به تنهائی مشکلی رو حل نمیکنه .

:wise2:


ولی فکر روش عمومی همین باشه .

Felony
چهارشنبه 13 شهریور 1392, 14:16 عصر
آقا صبور باشید . اگه بحث هوک و اینجکت و این حرفها هم باشه که همه برنامه ها رو میشه بست . این که شکی توش نیست.
حاجی خودت گفتی :


البته اگه فکر میکنی با برنامه هایی نظیر Kernel Detective یا IceeSword یا ProcessHack که به صورت کرنل مد پروسه برنامه رو کیل میکنه ، بتونی ،در اشتباهی
ساده تر از این ابزارها برات نام میبرم ، Process Explorer خودمون برای اینکه یک پروسه رو به صورت عادی kill کنه و از شر توابع Anti Kill معمولی خلاص بشه برمیداره تابع ExitProcess رو به برنامه شما تزریق میکنه ، اون برنامه هایی هم که نام بردی هر کدوم به روش های متفاوتی از همین شیوه استفاده میکنن ، اینکه نمیتونن برنامه شمارو درست ببندن دلیلش استفاده از اون تابع RtlSetProcessIsCritical هست ، که ابزارهای فعلی این کد رو تزریق نمیکنن ، حالا من تزریقش کردیم ، همچین کار خفنی نکردم ...


بدون هوک هر برنامه کرنل مدی داشته باشی رو برات kill میکنم. زیاد دیگه رو امنیت نمیشه مانور داد . همه چی قابل بسته شدنه.
هر برنامه ای رو میشه بست ، ولی کار هر کسی نیست ، من N تا برنامه میشناسم که به سادگی خفن ترین آنتی ویروس ها نمیشه درایورشون رو بست ، اسم برنامه هاش بماند ...

dadvand
چهارشنبه 13 شهریور 1392, 17:16 عصر
این کد چه یونیت هایی رو لازم داره ؟ من نتونستم اجراش کنم
Function DebugKillProcess(ProcessId: dword): boolean;
var
pHandle: dword;
myPID: dword;
HandlesInfo: PSYSTEM_HANDLE_INFORMATION_EX;
r: dword;
begin
Result := false;
myPID := GetCurrentProcessId();
if not EnableDebugPrivilege() then
Exit;
if DbgUiConnectToDbg() <> STATUS_SUCCESS then
Exit;
pHandle := OpenProcessEx(ProcessId);
if DbgUiDebugActiveProcess(pHandle) <> STATUS_SUCCESS then
Exit;
HandlesInfo := GetInfoTable(SystemHandleInformation);
if HandlesInfo = nil then
Exit;
for r := 0 to HandlesInfo^.NumberOfHandles do
if (HandlesInfo^.Information[r].Proces sId = myPID) and
(HandlesInfo^.Information[r].ObjectTyp eNumber = $8) then
begin
CloseHandle(HandlesInfo^.Information[r].Handle);
Result := true;
break;
end;
VirtualFree(HandlesInfo, 0, MEM_RELEASE);
end;

DebugKillProcess(GetProcessId('kavmm.exe'));

بهروز عباسی
چهارشنبه 13 شهریور 1392, 17:57 عصر
این کد چه یونیت هایی رو لازم داره ؟ من نتونستم اجراش کنم
Function DebugKillProcess(ProcessId: dword): boolean;
var
pHandle: dword;
myPID: dword;
HandlesInfo: PSYSTEM_HANDLE_INFORMATION_EX;
r: dword;
begin
Result := false;
myPID := GetCurrentProcessId();
if not EnableDebugPrivilege() then
Exit;
if DbgUiConnectToDbg() <> STATUS_SUCCESS then
Exit;
pHandle := OpenProcessEx(ProcessId);
if DbgUiDebugActiveProcess(pHandle) <> STATUS_SUCCESS then
Exit;
HandlesInfo := GetInfoTable(SystemHandleInformation);
if HandlesInfo = nil then
Exit;
for r := 0 to HandlesInfo^.NumberOfHandles do
if (HandlesInfo^.Information[r].Proces sId = myPID) and
(HandlesInfo^.Information[r].ObjectTyp eNumber = $8) then
begin
CloseHandle(HandlesInfo^.Information[r].Handle);
Result := true;
break;
end;
VirtualFree(HandlesInfo, 0, MEM_RELEASE);
end;

DebugKillProcess(GetProcessId('kavmm.exe'));

توی این لینک میتونی پیداش کنی (تقریباً) (http://citforum.ru/programming/delphi/user-mode/)

dadvand
جمعه 15 شهریور 1392, 20:41 عصر
توی این لینک میتونی پیداش کنی (تقریباً) (http://citforum.ru/programming/delphi/user-mode/)

متاسفانه بازم نتونستم ، یونیتی استفاده کرده که هرچی تو اینترنت گشتم پیداش نکردم (Tintlist) :(

بهروز عباسی
جمعه 15 شهریور 1392, 21:04 عصر
متاسفانه بازم نتونستم ، یونیتی استفاده کرده که هرچی تو اینترنت گشتم پیداش نکردم (Tintlist) :(

منظورت رو متوجه نمیشم !!
بیشتر ساختار ها توی اون لینک هست این چیریم که شما میگی من توی کد نمیبینم !!

این کد خیلی قدیمیه ها فکر نکنم دیگه جواب بده من فقط برای مثال گذاشتم:لبخند: