ورود

View Full Version : راهنمایی در مورد هوک TerminatedProcess



ایمان اختیاری
شنبه 25 اردیبهشت 1389, 09:26 صبح
سلام ..
چند وقتیه که درگیر نوشتن یه برنامه هستم که یه سری شرایط باید داشته باشد
یکی از شرایط اینه که برنامه نباید تحت هیچ شرایطی بسته بشه ...
بعد از گشتن های زیاد به این نتیجه رسیدم که باید از hook استفاده کنم ...
توی این مقاله که مال سایت codeProject هست در این مورد توضیح کافی داده شده ولی من به یه مشکلی برخوردم ...

http://www.codeproject.com/KB/vista/api-hooks.aspx?msg=3472748#xx3472748xx
توی این مقاله لیست پروسسی که می خوای رو می تونی از TaskManeger حذف کنی
روال کار هم این جوریه که شما یه تابع می نویسی اون یه تابع اصلی که می خوای هووک کنی inject می کنی و بعدش تابع شما هم فراخوانی می شه ...



// Hooked function

NTSTATUS WINAPI HookedNtQuerySystemInformation(
__in SYSTEM_INFORMATION_CLASS SystemInformationClass,
__inout PVOID SystemInformation,
__in ULONG SystemInformationLength,
__out_opt PULONG ReturnLength
)
{
NTSTATUS status = OriginalNtQuerySystemInformation(SystemInformation Class,
SystemInformation,
SystemInformationLength,
ReturnLength);

if (SystemProcessInformation == SystemInformationClass && STATUS_SUCCESS == status)
{
//
// Loop through the list of processes
//

PMY_SYSTEM_PROCESS_INFORMATION pCurrent = NULL;
PMY_SYSTEM_PROCESS_INFORMATION pNext = (PMY_SYSTEM_PROCESS_INFORMATION)SystemInformation;

do
{
pCurrent = pNext;
pNext = (PMY_SYSTEM_PROCESS_INFORMATION)((PUCHAR)pCurrent + pCurrent->NextEntryOffset);

if (!wcsncmp(pNext->ImageName.Buffer, L"calc.exe", pNext->ImageName.Length))
{
if (0 == pNext->NextEntryOffset)
{
pCurrent->NextEntryOffset = 0;
}
else
{
pCurrent->NextEntryOffset += pNext->NextEntryOffset;
}

pNext = pCurrent;
}
}
while(pCurrent->NextEntryOffset != 0);
}

return status;
}





خب .. حالا سوال من اینجاس ...
تابعی که برای هووک کردن TerminateProcess باید بنویسم چه ساختاری باید داشته باشه ..
نکته ای که هستش اینه که تابعی که شما باید بنویسی دقیقا همون ورودی های تابع اصلی رو باید داشته باشه


BOOL WINAPI TerminateProcess(
__in HANDLE hProcess,
__in UINT uExitCode
);



این تابع اصلی توی msdn تعریف شده ...
خب ... توی ++C چطور می تونم هندل پروسس خودم رو بدست بیارم ؟
و بعدش چطور می تونم از بستنش جلوگیری کنم ؟
لطف می کنید راهنمایی کنید ...

Nima_NF
شنبه 25 اردیبهشت 1389, 13:27 عصر
برای گرفتن هندل از GetCurrentProcess استفاده کنید.

جلوگیری از بستن پروسه چطور ؟ چون بالاخره با حالت force افراد و خود سیستم می تواند این کار را انجام بدهد.

Mehdi Asgari
شنبه 25 اردیبهشت 1389, 14:09 عصر
جلوگیری از بستن پروسه چطور ؟ چون بالاخره با حالت force افراد و خود سیستم می تواند این کار را انجام بدهد
برنامه های امنیتی مثل آنتی ویروس ها معمولا با هوک کردن SSDT مانع از بسته شدن سرویس های حیاتی خودشون توسط دیگر برنامه های میشن

لطف می کنید راهنمایی کنید
فصل 5 کتاب Rootkit Arsenal

ایمان اختیاری
شنبه 25 اردیبهشت 1389, 15:04 عصر
برای گرفتن هندل از GetCurrentProcess استفاده کنید.

جلوگیری از بستن پروسه چطور ؟ چون بالاخره با حالت force افراد و خود سیستم می تواند این کار را انجام بدهد.
مرسی از پاسختون .. راستش من روی پروسس های ضدویروس ها خیلی کار کردم .. برای مثال پروسس خود کاسپر رو خیلی سخت می شه بست که کلا کرش می کنه و اوضاع خیلی داغون می شه ...

ایمان اختیاری
یک شنبه 26 اردیبهشت 1389, 13:18 عصر
دوستان .. اینو نوشتم
می تونید راهنمایی کنید که کجاش اشتباهه؟

void EnableDebugPriv() {
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tkp;

OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken );

LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &luid );

tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = luid;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges( hToken, false, &tkp, sizeof( tkp ), NULL, NULL );

CloseHandle( hToken );
}
NTSTATUS WINAPI HookedNtTerminateProcess(
__in HANDLE hProcess,
__in UINT uExitCode
)
{
NTSTATUS statues = OriginalNtTerminateProcess(hProcess,uExitCode);
HANDLE hProc;





PROCESSENTRY32 entry;
entry.dwFlags = sizeof( PROCESSENTRY32 );

HANDLE snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, NULL );

if ( Process32First( snapshot, &entry ) == TRUE ) {
while ( Process32Next( snapshot, &entry ) == TRUE ) {
if ( wcsicmp( entry.szExeFile, L"calc.exe" ) == 0 ) {
EnableDebugPriv();

HANDLE hProc = OpenProcess( PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID );

// Do stuff..

//CloseHandle( hProc );
}
}
}





if(hProc == hProcess)
MessageBox(NULL, L"Error", L"Information", MB_OK);
else
TerminateProcess(hProcess,uExitCode);



CloseHandle( hProc);
CloseHandle( snapshot );

return statues;

ایمان اختیاری
یک شنبه 26 اردیبهشت 1389, 19:11 عصر
کسی می تونه کمک کنه در این مورد خواهشا؟

hoax3r
سه شنبه 28 اردیبهشت 1389, 00:22 صبح
کدتون مشکل زیاد داره با تمام کدتون کار ندارم باید کلشو تغییر بدین همین خط رو یه توضیح میدم


NTSTATUS statues = OriginalNtTerminateProcess(hProcess,uExitCode);

الان با این کد یعنی هر پروسه ای از NtTerminateProcess استفاده کرد برای بستن یک پروسه شما اجازشو میدین برخلاف چیزی که شما میخواین

به نظر من شما بهتره تابع OpenProcess یا NtOpenProcess رو هوک کنید چون جزو پارامتراش PID پروسه هست
می شه بررسی کرد اگه با PID پروسه شما یکی بود اجازه گرفتن هندل رو ندین (تابع نول برمی گرداند)

یعنی یه همچین کدی میشه، به فرض اینکه PID بروسه شما برابر 1000 هست، البته من یک مثال ساده در نظر گرفتم:


if ( dwProcessId == 1000 )
return 0;
else
return OrgOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId );


اگه از همون کتابخانه که تو اون سایت معرفی شده استفاده میکنید تنها کاری که شما باید انجام بدین اینه که
این توابع هوک رو میریزین در یک dll بعد تزریق میکنید به تمام پروسه های روی سیستم، در مورد تزریق dll میتونید فصل هوک کتاب Rootkits Subverting رو بخونید

البته تمام این چیزها که گفتم در سطح کاربر کاربرد داره، در سطح کرنل قضیه متفاوت و پیچیده تر است و باید منابع دیگری مطالعه کنید که نمونشو پستهای قبلتر گفتن

ایمان اختیاری
سه شنبه 28 اردیبهشت 1389, 08:22 صبح
hoax3r (http://barnamenevis.org/forum/member.php?u=47718) مرسی .. مطالبتون خبیل مفید بود .. اما یه سوال .. وقتی با NtOpenProcess هندل پروسس رو مثلا 0 کردیم خب اونوقت دیگه ternimateProcess نمی تونه بهش دسترسی داشته باشه که اونو close کنه ؟
بعدش یه سوال دیگه : این کدی که نوشتم به نظر شما مشکلش از کجا می تونه باشه .. من فکر کنم هندل رو درست حسابی نمی تونه بگیره ... وگرنه باقی کدها رو جدا جدا تست کردم مشکل نداشته ...
اینجکت کردنش هم مشکلی ندارم اون کتاب رو هم خوندم (گرچه کلی سوال جدید برام پیش اومد ولی خیلی مفید بود )

ایمان اختیاری
سه شنبه 28 اردیبهشت 1389, 08:47 صبح
البته جناب hoax3r (http://barnamenevis.org/forum/member.php?u=47718) راهنمایی شما کاملا ارزنده و مفید و قصد توهین یا کم کردن ارزشش رو ندارم ولی الان رفتم دنبال مطالبی در مورد کاسپراسکی دیدم دو تا dll توی فضای global اینجکت کرده
یکی از اونا mzvkbd3.dl نام داره و و دیگری kloehk.dll
با برنامه ی pe explorer اونا رو disassembly کردم :
http://barnamenevis.org/forum/attachment.php?attachmentid=49184&stc=1&d=1274157862
خود کاسپر هم از این روش استفاده می کنه برای اینکه پروسس avp.exe بسته نشه .. یعنی در واقع کاسپر مجوز بستن تمامی پروسس ها رو صادر می کنه به جز پروسس های خودش ....
و یه سوال جدید برام پیش اومد .. اگه منم بخوام terminateproces رو هک بکنم و روی سیستم کاسپر هم نصب باشه مشکل ساز نمی شه ؟
البته اینم اضافه کنم که در مورد کاسپر زیاد مطمئن نیستم که این روال رو داشته باشه ولی شواهد که این جور نشون می دن

hoax3r
چهارشنبه 29 اردیبهشت 1389, 00:09 صبح
hoax3r مرسی .. مطالبتون خبیل مفید بود .. اما یه سوال .. وقتی با NtOpenProcess هندل پروسس رو مثلا 0 کردیم خب اونوقت دیگه ternimateProcess نمی تونه بهش دسترسی داشته باشه که اونو close کنه ؟

نه نمی تونه، چون TerminateProcess نیاز به هندل داره، که قبل استفادش از OpenProcess میگیره


بعدش یه سوال دیگه : این کدی که نوشتم به نظر شما مشکلش از کجا می تونه باشه .. من فکر کنم هندل رو درست حسابی نمی تونه بگیره ... وگرنه باقی کدها رو جدا جدا تست کردم مشکل نداشته ...

ممکنه کامپایل بشه ولی اون مقصودی رو که از این کد دارین انجام نمیده یه مثال از کدتون زدم که بگم استباهش چیه، یه اشتباه دیگتون در این کد اینه که دو تا هندل رو با هم مقایسه کردین که اینم کار درستی نیست چون هر بار که از یه پروسه هندل میگیرین یه هندل جدید به شما میده در نتیجه نمیتونین مقایسشون کنید، البته میدونم هدفتون از این کد اینه که ببینید این هندل مال چه پروسه ای است ولی به این روش نمیشه، مثلا میتونید از تابع GetModuleFileNameEx و هندلی که از پروسه دارین استفاده کنید ولی باز این روش هم محدوده چون اگر هندل دسترسی مناسب رو نداشته باشه باز به نتیجه نمی رسین

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


البته جناب hoax3r راهنمایی شما کاملا ارزنده و مفید و قصد توهین یا کم کردن ارزشش رو ندارم

اینکه شما خودتون دنبال این قضیه میرید و نظرتون رو اینجا میگذارید به هیچ عنوان توهین به بنده نیست، بلکه برعکس خیلی هم خوشحالم میشم یه همچین روحیه رو از کسی میبینم:لبخندساده:



الان رفتم دنبال مطالبی در مورد کاسپراسکی دیدم دو تا dll توی فضای global اینجکت کرده
یکی از اونا mzvkbd3.dl نام داره و و دیگری kloehk.dll
با برنامه ی pe explorer اونا رو disassembly کردم :

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

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


mzvkbd3.dll : Mozilla 3 Virtual Keyboard

kloehk.dll : Kaspersky OE plugin loader


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

http://www.barnamenevis.org/forum/attachment.php?attachmentid=49230&stc=1&d=1274211421


و یه سوال جدید برام پیش اومد .. اگه منم بخوام terminateproces رو هک بکنم و روی سیستم کاسپر هم نصب باشه مشکل ساز نمی شه ؟
البته اینم اضافه کنم که در مورد کاسپر زیاد مطمئن نیستم که این روال رو داشته باشه ولی شواهد که این جور نشون می دن

نه فکر نمیکنم مشکل ساز بشه البته اگه در سطح کابر بخواین هوک کنین، چون کسپر در سطح کرنل این تابع رو هوک میکنه

ایمان اختیاری
یک شنبه 02 خرداد 1389, 17:31 عصر
آقا من هنوز در این مورد مشکل دارم .. وقتی می خوام هندل پروسس رو بگیرم به مشکل می خوره ..
بعدش یه سوال دیگه .. یه هوک نوشتم که پروسس رو از توی لیست پروسس ها مخفی می کرد ولی یه سری برنامه پیدا کردم که خیلی راحت این مورد رو دور می زدن .. برای اون مورد چیکار باید بکنم ؟ کم کم دارم عصبی می شم ...

hoax3r
دوشنبه 03 خرداد 1389, 11:10 صبح
من یه مثال از هوک OpenProcess و TerminateProcess نوشتم، که از notepad محافظت میکنه کافیه فایل hook.dll تزریق بشه به یه پروسه
برای تزریق به یک پروسه یه برنامه کوپیک نوشتم میتونین برای تست و .. ازش استفاده کنید.



آقا من هنوز در این مورد مشکل دارم .. وقتی می خوام هندل پروسس رو بگیرم به مشکل می خوره ..

باید سورس بزارید ندیده نمیشه نظری داد


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

باید ببینید از چه روشی یا چه API های برای گرفتن لیست پروسه ها استفاده کرده ممکنه Process32First و Process32Next باشه یا EnumProcesses و یا روشهای دیگه مثلا روش Task Manager که از NtQuerySystemInformation استفاده کرده