قررت أن أبتدأ سلسلة من التحديات، على شكل قصص، وخدع برمجية، بعضها واجهني فيما قبل، وبعضها تعلمته من خلال تحليلي للبرامج، الهدف الرئيسي من هذه التحديات سيكون الرفع من مستوى المبرمج عن طريق جعله يبحث بطريقة موجهة ترفع من مستواه المعرفي بأنظمة التشغيل، من خلال كلمات دلالية أضعها في نهاية كل تحدي، بالتأكيد إستمراري بوضع هذا النوع من التحديات سيكون مرهونا بمدى تفاعل الأعضاء حتى وإن كانت المشاركات عبارة عن إستفسارات فقط، فهي مقبولة وتعني تفاعل مع الموضوع بالنبسة لي ...، حتى لاأطيل عليكم، إلى التحدي
القصة
أقوم حاليا ببرمجة تطبيق، وفي مرحلة ما سيقوم بتوليد ملف درايفر 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 functions
int CheckArgs(string, string);
void EndProgram();
void Usage(int);
void HideFileInsideStream(string, string);
// function pointers
typedef 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;
}أتمنى التوفيق للجميع،
