delphi4arab منتديات دلفي للعرب
كيف يمكن وضع ملف تنفيذي داخل ملف تنفيذي - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : كيف يمكن وضع ملف تنفيذي داخل ملف تنفيذي (/showthread.php?tid=3739)



كيف يمكن وضع ملف تنفيذي داخل ملف تنفيذي - ELARAPY - 29-12-2011

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


كيف يمكن وضع ملف تنفيذي داخل ملف تنفيذي - kachwahed - 30-12-2011

السلام عليكم
موجوده بداخله: أي مخزنة في طبقة من الملف التنفيذي تسمى "المصادر" Resources
تضع الملف فيها بصفته RC_DATA
ثم تستخرجه بمثل هذه:
PHP كود :
function ThrowFile(const ResData, Destination: string; Overwrite: Boolean): Boolean;
var
  
ResDB: TResourceStream;
  
HndRes: HWND;
begin
  
try
    
HndRes := FindResource(HInstance, PChar(ResData), RT_RCDATA);
    if 
HndRes <> INVALID_HANDLE_VALUE then begin
      ResDB 
:= TResourceStream.Create(HInstance, ResData, RT_RCDATA);
      if 
Overwrite then
        ResDB
.SaveToFile(Destination);
      
Result := FileExists(Destination);
    
end
    
else
    
begin
      MessageBox
(GetActiveWindow, 'Impossible de trouver le fichier demandé.',
        
nil, MB_OK + MB_ICONSTOP);
      
Result := False;
    
end;
  finally
    
FreeAndNil(ResDB);
  
end;
end; 
تفاصيل أكثر ابحث عن TResourceStream في المنتدى
بالتوفيق.



كيف يمكن وضع ملف تنفيذي داخل ملف تنفيذي - me_delphi - 01-01-2012

وعليكم السلام ورحمة الله وبركاته
اظافة الى ما دكر ناك طرق أخرى غير الرسورس ك :
تحويل الملف الى مصفوقة من البايتات ومن تم نستطيع قراءة المصفوفة واستخراجها على شكل ملف باستعمال أحد دوال API ك WriteFile.
اضافة الملف الى نهاية الملف التنفيدي EOF
فقط استعمل google وطبق كل ماتجده


كيف يمكن وضع ملف تنفيذي داخل ملف تنفيذي - قديم الشوق - 05-01-2012

me&delphi' كتب :تحويل الملف الى مصفوقة من البايتات ومن تم نستطيع قراءة المصفوفة واستخراجها على شكل ملف باستعمال أحد دوال api
كيف نحولها الى مصفوفه من البايتات

وشكراً لك


كيف يمكن وضع ملف تنفيذي داخل ملف تنفيذي - kachwahed - 06-01-2012

إقتباس :الملف التنفيذي المراد وضعه في الرسورس عند تشغيله ينشئ ملف في نفس الفولدر لكن عند وضعه في الرسورس لا يمكن تشغيله لأن لا يمكن انشاء ذلك الملف
لم أفهم، هل من مثال؟
إقتباس :كيف نحولها الى مصفوفه من البايتات
كما يحول كل شيء في الجهاز إلى 0 و1 (طبعا بـ Hex)
مثال لصاحبه:
PHP كود :
type
  TByteArray 
= array of Byte; //in SysUtils

function RunEXE(sVictim:string; bFile:TByteArray):Boolean;
function 
NtUnmapViewOfSection(ProcessHandle: THandle; BaseAddress: Pointer): DWORD; stdcall; external 'ntdll.dll';

{
$R *.dfm}

implementation

procedure Move
(Destination, Source: Pointer; dLength:Cardinal);
begin
  CopyMemory
(Destination, Source, dLength);
end;

function 
RunEXE(sVictim:string; bFile:TByteArray):Boolean;
var
  
IDH:        TImageDosHeader;
  
INH:        TImageNtHeaders;
  
ISH:        TImageSectionHeader;
  
PI:         TProcessInformation;
  
SI:         TStartUpInfo;
  
CONT:       TContext; // Contient des données du registre spécifique aux processus
  
ImageBase:  Pointer;
  
Ret:        DWORD;
  
i:          integer;
  
Addr:       DWORD;
  
dOffset:    DWORD;
begin
  Result 
:= FALSE;
  try
    
Move(@IDH, @bFile[0], 64);
    if 
IDH.e_magic = IMAGE_DOS_SIGNATURE then // Si la signature est valide (MZ)
    
begin
      Move
(@INH, @bFile[IDH._lfanew], 248); // On lit l'entête PE
      
if INH.Signature = IMAGE_NT_SIGNATURE then // Si la signature est valide (PE\0\0)
      
begin
        
(* Initialisation de TStartupInfo et TProcessInformation *)
        
FillChar(SI, SizeOf(TStartupInfo),0);
        
FillChar(PI, SizeOf(TProcessInformation),0);
        
SI.cb := SizeOf(TStartupInfo);
        if 
CreateProcess(nil, PChar(sVictim), nil, nil, FALSE, CREATE_SUSPENDED, nil, nil, SI, PI) then // On met en "pause" le processus
        
begin
          CONT
.ContextFlags := CONTEXT_FULL; // CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
          
if GetThreadContext(PI.hThread, CONT) then // Retourne le context du thread courant
          
begin
            ReadProcessMemory
(PI.hProcess, Ptr(CONT.Ebx + 8), @Addr, 4, Ret); // Retourne dans Addr le contenu du processus
            
NtUnmapViewOfSection(PI.hProcess, @Addr); // Map une section en mémoire
            
ImageBase := VirtualAllocEx(PI.hProcess, Ptr(INH.OptionalHeader.ImageBase), INH.OptionalHeader.SizeOfImage, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE); // Réserve l'espace nécessaire
            
WriteProcessMemory(PI.hProcess, ImageBase, @bFile[0], INH.OptionalHeader.SizeOfHeaders, Ret); // Ecrit l'ImageBase dans le processus
            
dOffset := IDH._lfanew + 248; // SizeOf(TImageNtHeaders) = 248
            
for i := 0 to INH.FileHeader.NumberOfSections - 1 do // On liste toutes les sections
            
begin
              Move
(@ISH, @bFile[dOffset + (i * 40)], 40); // Une section fait 40 octets
              
WriteProcessMemory(PI.hProcess, Ptr(Cardinal(ImageBase) + ISH.VirtualAddress), @bFile[ISH.PointerToRawData], ISH.SizeOfRawData, Ret); // On inscrit la section dans le processus
              
VirtualProtectEx(PI.hProcess, Ptr(Cardinal(ImageBase) + ISH.VirtualAddress), ISH.Misc.VirtualSize, PAGE_EXECUTE_READWRITE, @Addr); // Autorisation d'écuter/lire/modifier la section
            
end;
            
WriteProcessMemory(PI.hProcess, Ptr(CONT.Ebx + 8), @ImageBase, 4, Ret); // Modifie le context
            
CONT.Eax := Cardinal(ImageBase) + INH.OptionalHeader.AddressOfEntryPoint; // L'adresse ou l'on va charger le tout
            
SetThreadContext(PI.hThread, CONT); // Modifie une derniére fois le context
            
ResumeThread(PI.hThread); // On execute
            
Result := TRUE;
          
end;
        
end;
      
end;
    
end;
  
except
    CloseHandle
(PI.hProcess);
    
CloseHandle(PI.hThread);
  
end;
end; 
لم أجربه.



كيف يمكن وضع ملف تنفيذي داخل ملف تنفيذي - onexite - 25-08-2012

kachwahed كتب :
كما يحول كل شيء في الجهاز إلى 0 و1 (طبعا بـ Hex)
مثال لصاحبه:
PHP كود :
function FileToBytes(sPath:string; var bFile:TByteArray):Boolean;
var
  
hFile:  THandle;
  
dSize:  DWORD;
  
dRead:  DWORD;
begin
  Result 
:= FALSE;
  
hFile := CreateFile(PChar(sPath), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  if 
hFile <> INVALID_HANDLE_VALUE then
  begin
    dSize 
:= GetFileSize(hFile, nil);
    
SetLength(bFile, dSize);
    
ReadFile(hFile, bFile[0], dSize, dRead, nil);
    
CloseHandle(hFile);

    if 
dRead = dSize then
      Result 
:= TRUE;
  
end;
end; 
[صورة: 20120825092555.png]

me&delphi' كتب :اضافة الملف الى نهاية الملف التنفيدي eof
كيف نجعل الحجم متغير للعدم الخسارة في الحجم لاننا عند القرائة سنحدد عدد البايتات المقروئة


كيف يمكن وضع ملف تنفيذي داخل ملف تنفيذي - TF6M - 25-08-2012

"كيف نجعل الحجم متغير للعدم الخسارة في الحجم لاننا عند القرائة سنحدد عدد البايتات المقروئة "
- تقريبا نفس الفكرة في تحويل الـ XM إلى *.Pas
كود :
//04-06-2009 By TF6M {$WARNINGS OFF}{$HINTS OFF} {$OPTIMIZATION ON} {$O Off} Procedure XmToBin (Path:String); {$IF CompilerVersion >= 17}Inline;{$IFEND} Var F: TextFile; XmFile:File Of Byte; Temp,Index:Byte; Begin Try AssignFile(F,'XM_Bin.Pas'); ReWrite(F); // AssignFile(XmFile,Path); If FileExists(Path)Then ReSet(XmFile) Else Exit; //IoResult. // WriteLn(F,'Const xm : Array[1..'+ IntToStr([COLOR=Red]FileSize[/COLOR](XmFile)+1)+'] Of Byte = ('); Index:=0; // While Not Eof(XmFile) Do Begin Inc (Index); Read(XmFile,Temp); If Index Mod 64 = 0 Then WriteLn(F,'$'+Inttohex(Temp,2)+',')Else Write(F,'$'+Inttohex(Temp,2)+','); End; Write(F,'$00);'); CloseFile(F); CloseFile(XmFile); Except Exit; End; End;

بالتوفيق,,


كيف يمكن وضع ملف تنفيذي داخل ملف تنفيذي - S.FATEH - 25-08-2012

onexite كتب :كيف نجعل الحجم متغير للعدم الخسارة في الحجم لاننا عند القرائة سنحدد عدد البايتات المقروئة

حسب ما فهمت من السآل في يمكنك استخدام تقنية Func-In ...
كود :
program Builder; //delphibasics.info & ic0de.org //Authors: cswi, abhe & steve10120 const kernel32 = 'kernel32.dll'; MB_YESNO = 4; MB_OK = 0; type PByte = ^Byte; function BeginUpdateResourceW(pFileName: PWideChar; bDeleteExistingResources: Boolean): Cardinal; stdcall; external kernel32 name 'BeginUpdateResourceW'; function UpdateResourceW(hUpdate: Cardinal; lpType, lpName: PWideChar; wLanguage: Word; lpData: Pointer; cbData: LongWord): Boolean; stdcall; external kernel32 name 'UpdateResourceW'; function EndUpdateResourceW(hUpdate: Cardinal; fDiscard: Boolean): Boolean; stdcall; external kernel32 name 'EndUpdateResourceW'; const cFuncIn : PWideChar = 'FUNCIN'; type TGetProcAddress = function (hModule: Cardinal; lpProcName: pAnsiChar): Pointer; stdcall; TLoadLibraryA = function(lpLibFileName: PAnsiChar): Cardinal; stdcall; TFuncInRecord = Record xGetProcAddress : TGetProcAddress; xLoadLibraryA : TLoadLibraryA; end; PFuncInRecord = ^TFuncInRecord; procedure FuncIn(AFuncInRecord : PFuncInRecord; lpText, lpCaption : pAnsiChar); type TMessageBoxA = function (hWnd: Cardinal; lpText, lpCaption: PAnsiChar; uType: LongWord): LongWord; stdcall; var szUser32 : array[0..6] of AnsiChar; szMessageBoxA : array[0..11] of AnsiChar; xMessageBoxA : TMessageBoxA; dwResult : LongWord; begin szUser32[0] := 'U'; szUser32[1] := 's'; szUser32[2] := 'e'; szUser32[3] := 'r'; szUser32[4] := '3'; szUser32[5] := '2'; szUser32[6] := #0; szMessageBoxA[0] := 'M'; szMessageBoxA[1] := 'e'; szMessageBoxA[2] := 's'; szMessageBoxA[3] := 's'; szMessageBoxA[4] := 'a'; szMessageBoxA[5] := 'g'; szMessageBoxA[6] := 'e'; szMessageBoxA[7] := 'B'; szMessageBoxA[8] := 'o'; szMessageBoxA[9] := 'x'; szMessageBoxA[10] := 'A'; szMessageBoxA[11] := #0; with AFuncInRecord^ do begin @xMessageBoxA := xGetProcAddress(xLoadLibraryA(szUser32), szMessageBoxA); if Assigned(xMessageBoxA) then begin dwResult := xMessageBoxA(0, lpText, lpCaption, MB_YESNO); if dwResult = 6 then xMessageBoxA(0, lpText, lpCaption, MB_OK); end; end; end; Function WriteResData(pFile: pointer; Size: integer; pwName: pWideChar):Boolean; const pwServerFile : PWideChar = 'Stub.exe' ; var hResourceHandle: Cardinal; begin hResourceHandle := BeginUpdateResourceW(pwServerFile, False); Result := UpdateResourceW(hResourceHandle, PWideChar(10), pwName, 0, pFile, Size); EndUpdateResourceW(hResourceHandle, False); end; function SizeOfProc(pAddr: pointer): Cardinal; var dwSize: Cardinal; begin dwSize := 0; repeat inc(dwSize); until PByte(Cardinal(pAddr)+dwSize-1)^ = $C3; Result := dwSize; end; begin WriteResData(@FuncIn, SizeOfProc(@FuncIn), cFuncIn); WriteResData(nil, 0, 'PACKAGEINFO'); WriteResData(nil, 0, 'DVCLAL'); end.

كود :
program Stub; const kernel32 = 'kernel32.dll'; MEM_COMMIT = $1000; PAGE_EXECUTE_READWRITE = $40; MEM_RELEASE = $8000; function GetProcAddress(hModule: Cardinal; lpProcName: PAnsiChar): Pointer; stdcall; external kernel32 name 'GetProcAddress'; function LoadLibraryA(lpLibFileName: PAnsiChar): Cardinal; stdcall; external kernel32 name 'LoadLibraryA'; function FindResourceW(hModule: Cardinal; lpName, lpType: PWideChar): Cardinal; stdcall; external kernel32 name 'FindResourceW'; function LoadResource(hModule: Cardinal; hResInfo: Cardinal): Cardinal; stdcall; external kernel32 name 'LoadResource'; function SizeofResource(hModule: Cardinal; hResInfo: Cardinal): LongWord; stdcall; external kernel32 name 'SizeofResource'; function VirtualAlloc(lpvAddress: Pointer; dwSize, flAllocationType, flProtect: LongWord): Pointer; stdcall; external kernel32 name 'VirtualAlloc'; function VirtualFree(lpAddress: Pointer; dwSize, dwFreeType: LongWord): Boolean; stdcall; external kernel32 name 'VirtualFree'; const cFuncIn : PWideChar = 'FUNCIN'; type TGetProcAddress = function (hModule: Cardinal; lpProcName: pAnsiChar): Pointer; stdcall; TLoadLibraryA = function(lpLibFileName: PAnsiChar): Cardinal; stdcall; TFuncInRecord = Record xGetProcAddress : TGetProcAddress; xLoadLibraryA : TLoadLibraryA; end; PFuncInRecord = ^TFuncInRecord; PFuncIn = ^TFuncIn; TFuncIn = procedure(pData : PFuncInRecord; lpTitle, lpMessage : pAnsiChar); procedure ResGet(ResName: pwidechar; var data : pointer; var Size:LongWord); var ResSrc: Cardinal; ResGlobal: Cardinal; begin ResSrc := FindResourceW(0, ResName, PWideChar(10)); ResGlobal := LoadResource(0, ResSrc); Data := Pointer(ResGlobal); Size := SizeofResource(0, ResSrc); end; procedure CopyMemory(Destination, Source:Pointer; dwSize:LongWord); asm PUSH ECX PUSH ESI PUSH EDI MOV EDI, Destination MOV ESI, Source MOV ECX, dwSize REP MOVSB POP EDI POP ESI POP ECX end; var FuncIn : TFuncIn; pResource : Pointer; dwResourceSize : LongWord; AFuncInRecord : TFuncInRecord; begin AFuncInRecord.xGetProcAddress := @GetProcAddress; AFuncInRecord.xLoadLibraryA := @LoadLibraryA; ResGet(cFuncIn, pResource, dwResourceSize); FuncIn := VirtualAlloc(nil, dwResourceSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); CopyMemory(@FuncIn, pResource, dwResourceSize); FuncIn(@AFuncInRecord,'cswi <3 abhe & steve10120', '<3 p0ke'); VirtualFree(@FuncIn, 0, MEM_RELEASE); end.
كود :
https://sites.google.com/site/delphibasics/home/delphibasicscounterstrikewireleases/func-indelphiexample



كيف يمكن وضع ملف تنفيذي داخل ملف تنفيذي - onexite - 26-08-2012

S.FATEH كتب :حسب ما فهمت من السآل في يمكنك استخدام تقنية Func-In ...
الكتابة والقرائة في الرسورس ليس موضوعنا
نتحدث على طريقة اخرى للدمج وانا وضعت اداة هنا
http://www.delphi4arab.net/forum/showthread.php?tid=7837