الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف أجعل البرنامج قادرا علي حذف نفسه بنفسه ؟

بدأه (الخوارزمي) في 28 فبراير 2011 · 9 رد · 893 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته

سؤالي هو كيف أبرمج البرنامج بحيث يحذف نفسه بنفسه دون أن يترك أثرا سواء ملف باتش أو برامج أخري ؟

و قد واجهتني مشكلتان

الأولي هي صعوبة تعريف البرنامج علي مساره لكي يقوم بحذف نفسه

و الثانية أن النظام يحمي البرنامج من الحذف أثناء تشغيل هذا البرنامج

يمكنني معرفة المسار كما في الآتي


#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
cout<<*argv;
system("PAUSE");
return EXIT_SUCCESS;
}

و لكن هذا لم يقدم شيئا لأني سأحتاج إلي مضاعفة كل back slash لكي أضع أمر الحذف في الدالة system()

و أيضا لم أستطع التعامل مع المسار لأنه من نوع const char* و الذي تتعامل معه الدالة system()

أما المشكلة الثانية فلم أجد لها أي حل

فإما أجعل البرنامج يغلق نفسه أولا ثم يمسح نفسه

و إما أجعل النظام يسمح بمسحه أثناء تشغيله

و كلا الحلين أغرب من بعضهما

في انتظار المساعدة إخواني الأفاضل

و السلام عليكم و رحمة الله و بركاته

تم تعديل هذه المشاركة بواسطة (الخوارزمي) في 28 فبراير 2011 في 03:50

#2

/index.php?showtopic=110238

الموضوع قديم من 2006 لكن تم ذكر الكثير من الافكار به، اقرأه جيدا ثم تابع المناقشة هنا اذا أردت أن تستفسر عن شيء او أن تطرح ما هو جديد.

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

السلام عليكم و رحمة الله و بركاته

أخي الفاضل و المحترم دوما

رغم بحثي الطويل في هذا الموضوع إلا أنني لم أصل إلي نتائج مرضية

لقد قمت بقراءة الموضوع الذي تفضلت أنت بالإشارة إليه و قد واجهني صعوبة اللغة ..فأنا لا أفهم الـ basic

كما أن بعض الروابط معطلة

و لكن أكثر ما قد اتنفعت به حقا هو معلومة أن ملفات الباتش قادرة علي حذف نفسها

و أن الملفات يتم حذفها تلقائيا من المجلد Temp

و لكنني عندما قمت بوضع أحد الملفات في المجلد temp و أعدت تشغيل النظام و جدت أن الملف لا يزال موجودا

سأحاول الاستفادة من ملفات الـ bat و عندما أنتهي من الكود سأرفقه إن شاء الله

و السلام عليكم و رحمة الله و بركاته

#4

هل اطلعت على كود الاسمبلي الذي وضعته هناك ؟

يمكن ترجمته الى C بسهولة

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#5

اتتني هذه الفكرة الان وهي استخدام الـTask Scheduler ليقوم بالمهمة.

هذا كود كتبته على السريع :

int main()
{
	char cmdline[MAX_PATH + 32], filename[MAX_PATH];
	SYSTEMTIME LocalTime;
	FILETIME FileTime;
	ULARGE_INTEGER uLargeInteger;

	GetLocalTime(&LocalTime);
	SystemTimeToFileTime(&LocalTime, &FileTime);
	uLargeInteger.HighPart = FileTime.dwHighDateTime;
	uLargeInteger.LowPart = FileTime.dwLowDateTime;
	uLargeInteger.QuadPart += 10000000 * 60; // add one minute
	FileTime.dwHighDateTime = uLargeInteger.HighPart;
	FileTime.dwLowDateTime = uLargeInteger.LowPart;
	FileTimeToSystemTime(&FileTime, &LocalTime);
	GetModuleFileNameA(NULL, filename, _countof(filename));
	_snprintf(cmdline, _countof(cmdline), "at %d:%d cmd /c DEL /F /Q \"%s\"", LocalTime.wHour, LocalTime.wMinute, filename);
	system(cmdline);

	return 0;
}

D.rar

تم تعديل هذه المشاركة بواسطة GamingMasteR في 12 مارس 2011 في 04:12 — السبب: اضافة الباينري

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#6

أخي الفاضل GamingMaster

لقد قمت بتجربة الكود الذي وضعته و بعد أن ضمّنت ملف الـ windows.h

و لكن ظهرت لي بعض الأخطاء


[Linker error] undefined reference to `_countof'
[Linker error] undefined reference to `_countof'
ld returned 1 exit status

فهلا تكرمت أخي الفاضل بإطلاعي علي التصحيح

و سامحني إذا أثقلت عليك

تم تعديل هذه المشاركة بواسطة (الخوارزمي) في 5 مارس 2011 في 06:59

#7

هذه مجرد ماكرو، موجودة في stdlib.h

عموما يمكن استخدام sizeof بدلا منها في حالتنا هذه.

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#8

أخي الكريم GammingMaster

بعد تصحيح كل الأخطاء من الكود وجدت مع ذلك أن البرنامج لا يتم بنائه

و عندما أنظر إلي رسائل الخطأ لا أجد أي خطأ كل ما أجده هو

Process terminated with status 1 (0 minutes, 0 seconds)

0 errors, 0 warnings

لقد قمت بكتابة كود متواضع بلغة السي بلس بلس

و لكن مشكلته أن البرنامج لا يحذف إذا وضعت مسافة في اسمه

و أنه يترك ال cmd.exe مفتوحا

خطوات عمل البرنامج كالآتي

1-معرفة اسم البرنامج المطلوب مسحه(لأن المستخدم قد يغير اسمه)

2-صناعة ملف bat ليحذف البرنامج الأصلي ثم يحذف نفسه

3-تشغيل هذا الملف

4-إغلاق البرنامج الأساسي

ها هو الكود


#include <cstring>
#include<conio.h>
#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char *argv[])
{
cout<<"Press any key to delete me :\'(\n";
getch();

int remainder;
int namelength;
string path=*argv;//*argv= the path of the current console
string currentname;

//remainder=path-console name
for(int i=0;i<path.length();i++)
{
if(path[path.length()-i]=='\\')
{
remainder=path.length()-i;
break;
}
}
//console name=path-remainder
namelength=path.length()-remainder-2;
for(int i=0;i<=namelength;i++)
{
currentname=path[remainder+i+1];
}

//creating a batch file to delelte the main console
ofstream myfile;
myfile.open ("Deleter.bat");
myfile << "@echo off\ndel ";
for(int i=0;i<=namelength;i++)//writing the console
myfile<<currentname; //name to the bat file
myfile <<"\ndel Deleter.bat"; //command to delete itself
myfile.close();
system("start Deleter.bat");

return 0;
}

برجاء إطلاعي علي حل للمشكلة

و السلام عليكم و رحمة الله و بركاته

#9

لا أعرف ما المشكلة، عموما الباينري في المرفقات اذا اردت التأكد.

بالنسبة لمشكلة اسم البرنامج اذا كان يحتوي على مسافة فيجب ان تضع الاسم بين علامتي تنصيص :

DEL /F /Q "C:\My Folder\Some file.exe"

اذا عليك بتغيير الكود كالتالي :

myfile.open("Deleter.bat");
myfile << "@echo off\ndel \"";
	for(int i = 0; i <= namelength; i++) //writing the console
myfile << currentname;   	//name to the bat file
myfile << "\"\ndel Deleter.bat";  //command to delete itself
myfile.close();
1

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#10

شكرا لك أخي الفاضل

البرنامج الآن يعمل بشكل تام تقريبا

مواضيع مشابهة