كيف يمكن وضع ملف تنفيذي داخل ملف تنفيذي
#1
كيف يمكن برمجة ملف تنفيذي عند تشغيله يقوم بنسخ ملفات موجوده داخله الى مكان ما ثم يقوم بتشغيلها حيث ان ما بداخله مثلا هو برنامج تنفيذي اخر
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
الرد
#2
السلام عليكم
موجوده بداخله: أي مخزنة في طبقة من الملف التنفيذي تسمى "المصادر" 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 في المنتدى
بالتوفيق.
الرد
#3
وعليكم السلام ورحمة الله وبركاته
اظافة الى ما دكر ناك طرق أخرى غير الرسورس ك :
تحويل الملف الى مصفوقة من البايتات ومن تم نستطيع قراءة المصفوفة واستخراجها على شكل ملف باستعمال أحد دوال API ك WriteFile.
اضافة الملف الى نهاية الملف التنفيدي EOF
فقط استعمل google وطبق كل ماتجده
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#4
me&delphi' كتب :تحويل الملف الى مصفوقة من البايتات ومن تم نستطيع قراءة المصفوفة واستخراجها على شكل ملف باستعمال أحد دوال api
كيف نحولها الى مصفوفه من البايتات

وشكراً لك
الرد
#5
إقتباس :الملف التنفيذي المراد وضعه في الرسورس عند تشغيله ينشئ ملف في نفس الفولدر لكن عند وضعه في الرسورس لا يمكن تشغيله لأن لا يمكن انشاء ذلك الملف
لم أفهم، هل من مثال؟
إقتباس :كيف نحولها الى مصفوفه من البايتات
كما يحول كل شيء في الجهاز إلى 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; 
لم أجربه.
الرد
#6
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
كيف نجعل الحجم متغير للعدم الخسارة في الحجم لاننا عند القرائة سنحدد عدد البايتات المقروئة
الرد
#7
"كيف نجعل الحجم متغير للعدم الخسارة في الحجم لاننا عند القرائة سنحدد عدد البايتات المقروئة "
- تقريبا نفس الفكرة في تحويل الـ 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;

بالتوفيق,,
I'M Fly Like A G6

الرد
#8
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
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد
#9
S.FATEH كتب :حسب ما فهمت من السآل في يمكنك استخدام تقنية Func-In ...
الكتابة والقرائة في الرسورس ليس موضوعنا
نتحدث على طريقة اخرى للدمج وانا وضعت اداة هنا
http://www.delphi4arab.net/forum/showthr...p?tid=7837
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 2 ) ضيف كريم