• 0
uxirol

تحدي 1 - التلاعب بالنظام

سؤال

قررت أن أبتدأ سلسلة من التحديات، على شكل قصص، وخدع برمجية، بعضها واجهني فيما قبل، وبعضها تعلمته من خلال تحليلي للبرامج، الهدف الرئيسي من هذه التحديات سيكون الرفع من مستوى المبرمج عن طريق جعله يبحث بطريقة موجهة ترفع من مستواه المعرفي بأنظمة التشغيل، من خلال كلمات دلالية أضعها في نهاية كل تحدي، بالتأكيد إستمراري بوضع هذا النوع من التحديات سيكون مرهونا بمدى تفاعل الأعضاء حتى وإن كانت المشاركات عبارة عن إستفسارات فقط، فهي مقبولة وتعني تفاعل مع الموضوع بالنبسة لي ...، حتى لاأطيل عليكم، إلى التحدي

 

القصة

 

أقوم حاليا ببرمجة تطبيق، وفي مرحلة ما سيقوم بتوليد ملف درايفر AjsFu.sys لأداء بعض الوظائف، لكن لسبب من الأسباب أحتاج إلى إخفاء هذا الدرايفر بطريقة أضمن معها أن المستخدم لن يتمكن بأي وسيلة عادية من رؤية الملف.

 

الوسائل المعروفة هي  إستخدام الـ Command line كـ ls و dir و الـ File Explorer، كـ Windows Explorer، سواء كان الوضع إظهار الملفات المخفية مفعلا أم لا.

 

ملخص

 

لاأريد للمستخدم أن يقوم صدفة بعرض الملفات تحت وضع معين، ثم يرى الملف AjsFu.sys

 

 

الأنظمة المستهدفة

أي نظام ..

 

 

لغة البرمجة

 

اللغة لن تحدث أي فرق هنا، لكن يستحب C و ++C

 

 

المساعدة

 

هناك دالة بالـ kernel32 إسمها lcreat_ ستساعدك على إنشاء الملف بكل سهولة، إعتبر الدالة كـهدية مني :)

هناك أداة بالـ SysInternals إسمها streams.exe تمكنك من الكشف عن مثل هذا النوع من الملفات، في حال كنت تعلم مسبقا المسار الذي يختبئ به الملف.

 

الكود المساعد

لقد تركت الكومنت في الكود في حال أردت إستخدام doxygen لـتوثيق حلك وإضافته إلى مكتبتك.

تذكر أن الكود للمساعدة فقط، إعتبره ك skeleton لاغير

/*! \file main.cpp	\brief 	example <b>"\%windir\%: anFurjJ.sys"</b>        author: oussama*/#ifdef UNICODE#undef UNICODE#endif#include <Windows.h>#include <tchar.h>#include <iostream>#include <cstdio>using namespace std;#define EXIT_PROGRAM		0x00000000			//!< force program to quit.#define NO_FILE				0x00000001			//!< file does not exists.#define NO_PATH				0x00000010			//!< path does not exists.#define NO_FILE_PATH		0x00000011			//!< both file and path does not exists.#define FILE_PATH_VALID		0x00000100			//!< file and path are valid.// defining functionsint CheckArgs(string, string);void EndProgram();void Usage(int);void HideFileInsideStream(string, string);// function pointerstypedef HFILE(__stdcall *PROC__lcreat)(	LPCSTR lpPathName,	int iAttribute);/*!	\brief display the usage	@param[in] die [opt] **int** quit or continue program.*/void Usage(int die = 1){	printf("\n\t-$ iStreamFile file.ext path\n\n");	if (die == EXIT_PROGRAM)	{		EndProgram();	}}/*!	\brief if the supplied arguments are valid.	@param[in] file **string** file to hide in a stream.	@param[in] path **string** path to where to hide the file.	@return <b>ARGS_OK</b> if <i>file</i> and <i>path</i> exists<br />			<b>NO_FILE</b> if <i>filen</i> does not exists<br />			<b>NO_PATH</b> if <i>path</i> is not valid<br />			<b>NO_FILE_PATH</b> if both <b>file</b> and <b>path</b> does not exists.*/int CheckArgs(string file, string path){	return FILE_PATH_VALID;}/*!	\brief end the program.*/void EndProgram(){	getchar();	exit(EXIT_FAILURE);}/*!	\brief extract the filename.ext from a path	@param[in] file **string** file path.	@return filename.ext extracted.*/string GetFileName(string file){	// check if i have a valid string	if (file.length() < 1)		return NULL;	// do i have a path symbol '\'	int last_back_slash = file.find_last_of("\\");	if (last_back_slash == -1)		return file;	// index is start from 0	last_back_slash++;	// return the exact file name	return file.substr(last_back_slash);}/*!	\brief hide the file on the stream	@param[in] file **string**	@param[in] path **string***/void HideFileInsideStream(string file, string path){    //==========================================================$$    //    //      DO THE MAGIC - GooD Luck :)    //    //==========================================================$$	return;}/*!	\brief Entry point.	@param[in] argc [opt] **int**	@param[in] \*\*argv [opt] **string***/int main(int argc, char *argv[]){	printf("\n\tiStreamFile v0.1, coded by oussama (c) 2009.\n\n");	// need exactly two agruments	if (argc != 3)	{		printf("invalid number of argument, need exactly two:");		Usage(EXIT_PROGRAM);	}	// get the arguments	string file = argv[1];	string path = argv[2];	printf("[info] file: %s\n", file.c_str());	printf("[info] path: %s\n\n", path.c_str());	int result = CheckArgs(file, path);	int end = false;	switch (result)	{	case FILE_PATH_VALID:		break;	case NO_FILE:		printf("file '%s' does not exist.\n", file);		end = true;		break;	case NO_PATH:		printf("path '%s' is not valid.\n", path);		end = true;		break;	case NO_FILE_PATH:		printf("neither file '%s' or path '%s' are valid.", file, path);		end = true;		break;	default:		break;	}	// quit if args are not valid	if (end) EndProgram();		// Start the process	HideFileInsideStream(file, path);	getchar();	return 0;}

أتمنى التوفيق للجميع،

تم تعديل بواسطه uxirol
3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

12 إجابة على هذا السؤال .

  • 0

يمكننا تغيير الAttribute للملف الى System (بدل Hiddin)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لكن يمكن إظهاره عن طريق الكومند attrib، أو تفعيل خاصية إظهار ملفات النظام ..

إكتشف كيف يعمل برنامج streams.exe، الذي تحدث عنه في الموضوع :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

كلامك سليم 100%

ان شاء الله ارجع للموضوع و لكن الوقت ضيّق.

 

تعديل:

-----

 

قرأت عن الاداة stream.

هذه الاداة بامكانها اظهار الاجزاء الاخرى (الثانوية) التابعة للملف الرئيسي. (Alternate Data Streams)

عادة استعمال الامر dir في سطر الاوامر لن يظهرها. و افتراضيا لن تظهر في متصفح الملفات (explorer).

و لكن في انظمة تشغيل ويندوز فيستا و ما بعد يمكنك اظهارها من خلال الامر dir /R.

اذا حذفت الملف الملف الرئيسي تحذف جميع الADSes معه.

 

اذا ما الفائدة؟

هل يمكنني ان تضيىء علينا بالمعلومات اكثر؟

تم تعديل بواسطه adam-master
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

معلوماتك صحيحة 100%

صراحة لم أكن أعلم حول الـ dir /r، شكرأ لك على المعلومة.

 

الآن دورك أن تكتشف كيف يمكنك أن تنشئ ملف على شكل ADS، أي تضيفه إلى الـ Stream، إن صح التعبير، بعد ذلك إستخدم تلك المعلومة، في برنامج، اللغة لن تشكل فرقا هنا، يمكنك أن تستخدم البايتون إن أردت، أو قم بتعديل الكود المرفق بالأعلى، إستخدم الأداة streams.exe لتتأكد من صحة جوابك، وأرفق الصورة كإثبات.

 

في الواقع، لقد وضعت الجواب داخل الموضوع :P

بالتوفيق.

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الحقيقة قمت بعمل برنامج بسيط و لكن لا يؤدي المطلوب. حسب المراجع على الانترنت هذه الدالة غير موثّقة بشكل كامل و هذه هي المشكلة.

 

هذا البرنامج الذي عملته:

#include <iostream>#include <windows.h>#include <string>#ifdef UNICODE#undef UNICODE#endifint main(){    LONG fileHandle = 0;    std::string fileName = "";    std::cout << "Enter file name: " << std::endl;    std::cin >> fileName;    std::cout << "Enter:\n"                         "\t1 to make the file read only\n"                 "\t2 to make the file Hidden\n"                         "\t4 to make the file a system file\n"                         "\t0 to create a normal file"              << std::endl;    int Atrrib = 0; // Create or open a normal file    if (!(std::cin >> Atrrib))    {        std::cout << "You did not input a valid integer!" << std::endl;        return 1;    }            if (Atrrib != 0 && Atrrib != 1 && Atrrib != 2 && Atrrib != 4)    {        std::cout << "Invalid input" << std::endl;        return 2;    }    fileHandle = _lcreat(fileName.c_str(), Atrrib);    if (fileHandle == HFILE_ERROR)    {        std::cout << "An error occured. Operation failed." << std::endl;    }    else    {        std::cout << "Operation completed successfully" << std::endl;    }}

طبعا عملت البرنامج بسرعة لم استخدم دوال لتنظيم الكود.

 

المهم الصراحة لا اعلم كيف اضيف ADS. اذا في Hints و اذا الامر يحتاج هندسة عكسية انا لست جاهز ابدا!

تم تعديل بواسطه adam-master
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لقد أخطأت الفهم الدالة lcreat_، وضعتها فقط لتسهيل عملية إنشاء الملف عوض ان تستخدم مثلا CreateFile، فقط لاغير.

 

راجع المقال التالي

http://www.bleepingcomputer.com/tutorials/windows-alternate-data-streams/

 

لاحظ ان الطريقة المستخدمة للكتابة والقراءة من الملف، هي بآستخدام  path/to/folder/file.txt:hidden.txt أو path/to/folder:hiddex.txt

ماالمميز بهذا المسار، وكيف يمكنك أن تستخدمه؟

 

أي إستفسار فقط إسأل

تم تعديل بواسطه uxirol
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لقد أخطأت الفهم الدالة lcreat_، وضعتها فقط لتسهيل عملية إنشاء الملف عوض ان تستخدم مثلا CreateFile، فقط لاغير.

 

راجع المقال التالي

http://www.bleepingcomputer.com/tutorials/windows-alternate-data-streams/

 

لاحظ ان الطريقة المستخدمة للكتابة والقراءة من الملف، هي بآستخدام  path/to/folder/file.txt:hidden.txt أو path/to/folder:hiddex.txt

ماالمميز بهذا المسار، وكيف يمكنك أن تستخدمه؟

 

أي إستفسار فقط إسأل

 

اه انا فكّرت انّ _lcreate تقوم مباشرة بهذا العمل!

اوك سوف اعود ان شاء الله :)

 

تعديل:

-----

 

الصراحة المساعدة التي قدمّتها (_lcreate) اصابتني بالعمى ههههه

 

اوك الكود البسيط هو التالي و جربته يعمل :) (Victory!)

#include <iostream>#include <windows.h>#include <string>#ifdef UNICODE#undef UNICODE#endifint main(){       LONG fileHandle = 0;    std::string fileName = "E:\\MyFile";    fileHandle = _lcreat((fileName + ":myADS").c_str(), 0);    if (fileHandle == HFILE_ERROR)    {        std::cout << "An error occured. Operation failed." << std::endl;    }    else    {        std::cout << "Operation completed successfully" << std::endl;    }}

حسنا هذا استنتاجي:

نظام الملفاتNTFS في وندوز يعتمد بشكل كامل على اسم الملف و يقوم بتقسيم الملف الى موجات من البايتس (Streams) بالاعتماد كاملا على اسم الملف. (ما رأيك بالاستنتاج؟ :) )

و لهذا السبب اي دالة تكتب على القرص الصلب (او غيره و طبعا نظام الملفات المستعمل في المكان الذي يتمّ الكتابة عليه هو NTFS لان ADS مدعوم من NTFS فقط) ستعمل فقط باختيار الاسم الصحيح للملف.. و الان فهمت لماذا سمحت لنا باستخدام اي لغة .. انت مهتم فقط بالسلسلة النصية التي يتم تمريرها الى الدالة المسؤولة عن انشاء الملف :)

تم تعديل بواسطه adam-master
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

حلك سليم 100/100 :D

أتمنى أن تكون قد إستفدت.

 

حسناً لدي سؤال، هل يمكن للملف أو المجلد أن يحتوي على أكثر من stream؟

 

مارأيك الأن أن تعكس العملية، يعني أن تبرمج أداة كـ Streams.exe، لاتقلق لن أتركك بدون مساعدة :)

 

في الدالة CreateFile إستخدم FILE_FLAG_BACKUP_SEMANTICS لكي تقرأ الـ Streams

إكتشف الطريقة التي تستخدم بها الدالة BackupRead وكيف يمكنها أن تساعدك هنا.

 

أنت قمت بحل التحدي، فكل ماكان يهمني هو الوصول إلى الطريقة التي يكتب بها الـ path، لكن سيكون من الجميل، لو برمجة أداة، بواجهة رسومية تؤدي هذه الوظيفة، أنا لدي ;)

 

بالتوفيق.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

 

أتمنى أن تكون قد إستفدت.

استفدت :)

 

 

 

مارأيك الأن أن تعكس العملية، يعني أن تبرمج أداة كـ Streams.exe، لاتقلق لن أتركك بدون مساعدة :)

 

في الدالة CreateFile إستخدم FILE_FLAG_BACKUP_SEMANTICS لكي تقرأ الـ Streams

إكتشف الطريقة التي تستخدم بها الدالة BackupRead وكيف يمكنها أن تساعدك هنا.

 

أنت قمت بحل التحدي، فكل ماكان يهمني هو الوصول إلى الطريقة التي يكتب بها الـ path، لكن سيكون من الجميل، لو برمجة أداة، بواجهة رسومية تؤدي هذه الوظيفة، أنا لدي ;)

 

بالتوفيق.

 

فعلا سيكون شيىء ممتع ان نقوم ببرمجة شيىء كهذا و لكن اعتذر اخي الكريم من ضيق الوقت الذي يمنعني من الدخول بهذه الاشياء :(

 

ان شاء الله يكمل معك احد الاعضاء هذا البرنامج و اعتذرمن جديد.

 

ملاحظة:

------

المكان الانسب لهذا الموضوع هو قسم Windows API.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يمكنني تصميم GUI للبرنامج المطلوب :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مرحباً بك أخي حمزة :)

 

في إنثظار تصميمك ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يجب أن نتحدث قليلا حول ماهية البرنامج الذي سأقوم بتصميمه أولا :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .