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

[ تمت الإجابة ]ما الاقتراح لجعل ملف يحذف نفسه!

مغلقرائج
بدأه Xacker في 22 أكتوبر 2006 · 45 رد · 24,866 مشاهدة · في أرشيف قسم Windows APIs
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ما الاقتراحات التي قد تخطر على بالكم لجعل ملف ما يقوم بحذف نفسه, بتشكيل ملف اخر وطلبه لحذف الملف الاصلي.. بوضع الملف في حالة جاهزية للحذف عند الاغلاق.. لا ادري.. فكرت بطرق عديدة لكن الملف دوما فيها مستخدم ولا يكون بالامكان حذفه

فما العمل؟

السلام عليكم وشكرا سلفا.

تم تعديل هذه المشاركة بواسطة Xacker في 22 أكتوبر 2006 في 21:39

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#2

يمكنك جعل الملف يقوم بكتابه ملف اخر وظيفته مسح الأول

و قبل ان ينهي الأول عمله يشغل الملف المسند اليه وظيفه المسح ثم يغلق نفسه

و يجب ان ينتظر الملف الثانى عده ثوان حتى يضمن ان الأول اغلق ويحاول المسح ويعيد الكره اذا فشل

:)

Moore’s Law

– “Number of transistors in chips doubles every 18 
months”.
–  Every 10 years, processors are 100 times more 
powerful.

Gilder’s Law

– “Bandwidth grows at least three times faster than 
computer power”.
– Assuming bandwidth doubles every 12 months; 
every 10 years, it is 1000 times better.
#3

اعتقد من وجهة نظري المتواضعة :( ان افضل طريقة هي كالتالي

لنفرض ان الملف الذي يريد حذف نفسه هو A

يقوم A بانشاء الملف B

الذي وظيفته اغلاق البروسيس بتاع الـA وبعد ذلك يقوم B بحذف A

#4

حقيقة لدي فكرة لا أدري اذا كانت ستفيد

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

#5

للاسف اخ Crazy-Man و لكن كيف يقوم ملف بقص نفسه لا يمكن ان تحدث

لان الملف يعمل لا يمكن ان يقص

#6

السلام عليكم

كل عام وانتم بالف خير

وتقبل الله طاعتكم

هذه احد الفكر لحذف لملف

هذا مثال على حذف الملف لنفسه

طبعا انا وضعت الملفات بنفس الفولدر ولكن يجب ان يكونوا داخل الملف الEXE

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

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

الثاثي ملف تنفيذي أخر والثالث ملف باتش

هذا مثال سريع تستطيع التعديل عليه وجعله افضل

الملف لمراد حذفه اسمه DelSelf.exe

VB Code

Public Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Public Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long

Sub Main()
DeleteSelf
End Sub



Sub DeleteSelf()
On Error Resume Next
Dim lpPath As String, App_Path As String, ExeFile As String
lpPath = WinDir + "\" ' "\MyDir\"
'MkDir lpPath
'SetAttr lpPath, vbHidden
Dim FileBody As String


App_Path = getShortName(App.Path)
If Right(App_Path, 1) <> "\" Then App_Path = App_Path + "\"
ExeFile = App_Path + App.EXEName + ".exe"
FileCopy App_Path + "tmpcmd.exe", lpPath + "tmpcmd.exe"

FileBody = GetFile(App_Path + "\" + "tmpdel.bat")
FileBody = Replace(FileBody, "$CmdFil$", lpPath + "tmpcmd.exe", , , vbTextCompare)
FileBody = Replace(FileBody, "$ExeFile$", ExeFile, , , vbTextCompare)

Dim Fr As Long
Fr = FreeFile
Open lpPath + "tmpDel.bat" For Output As Fr
   Print #Fr, FileBody
Close Fr
Shell lpPath + "tmpDel.bat",vbHide
End Sub

Function GetFile(lpName As String) As String
On Error Resume Next
If Dir(lpName) = "" Then Exit Function
Dim Fr As Long
Fr = FreeFile
Open lpName For Input As Fr
   GetFile = Input(LOF(Fr), Fr)
Close Fr
End Function


Function WinDir() As String
On Error Resume Next
Dim lpBuff As String
lpBuff = Space(255)
nlen = GetWindowsDirectory(lpBuff, Len(lpBuff))
WinDir = Left(lpBuff, nlen)
End Function

Function getShortName(ByVal lpLongPath As String) As String
On Error Resume Next
Dim lpBuff As String
lpBuff = Space(255)
nlen = GetShortPathName(lpLongPath, lpBuff, Len(lpBuff))
getShortName = Left(lpBuff, nlen)
If Len(getShortName) = 0 Or Err Then getShortName = lpLongPath
End Function

الملف الثاني اسمه tmpcmd.exe

C++ Code

#include <windows.h>
int del(char*);
int add(char*,char*);
void wait(int);
int val(char*);
double dval(char*);

int main(int argc,char **argv)
{ 
	if(argc<=2)return -1;
	char * cmd=argv[1];
	if(strcmp(cmd,"del")==0)
		return del(argv[2]);

	if(strcmp(cmd,"wait")==0)
	   {wait(val(argv[2]));return 0;}

 	if(strcmp(cmd,"add")==0)
	   {if(argc<=3)return -1;
		 return add(argv[2],argv[3]);  
	   }
	return 0;

}
void wait(int timeOut)
{
 Sleep(timeOut);
 //long currT=GetTickCount()+timeOut;
 //while(GetTickCount()<currT);
}
int del(char* lpFileName)
{
  return DeleteFile(lpFileName);
}

int add(char* Num1,char* Num2)
{
  return val(Num1)+val(Num2);
}

int val(char* str)
{ int ret_val=0;
  for(int i=0;i<strlen(str);i++)
  {int chr=(int)str;
   if(chr>=48 && chr<=57)
   { 
	 ret_val=(ret_val*10)+(chr-48);   
   }
   else
   {if(chr!='\0')return 0;}
  }
  return ret_val;
}

ملف الباتش الثالث اسمه

@echo off
rem if "%1" == "" goto exitfile
rem set CmdFile= %1
rem set ExeFile= %2 %3 %4 %5 %6 %7 %8 %9

set CmdFile= $CmdFil$
set ExeFile= $ExeFile$

%CmdFile% wait 500

set count= 0
:delete
%CmdFile% add %count% 1
if %errorlevel% == 9009 goto exitfile_0
set count=%errorlevel%
rem echo try = %count%
if %count%==20 goto exitfile

%CmdFile% del %ExeFile%
if %errorlevel% == 1 goto exitfile
if %errorlevel% == 0 goto delete

:exitfile_0
del %ExeFile%

:exitfile
del %CmdFile%
del %0

DelSelf.rar

تم تعديل هذه المشاركة بواسطة Mo7eb_Alrasool في 23 أكتوبر 2006 في 15:11

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#8
اقتباس
لنفرض ان الملف الذي يريد حذف نفسه هو A

يقوم A بانشاء الملف B

الذي وظيفته اغلاق البروسيس بتاع الـA وبعد ذلك يقوم B بحذف

تعجبني هذه الفكرة لسهولة تطبيقها لو اردت بالاسمبلي.. طريقة الاخ محب الرسول جيدة لكنها تحتاج الى الكثير من العمل بالاسمبلي.. mov this, xor that :P

ساحاول تطبيق ما اقترحتم والباب مفتوح دوما لمزيد من الافكار للاستفادة والمناقشة.

السلام عليكم

تم تعديل هذه المشاركة بواسطة Xacker في 23 أكتوبر 2006 في 22:50

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#9

السلام عليكم

اقتباس
تعجبني هذه الفكرة لسهولة تطبيقها لو اردت بالاسمبلي
كلام سليم ولكن سيبقى الملف B موجود ولن يحذف نفسه لذلك استخدمت ال batch file لأنك تستطيع خذفه من داخل نفسه فنحذف الملف الرئيسي ثم الملف التنفيذي الثاني ثم يحذف نفسه وما بضل اثر للجريمه :D :P

حياك الله اخي khabini.net

بالنسبة لملف ال c++ فهذا الملف له ثلاث وظائف

حذف و ايقاف لمدة زمنية معينة وجمع رقمين

tmpdel.exe [del]  FileName
		   [wait] time in millisecounds
		   [add]  Number1 ,Number2

wait استخدمتها للانتظار قليلا حتى أعطي الملف الأصلي المراد حذفه الوقت حتى يغلق نفسه

del لحذف الملف الأصلي وترجع 1 اذا تم حذفه او 0 اذا فشلت العملية

add استخدمتها لجمع رقمين لمعرفة عدد محاولات الحذف , اذا وصلت الى 20 فلن يحاول الحذف مرة اخرى , كنت ساستخدم هذه الطريقة قبل ان استخدم ال wait

لحذف ملف
int del(char*);
لجمع  رقمين - هما يكونا نصيين ويتم ارجاع قيمتهما باستخدام الدالة التي بعدها
int add(char*,char*);
int val(char*);

للانتظار  قليلا بالميلي سكند
void wait(int);

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#10

لا ادرى لم كل هذا الدوران

هم ملفان وخلاص

و ممكن يكون الملف اللى بيمسح مخفى فى اى مكان فى الجهاز

Moore’s Law

– “Number of transistors in chips doubles every 18 
months”.
–  Every 10 years, processors are 100 times more 
powerful.

Gilder’s Law

– “Bandwidth grows at least three times faster than 
computer power”.
– Assuming bandwidth doubles every 12 months; 
every 10 years, it is 1000 times better.
#11

صدقت اخي محب الرسول سيبقى الملف B بعد الحذف اذا تم حفظه بالشكل العادي ولكن لم لا يتم انشاء الملف في مجلد الـTemp الخاص بالنظام

او ينشا A الملف B من البداية في الذاكرة ولا يتم حفظ B اصلا

تم تعديل هذه المشاركة بواسطة alawashiz في 24 أكتوبر 2006 في 08:01

#12

السلام عليكم

هذه طريقة أخرى سهلة وبسيطة

Sub Main()
On Error Resume Next
Dim FileBody As String
App_Path = App.Path
If Right(App_Path, 1) <> "\" Then App_Path = App_Path + "\"

FileBody = GetText(App.EXEName + ".exe")

Dim Fr As Long
Fr = FreeFile
Open App_Path + "tmpDel.bat" For Output As Fr
   Print #Fr, FileBody
Close Fr

Shell App_Path + "tmpDel.bat", vbHide
End

End Sub


Function GetText(FileName)
GetText = " for /L %%F in (1,1,100) do (echo %%F " + vbNewLine + _
		  "  if not exist " + FileName + " del %0 " + vbNewLine + _
		  "  if not exist " + FileName + " exit" + vbNewLine + _
		  "  del " + FileName + vbNewLine + _
		  ")" + vbNewLine + _
		  ":end_file" + vbNewLine + _
		  "del %0"
End Function

ما فيها تعقيد ولا شيئ

تم تعديل هذه المشاركة بواسطة Mo7eb_Alrasool في 24 أكتوبر 2006 في 09:10

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#13

ما عرفنا لك يا محب الرسول .. C++ او JAVA او VB .. حدد موقفك :) .. ما شاء الله عليك وزاد علماً ,

لكن عندي سؤال بالنسبة ل:

اقتباس
ملف الباتش الثالث اسمه

ماهو هذا الملف .. هل بنيته بلغة برمجة .. أو هو سكريبت .. ام ماهو بالظبط .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#14

السلام عليكم

كل عام وانت بخير أخوي الشمري

شكرا أخوي شمري وحياك الله

من أفضل مشرفين المنتدى :) الله يعطيك العافية يا رب

ملف الباتش هو ملف سكربت زي ما تفضلت خاص بال MS-DOS و الوندوز

ملف نصي بتفسر من ال command.com او cmd.exe للNT

بتقدر تستخدم نفس الأوامر اللي بتستخدمها في ال دوس او الكونسل Windows Dos

وتستضيع اضافة جمل مثل if for goto

يعني عندك مجموعة اوامر تستطيع ان تجمعها معا في ملف باتش واحد وتضيف بعض الجمل الشرطية للتفاعل مع المستخدم

والله أعلم طبعا

ان شاء الله اكون افدتك

تم تعديل هذه المشاركة بواسطة Mo7eb_Alrasool في 24 أكتوبر 2006 في 09:36

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#15

وأنت بخير وبصحة وسلامة ... معلش نسيت العيد :) ,

فهمت .. طريقتك مميزة .. في التوضيح والامثلة .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#16

السلام عليكم

ممكن ان يحذف الملف نفسة عن طريق انشاء Thread

بملف exe ثاني ومهمه هذا الthread هي اغلاق الملف وحدفة

وهذا الكود من www.pscode.com

#include <windows.h>
#include <stdio.h>

struct _RemoteData {
  CHAR moduleName[MAX_PATH];
  DWORD processID;
  HANDLE (__stdcall *OpenProcessPtr)(DWORD, BOOL, DWORD);
  DWORD (__stdcall *WaitForSingleObjectPtr)(HANDLE, DWORD);
  BOOL (__stdcall *CloseHandlePtr)(HANDLE);
  BOOL (__stdcall *DeleteFilePtr)(LPCTSTR);
  void (__stdcall *SleepPtr)(DWORD);
  void (__stdcall *ExitProcessPtr)(UINT);
};

// Allocation size for the InjectedThreadProc in the host process.
// Well, you can use some hacks to calc the function size in runtime, I leave it for you.
#define MAX_CODE_SIZE 1024

DWORD WINAPI InjectedThreadProc(_RemoteData* rd)
{
	HANDLE hProcess = NULL;
	// Open the process we want to delete its file, the one who injected this code...
	if (hProcess = rd->OpenProcessPtr(PROCESS_ALL_ACCESS, FALSE, rd->processID)) {
		// Wait 'till it finishes executing.
		rd->WaitForSingleObjectPtr(hProcess, INFINITE);
		// Close handle to it.
		rd->CloseHandlePtr(hProcess);
	}
	// Delete process's executable file, sleep a bit and retry if required...?
	while (!rd->DeleteFilePtr(rd->moduleName)) rd->SleepPtr(1000);
	// Kill host also.
	rd->ExitProcessPtr(0);
	return 0;
}

int InjectCode()
{
	int rc = -1;
	SIZE_T dummy = 0;
	LPVOID codeAddr = NULL;
	HANDLE hProcess = NULL, hThread = NULL;

	_RemoteData rd = {0};
	CONTEXT cntxt = {0};

	STARTUPINFO sui = {0};
	PROCESS_INFORMATION pi = {0};
	sui.cb = sizeof(STARTUPINFO);
	// Create a host process that will run our code.
	if (!CreateProcess(NULL, "notepad.exe", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS | CREATE_SUSPENDED, NULL, NULL, &sui, π)) {
		rc = 1;
		goto cleanup;
	}
	// Luckily, PROCESS_INFORMATION returns to us precious handles...
	hProcess = pi.hProcess;
	hThread = pi.hThread;

	// Allocate some memory for our thread function to be copied to the host process.
	codeAddr = VirtualAllocEx(hProcess, NULL, MAX_CODE_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE); // XRW
	if (!codeAddr) {
		rc = 2;
		goto cleanup;
	}

	// Get pointers to required functions.
	rd.OpenProcessPtr = OpenProcess;
	rd.WaitForSingleObjectPtr = WaitForSingleObject;
	rd.CloseHandlePtr = CloseHandle;
	rd.DeleteFilePtr = DeleteFile;
	rd.SleepPtr = Sleep;
	rd.ExitProcessPtr = ExitProcess;

	// Pass our own process ID so the remote thread can wait for us to terminate.
	rd.processID = GetCurrentProcessId();
	// Get our own executable path name so the remote thread can later delete us.
	GetModuleFileName(NULL, rd.moduleName, MAX_PATH);

	// Write the CODE into the process!
	if (!WriteProcessMemory(hProcess, codeAddr, (LPVOID)&InjectedThreadProc, MAX_CODE_SIZE, &dummy)) {
		rc = 3;
		goto cleanup;
	}
	if (dummy != MAX_CODE_SIZE) {
		rc = 4;
		goto cleanup;
	}

	// Get remote thread's context, so we can use it for our needs.
	cntxt.ContextFlags = CONTEXT_FULL; // We actually need ESP and EIP.
	if (!GetThreadContext(hThread, &cntxt)) {
		rc = 5;
		goto cleanup;
	}
	// Change the EIP to point to the thread procedure we copied earlier.
	// So when we assume running, our code will immediately start running.
	cntxt.Eip = (DWORD)codeAddr;

	// Every thread function gets one argument, this will be a pointer to _RemoteData structure.
	// Put the structure on the stack so the remote thread will be able to use it, make sure it's 4 bytes aligned!
	cntxt.Esp -= sizeof(_RemoteData); // Make some room.
	// Write it into the host process' stack space.
	if (!WriteProcessMemory(hProcess, (LPVOID)cntxt.Esp, (LPVOID)&rd, sizeof(_RemoteData), &dummy)) {
		rc = 6;
		goto cleanup;
	}
	if (dummy != sizeof(_RemoteData)) {
		rc = 7;
		goto cleanup;
	}

	// Now PUSH the ESP to point to the structure we copied above.
	// Just as pushing a pointer to rd so the remote thread will POP(or whatever usage of ESP) this pointer as its argument and use it...
	// cntxt.Esp points by now to our copied structure.
	// Making more room for the pointer itself on the stack and writing it.
	if (!WriteProcessMemory(hProcess, (LPVOID)(cntxt.Esp - sizeof(DWORD)), (LPVOID)&cntxt.Esp, sizeof(DWORD), &dummy)) {
		rc = 8;
		goto cleanup;
	}
	if (dummy != sizeof(DWORD)) {
		rc = 9;
		goto cleanup;
	}

	// Remember that ESP is always advanced by one DWORD after a push, something like atomic: mov [esp], dwVal; sub esp, 4.
	// Advance it twice, because of the last WriteProcessMemory.
	cntxt.Esp -= sizeof(DWORD)*2;

	// After we've set everything correctly in place, set the remote thread's context to the changed one.
	if (!SetThreadContext(hThread, &cntxt)) {
		rc = 10;
		goto cleanup;
	}
	// Now the thread will RESUME running from our copied code using the pointer to rd we copied to stack.
	if (!ResumeThread(hThread)) {
		rc = 11;
		goto cleanup;
	}

	rc = 0;
cleanup:
	// Oh no? (@_@) I'm looking at the error code!
	if (pi.hProcess) CloseHandle(pi.hProcess);
	if (pi.hThread) CloseHandle(pi.hThread);
	return rc;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCommandLine, int nCmdshow)
{
	if (InjectCode() != 0) {
		MessageBox(NULL, "Cannot inject code to host process!", "Self Deleting Executable!", MB_OK);
		return -1;
	}
	MessageBox(NULL, "Do whatever you want here,\r\nthread is blocked on us.", "Self Deleting Executable!", MB_OK);
	return 0;
}
#17

السلام عليكم

سؤال مكرر...سبق طرحه في قسم لغة التجميع :)

لكن هذه اول مرة يطرح في قسم API

وهذه طريقة اخرى...مجربة

MoveFileA(<original.exe>, <original.bak>);
CopyFileA(<original.bak>, <original.exe>);
WaitForSingleObject(hProcess, INIFINITE);
DeleteFileA(<original.bak>);
d4baa0.gif
#18

هناك يوجد شرح لكثير من الطرق (لم أجربها) :

Self-Deleting Executables

اقتباس
وهذه طريقة اخرى...مجربة

على أي الأنظمة تعمل؟

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#19

السلام عليكم

اقتباس
اقتباس
وهذه طريقة اخرى...مجربة

على أي الأنظمة تعمل؟

اظن ان قصد استازي محمدعبد العزيز هو تغيير اسم الملف لاسم مموه بامتداد ليس exe

اذا كان هذا ما يقصد فهذه الدالة تفي باغرض والله اعلم

MoveFileEx(original.exe,original.bak,1)

وتستطيع كما قال الأخ alawashiz

اقتباس
ولكن لم لا يتم انشاء الملف في مجلد الـTemp الخاص بالنظام
اي ان ملف الoriginal.bak يكون في الTemp
char *lpPath		=new char[MAX_PATH],
	 *lpNewFileName =new char[MAX_PATH];
GetTempPath(MAX_PATH,lpPath);
GetTempFileName(lpPath,"000",0,lpNewFileName);

MoveFileEx(argv[0], lpNewFileName,1);

مع ملا حظه ان ااmovefile يجب ان تكون في نفس البارتشن اذا كان الملف مستخدم in use

والا اختيار مكان لنقل الملف على نفس البارتشن

يجب التأكد

if(argv[0][0]!=lpNewFileName[0])

واذا لم افهم قصد اخوي محمد فانا أسف وكلامي يكون عن شيئ أخر

والله اعلم

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#20

انتها الموضوع هنا .....ولكن هناك طرق اخرى و اقوى و هذه ابسطها :

انشاء ملف BAT يقوم بحذف البرنامج و حذف نفسه

Private Sub Command1_Click()
	If InDesignMode = False Then
	Dim j As String
	Dim g As String

	j = NameFix(App.EXEName) & ".exe" ' Name Fix for name such Copy 

Of Project1.exe

	Filenum = FreeFile

	g = App.Path & "testx.bat"

	j = "del " & j & vbCrLf & _
	"del testx.bat"

	Open g For Output As Filenum
	Print #Filenum, j
	Close Filenum

	Shell g, vbHide				  'Call our batch file and Quit
	End
Else
	MsgBox "Connot delete Exe in VB Design Mode Please make a exe 

first", vbExclamation, "Error Deleting EXE"
End If
End Sub

Public Function NameFix(Txt As String) As String
'Fix long File Name
Dim temp As String
Dim j
j = Split(Txt, " ", -1, 1)
If UBound(j, 1) <> 0 Then
	For i = 0 To UBound(j, 1)
	temp = temp & j(i)
	Next

		If Len(temp) < 7 Then
		temp = temp & "~1"
		Else
		temp = Left(temp, 6) & "~1"
		End If
		NameFix = temp
Else
	NameFix = Txt
End If
End Function

Private Function InDesignMode() As Boolean
	On Error GoTo Err
	Debug.Print 1 / 0
	InDesignMode = False
	Exit Function
Err:
	InDesignMode = True
End Function

و افضل هذه الطرق هو استخدام الاسلوب نفسه في عملية Pack بل هي افضل لأننا سوف نقوم بعملية Memory Injection:

OpenProcess = kernel32
VirtualAllocEx = kernel32
VirtualFreeEx = kernel32
CreateRemoteThread = kernel32
CreateThread = kernel32
WriteProcessMemory = kernel32 
ReadProcessMemory = kernel32
GetCurrentProcessId = kernel32
ExitThread = kernel32
ExitProcess = kernel32
CopyMemory = kernel32
CreateWindowEx = kernel32
RegisterClass = kernel32
UnregisterClass = kernel32

-------------------------------------------------------
GetProcAddress = kernel32
GetModuleHandleA = "kernel32
LoadLibraryA = kernel32
DeleteFile = kernel32

و تكمن بشكل مختصر بحقن الملف في ذاكرة الملف الذي سوف يقوم بحذف نفسه بشرط ان يكون ملف تنفيذي طبعا

وهذه هي نفس طريقه انشاء Thread و عندها يصبح Multiple Thread ولكن بشكل كامل.

لقد تم طرح هذا الموضوع في منتدى VB منذ اكثر من عام و قمت بالاجابة عليه عن طريق مثال و لكن لا اذكر عنوان الموضوع!!!

اذا اراد الله بعبد خيراً فقهه في دينه

((إياكم والغلو في الدين فإنما هلك من كان قبلكم بالغلو في الدين )).

( إن هذا الدين يسر ولن يشاد هذا الدين إلا غلبه فأوغلوا فيه برفق )

( هلك المتنطعون ، هلك المتنطعون ، هلك المتنطعون )

<span style='font-size:14pt;line-height:100%'>طريقة سريعة لحفظ كتاب الله العزيز</span>

<span style='font-size:14pt;line-height:100%'>تعرف على عباقرة الكذب</span>

#21

سبق وطرح الموضوع في منتدى VB، ولكن باستخدام OLE

هل يمكن ان تحذف نهائيا برنامج قيد التشغيل

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

#22

يمكن أن يقوم الملف بحذف نفسه بدون اللجوء إلى إنشاء ملف آخر

و إليكم مثالا توضيحيا

قم بعمل ملف جديد و ليكن اسمه a.bat

اكتب بداخله

del a.bat

احفظ التغيرات

و double click على الملف

النتيجة الملف يحذف نفسه

و حلت المشكلة

التفسير:

البرنامج لدى تشغيله فإنه ينشئ process و اهذا الأخير يتولى التفيذ

أي أنه يمكن أن يحذف الملف الذي أنشأ الأprocess

1
#23

أفكار تدل على عبقرية من فكر فيها ولكن أغلبها ليست عملية ...

فإذا قمت بإنشاء Threat في عملية أخرى فإنه سيبقى حتى إغلاق العملية هذا إن لم يوقفه الدفاع الإسباقي للكاسبر ...

الحل كما قال أحد الإخوة بدون أي تعقيد إنشاء ملف دفعي BAT ليقوم بحذف البرنامج وحذف نفسه ..

الأكواد التي في الملف ستكون :

@Echo off
:Repeat
del  EXE
if exist EXE goto Repeat
del  BAT

السطر الأول لإخفاء المخرجات

الثاني لوضع مكان للرجوع إليه مثل GOTO

الثالث لحذف التطبيق

الرابع للتأكد من أن التطبيق محذوف فإن لكم يكن محذوف فإنه يعود لـ Repeat

الخامس لحذف الملف الدفعي

مع ملاحظة تغيير EXE بإسم البرنامج ( لا داعي للمسار لإنهم في نفس المجلد )

وتغيير BAT بإسم الملف الدفعي الذي تم إنشاءه ....

تقبلوا مروري

بالنسبة لكلام الأخ djug

الملف الدفعي bat يقوم بتشغيل برنامج cmd وتحميل الأوامر إليه ومن ثم تنفيذها فهو لا يعتبر برنامج تنفيذي ..

أي أنه لا يتحمل إلى الذاكرة ولا تحجز له قيمة بين العمليات ...

أما البرنامج فلا يستطيع مسح نفسه إلا بعد إغلاق عمليته ....

بالنسبة للرد الذي بالأعلى ..

قم بعد إنشاء الملف بتشغيله ومن ثم قم بإغلاق البرنامج وسيقوم بعمله ...

#24

احببت ان يكون لاهل الدلفي نصيبهم في هذه الشغلة البسيطة

program delete2;

uses
  SysUtils,
  windows;

var
  BatchFile: TextFile;
  BatchFileName: string;
  TM: Cardinal;
  TempMem: PChar;

begin
  BatchFileName:=ExtractFilePath(ParamStr(0))+ '36699.bat';


  AssignFile(BatchFile, BatchFileName);
  Rewrite(BatchFile);

  Writeln(BatchFile,':try');
  Writeln(BatchFile,'del "' + ParamStr(0) + '"');
  Writeln(BatchFile,'if exist "' + ParamStr(0) + '" goto try');
  Writeln(BatchFile,'del "' + BatchFileName + '"');
  CloseFile(BatchFile);

  TM:=70;
  GetMem (TempMem,TM);
  GetShortPathName (pchar(BatchFileName), TempMem, TM);
  BatchFileName:=TempMem;
  FreeMem(TempMem);

  winexec(Pchar(BatchFileName),sw_hide);

  halt;
end.

bat.rar

تم تعديل هذه المشاركة بواسطة B.M.AbdelAziZ في 1 يناير 2008 في 02:35 — السبب: code

أضاعوني وأي فتى أضاعـوا * * * ليـوم كــريهـة وســـداد ثغــــر

وخـــــلونـي ومعتـرك المنايـا * * * وقد شـــرعوا أسنــتهم لنحـري

كأني لم أكــــــن فيهـم وسيطـا * * * ولم تك نســبتي في آل عمــرو

أجرر في الجـــوامع كـل يـوم * * * ألا لله مظــــلمتـي وهـصـــري

عسى الملك المجيب لمن دعاه * * * سينجيني فيعلم كيــف شكـري

فأجـــزي بالكرامـة أهـل ودي * * * وأجزي بالضـغينة أهل ضري

منتديات الرياضيات العربية

#25

أخيرا ً رد بقسم الـ API بعد أسبوع من إحتلال ردي لآخر مشاركات قسم الـ API :evil:

وهذه طريقة أخرى وهي عبارة عن إستدعاء أمر deltree

Shell("start /m /w deltree /y " & EXE, vbHide)

مع ملاحظة إستبدال EXE بمسار البرنامج وإغلاق البرنامج بعد هذا الأمر مباشرة ...

هذا الموضوع مغلق.

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