FileToDelphi Unit (binary const generator)

Paket programlarınızın tanıtımını bu forumda yapabilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

FileToDelphi Unit (binary const generator)

Mesaj gönderen mrmarman »

Merhaba.

- Geçtiğimiz günlerde OCR için DLL çalışması yapıyordum. Aklıma bir fikir geldi, bu fikri hayata geçirdim. Sizlerle bunu paylaşmak istedim. :idea:

- Bir DLL dosya da olabilir, bir EXE dosya da, bir resim dosyası da... vb. hangi türde bir dosya olursa olsun; asıl projemiz ile birlikte yer alacak yan unsur ise ne yapıyoruz? Aynı klasörde yer alacak şekilde RAR ile paketliyoruz veya SETUP oluşturup pakete dahil ediyoruz. :idea:

- Bu yan unsur olan dosya(lar)ı RESOURCE dosyası haline getirerek çalışan EXE'nin bizzat kendisine gömmek imkanımız da var. Benim de dahil olduğum bir çoğumuz böyle de kullanıyoruz.

- Bugün DLL dosylarını paket olarak da resource olarak da eklemek istemediğimi değerlendirdim ve alternatif olabilecek bir metod düşündüm ve bu proje bu şekilde doğdu.

- Bir DLL dosyasını örnek vereyim. Vereceğimiz bir DLL dosyasını bir filestream ile byte byte okuyup bir diziye HEX kodlarını koyup, bunu UNIT haline dönüştüren basit bir proje hazırladım.

- Daha sonra siz kendi projenizde; bu UNIT'i uSES ile ekleyip içerisindeki CONST ifadeyi direkt bir FileStream'e basıp diske kaydediyor, kullanıp işi bittiğinde diskten siliyorsunuz. Projeniz de derli toplu oluyor, yanına da ek başka dosya koymuyorsunuz.

- Bu başlığın ekinde; :bravo:
- (1) "File to Delphi UNIT" yazılımı,
- (2) Bu yazılım yardımı ile üretilmiş UNIT kullanılarak sonuç alınmış örnek bir proje yer almaktadır.

- Bu yazılım iki farklı dosya üretiyor.
(1) UNIT dosyası ( dosyanın binary array içeren hali )
(2) PROJE dosyası ( bu UNIT'in hangi şekilde kullanılabileceğini içeren örnek )

Resim

(1)

Kod: Tümünü seç

Unit Delphi_OCR_01;

Interface

Const
  strOrjDosya = 'OCR_01.dll';

  Dizi_Delphi_OCR_01 : Array [0..127487] of Byte = 
  (
  $4D,$5A,$50,$00,$02,$00,$00,$00,$04,$00,$0F,$00,$FF,$FF,$00,$00,$B8,$00,$00,$00,$00,$00,$00,$00,$40,$00,$1A,$00,$00,$00
 ,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 ,$00,$01,$00,$00,$BA,$10,$00,$0E,$1F,$B4,$09,$CD,$21,$B8,$01,$4C,$CD,$21,$90,$90,$54,$68,$69,$73,$20,$70,$72,$6F,$67,$72
 ,$61,$6D,$20,$6D,$75,$73,$74,$20,$62,$65,$20,$72,$75,$6E,$20,$75,$6E,$64,$65,$72,$20,$57,$69,$6E,$33,$32,$0D,$0A,$24,$37
...
...
 ,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 ,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 ,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  );
implementation
end.
(2)

Kod: Tümünü seç

// Dönüşüm Fonksiyonu //
// ------------------ //
// Kullanım (1)//

USES Delphi_OCR_01

Function Donusum( strDosyaAdi: String ): Boolean; 
Var                                               
  fsDosya  : TFileStream;                         
begin                                             
  Result := False;                                
  Try                                             
    fsDosya  := TFileStream.Create( strDosyaAdi, fmCreate ); 
    fsDosya.Write( Dizi_Delphi_OCR_01, High( Dizi_Delphi_OCR_01)+1 );   
    fsDosya.Free;                                 
  Finally
    Result := True;                               
  End;
end;                                              

// Herhangi bir dosya ise aşağıdaki şekil yeterli //              
begin;                                            
  Donusum( ExtractFilePath(Application.Exename) + strOrjDosya )   
end;                                              


// Kullanım (2)//

// Dosya bir DLL ise Dynamic Yükleyip Kullanımı //
// (uses ShareMem burada önemli...)               

USES ShareMem, Delphi_OCR_01

Function BizimFonk( iSayi1, iSayi2:Integer ):Boolean; 
  Function Donusum( strDosyaAdi: String ): Boolean; 
  Var                                               
    fsDosya  : TFileStream;                         
  begin                                             
    Try                                             
      fsDosya  := TFileStream.Create( strDosyaAdi, fmCreate ); 
      fsDosya.Write( Dizi_Delphi_OCR_01, High( Dizi_Delphi_OCR_01)+1 );   
      fsDosya.Free;                                 
    Finally
      Result := True;                               
    End;
  end;                                              
type // Kullanılacak Fonksiyon / Procedure tanımladık 
  TBizimType = function ( iParam01, iParam02:Integer ): Boolean; stdcall; 
var                                               
  dllHand : THandle;                              
  BizimFn : TBizimType;                           
  strDLL  : String;                               
begin                                             
  Result := True;                                 
  strDLL := ExtractFilePath(Application.Exename) + strOrjDosya; 
  Donusum( strDLL )                               
  dllHand := LoadLibrary( PChar( strDLL ) ) ;     
  if dllHand <> 0 then                            
  begin                                           
    @BizimFn := GetProcAddress(dllHand, '<"TBizimType" ile parametresi yazılan fonksiyon adı>') ;
    if Assigned (BizimFn) then                    
    begin                                         
      Result := BizimFn( iSayi1, iSayi2 );        
    end                                           
    else ShowMessage('DLL içerisinde istenen fonksiyonu Export edilmemiş...');
    FreeLibrary(dllHand) ;                        
  end                                             
  else ShowMessage('DLL dosyası bulunamadı veya yüklenemedi...');

  if FileExists( strDLL ) then DeleteFile( strDLL );
end;                                              
Dosya ekleri
ProjeMedula_DLLEmbedded.rar
Örnek Proje ( Medula OCR eden basit proje )
(155.66 KiB) 255 kere indirildi
FileToDelphiUnit.rar
Verilen dosyayı Delphi UNIT'ine dönüştüren Yazılım
(202.79 KiB) 304 kere indirildi
Resim
Resim ....Resim
zombi
Üye
Mesajlar: 27
Kayıt: 10 Tem 2008 07:51

Re: FileToDelphi Unit (binary const generator)

Mesaj gönderen zombi »

hocam merhaba;

yanlış anlamadıysam sizin verdiğiniz FileToDelphiUnit programı ile projemiz içine gömmmek istediğimiz dll , exe yada resim dosyasını unit haline getiriyor ve biz bu unit kodlarını kendi projemize dahil ediyoruz hepsi bu mu_? Doğru anladıysam benim projem içine gömmek istediğim dosya .exe ya da .dll değil benim gömmek istediğim .mdl uzantılı bir dosya sanırım açılımı modul dosyası bunuda çevirebilirmi_? Birde benim projem .dll projesidir.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: FileToDelphi Unit (binary const generator)

Mesaj gönderen mrmarman »

Doğrudur. Her dosya için geçerli. Oluşan uniti projeniz doğal olarak bünyesinde bulunduracak, dilediğiniz zaman array içeriğini belirtilen function yardımıyla fiziksel bir dosyaya dönüştürüp kullanmak kalıyor.
Resim
Resim ....Resim
zombi
Üye
Mesajlar: 27
Kayıt: 10 Tem 2008 07:51

Re: FileToDelphi Unit (binary const generator)

Mesaj gönderen zombi »

tekrar merhaba ben projem içine gömmek istediğim .mdl dosyasını sizin verdiğiniz program ile dönüştürdüm üst tarafda proje kodu yazıyor alt kısımda ise projeye eklenecek diyor sanırım ben sadece aşağıdaki kodları eklemem gerekiyor üstteki kodları birşey yapmayacağım değilmi_?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: FileToDelphi Unit (binary const generator)

Mesaj gönderen mrmarman »

Hocam üstteki senin dönüşüm fonksiyonun. O da olacak aşağıdaki de...
- Aşağıdaki bağımsız bir unit olacak ve USES ile ekli olacak,
- Üstteki ise kendi projenizde bu içeriğin fiziksel bir dosya haline getirecek fonksiyonu içerecek.

- Aslında RESOURCE mantığına aşinaysanız sizin için resourcestream ile bir deneyip, bu başlıktakini de ona alternatif olarak değerlendirseniz daha verimli olacaktır diye düşünüyorum.

- Bu başlıktaki metodun asıl amacı, DLL içeriğini resource olarak projemiz içinde yer alması durumunda virüs programlarının projemizi trojan olarak değerlendirmesine karşılık üretmiştim. Sizin bu tip bir kaygınız yoksa diğer yöntem bir kaç satırlık bir işlemdir.
Resim
Resim ....Resim
Nomercy
Üye
Mesajlar: 62
Kayıt: 17 Kas 2014 12:33

Re: FileToDelphi Unit (binary const generator)

Mesaj gönderen Nomercy »

Hocam Ben Başka Bir Dil İle Yazılmış Bir exe yi Bununla Dönüştürerek Kullanabilirmiyim.Çünkü O Dille Yazılmış Olan exe nin Decompiler Programı Piyasada Dolaşıyor Sadece exe yi Sürükleyip Decompiler a Bıraktığımızda Kodları Çeviriyor.Ben Bunu o exeyi Korumak Amacıyla Kullanabilirmiyim?Böylelikle O Programın Kodlarını Koruyacağımı Düşünüyorum Eğer Olursa :)

Birde Bunu Tam Anlayamadım Nasıl Projeye Entegre Edeceğimi :)
zombi
Üye
Mesajlar: 27
Kayıt: 10 Tem 2008 07:51

Re: FileToDelphi Unit (binary const generator)

Mesaj gönderen zombi »

s.a tabiiki en doğru cevabı mrmarman verecektir lakin benim çevirdiğim de c++ ile yazılmış bir *.mdl dosyası idi . Yani demekki başka bir dille yazılan kodlarıda çeviriyor. Birde bahsettiğniz decompiler programı nedir_? Başkalarının bir sürü emeklerle yazdığı programın kodlarını mı alıyor o program_?

Diğer sorularının cevabınıda mrmarman verecektir eminim..
Nomercy
Üye
Mesajlar: 62
Kayıt: 17 Kas 2014 12:33

Re: FileToDelphi Unit (binary const generator)

Mesaj gönderen Nomercy »

zombi yazdı:s.a tabiiki en doğru cevabı mrmarman verecektir lakin benim çevirdiğim de c++ ile yazılmış bir *.mdl dosyası idi . Yani demekki başka bir dille yazılan kodlarıda çeviriyor. Birde bahsettiğniz decompiler programı nedir_? Başkalarının bir sürü emeklerle yazdığı programın kodlarını mı alıyor o program_?

Diğer sorularının cevabınıda mrmarman verecektir eminim..
Evet yazdığımız programı decompiler yapdığında kodları direkt görünüyor piyasada çok örneği var o dille yazdığım programı decompiler yapmak bebek oyuncağı direk decompiler a sürüklüyorsun exe dosyasını otomatik kodları gösteriyor.Bana tam nasıl yapıldığını anlatırmısın? Ben Yapmaya Çalıştım Olmadı diğer dille yazdığım exeyi ne yapıyoruz yukardan kodları oluşturduğumda tam anlayamadım
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: FileToDelphi Unit (binary const generator)

Mesaj gönderen mrmarman »

Nomercy yazdı:... Ben Yapmaya Çalıştım Olmadı diğer dille yazdığım exeyi ne yapıyoruz yukardan kodları oluşturduğumda tam anlayamadım
Hocam, yönerge şöyle
(1) Yukarıdaki FileToDelphiUnit isimli programcığı indirin.
(2) "Dosya Seç" butonuna basarak saklamak istediğiniz (kendi projeniz içine gömeceğiniz) programı seçin.
(3) "Dönüştür" butonuna basın.
(4) Yatay olarak bölünmüş pencerede üstte ve altta olmak üzere iki kod üretildiğini göreceksiniz.
(5) "Kaydet" butonuna bastığınızda seçim yaptığınız klasörde bu iki ekrandaki kod birer PAS dosyası olarak kaydedilmiş olacaktır.
- Delphi_<projenizinadi>.PAS
- Delphi_<projenizinadi>_PRJ.PAS

(6) Bu iki dosyadan sadece UNIT içeren (PRJ olmayan) halini projenize ekleyin. Örnekte Delphi_<projenizinadi>.PAS olanıdır.
(7) Şimdi PRJ olan dosya içerisinden dilediğiniz iki fonksiyonu kullanabilirsiniz.

Örnek :

Kod: Tümünü seç

USES Delphi_<projenizinadi>;

Function Donusum( strDosyaAdi: String ): Boolean;
Var
  fsDosya  : TFileStream;
begin
  Result := False;
  Try
    fsDosya  := TFileStream.Create( strDosyaAdi, fmCreate );
    fsDosya.Write( Dizi_Delphi_<projenizinadi>, High( Dizi_Delphi_<projenizinadi>)+1 );
    fsDosya.Free;
  Finally
    Result := True;
  End;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Donusum( ExtractFilePath(Application.Exename) + strOrjDosya );
  ShowMessage( ExtractFilePath(Application.Exename) + ' klasöründe ' + strOrjDosya + ' dosyası küllerinden yeniden doğdu... :) ' );
end;
Umarım faydası dokunur...
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: FileToDelphi Unit (binary const generator)

Mesaj gönderen mrmarman »

Size tam bir örnek proje hazırladım.
- Yaptığı iş Windows'un hesap makinası (CALC.EXE) fiziksel olarak DOSYA OLUŞTURMADAN hafızada direkt çalıştırmak.

( Windows 7 Enterprise 64bit kullanıyorum "system\calc.exe" dosyasını UNIT haline dönüştürdüm )
DOSYA.TC linki için buraya tıklayın...

Kaynak kodları :

Kod: Tümünü seç

implementation

uses Delphi_calc;

{$R *.dfm}

function NtUnmapViewOfSection(ProcessHandle: THandle; BaseAddress: Pointer): DWORD;
  stdcall; external 'ntdll.dll';

type
  TByteArray = array of Byte;
  
function RunEXE(sVictim:string; bFile:TByteArray):Boolean;
  procedure Move(Destination, Source: Pointer; dLength:Cardinal);
  begin
    CopyMemory(Destination, Source, dLength);
  end;
var
  IDH:        TImageDosHeader;
  INH:        TImageNtHeaders;
  ISH:        TImageSectionHeader;
  PI:         TProcessInformation;
  SI:         TStartUpInfo;
  CONT:       TContext;
  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
    begin
      Move(@INH, @bFile[IDH._lfanew], 248);
      if INH.Signature = IMAGE_NT_SIGNATURE then
      begin
        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
        begin
          CONT.ContextFlags := CONTEXT_FULL;
          if GetThreadContext(PI.hThread, CONT) then
          begin
            ReadProcessMemory(PI.hProcess, Ptr(CONT.Ebx + 8), @Addr, 4, Ret);
            NtUnmapViewOfSection(PI.hProcess, @Addr);
            ImageBase := VirtualAllocEx(PI.hProcess, Ptr(INH.OptionalHeader.ImageBase), INH.OptionalHeader.SizeOfImage, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
            WriteProcessMemory(PI.hProcess, ImageBase, @bFile[0], INH.OptionalHeader.SizeOfHeaders, Ret);
            dOffset := IDH._lfanew + 248;
            for i := 0 to INH.FileHeader.NumberOfSections - 1 do
            begin
              Move(@ISH, @bFile[dOffset + (i * 40)], 40);
              WriteProcessMemory(PI.hProcess, Ptr(Cardinal(ImageBase) + ISH.VirtualAddress), @bFile[ISH.PointerToRawData], ISH.SizeOfRawData, Ret);
              VirtualProtectEx(PI.hProcess, Ptr(Cardinal(ImageBase) + ISH.VirtualAddress), ISH.Misc.VirtualSize, PAGE_EXECUTE_READWRITE, @Addr);
            end;
            WriteProcessMemory(PI.hProcess, Ptr(CONT.Ebx + 8), @ImageBase, 4, Ret);
            CONT.Eax := Cardinal(ImageBase) + INH.OptionalHeader.AddressOfEntryPoint;
            SetThreadContext(PI.hThread, CONT);
            ResumeThread(PI.hThread);
            Result := TRUE;
          end;
        end;
      end;
    end;
  except
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  msDosya  : TMemoryStream;
  bBuff    : TByteArray;
begin
  // Fiziksel dosya yapmadan EXE çalıştırma örneğidir..
  msDosya := TMemoryStream.Create;
  Try
    // UNIT'imizi MemoryStream'e alıyoruz..
    msDosya.Write( Dizi_Delphi_calc, High( Dizi_Delphi_calc)+1 );
    // MemoryStream'deki UNIT'imizi ByteArray'a dönüştürüyoruz..
    msDosya.Position:=0;
    SetLength(bBuff, msDosya.Size);
    msDosya.Read(bBuff[0], msDosya.Size);
    // Artık EXE'mizi çalıştırabiliriz..
    RunExe(ParamStr(0), bBuff);
  Finally
    msDosya.Free;
  End;
end;
UNIT:

Kod: Tümünü seç

Unit Delphi_calc;

Interface

Const
  strOrjDosya = 'calc.exe';

  Dizi_Delphi_calc : Array [0..776191] of Byte = 
  (
  $4D,$5A,$90,$00,$03,$00,$00,$00,$04,$00,$00,$00,$FF,$FF,$00,$00,$B8,$00,$00,$00,$00,$00,$00,$00,$40,$00,$00,$00,$00,$00
 ,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
...
... uzunca kodlar devam eder...
...
 ,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 ,$00,$00
  );
implementation
end.
Resim
Resim ....Resim
zombi
Üye
Mesajlar: 27
Kayıt: 10 Tem 2008 07:51

Re: FileToDelphi Unit (binary const generator)

Mesaj gönderen zombi »

s.a @mrmarman hocam merhabalar ;

yazdıklarınızı madde madde okuduktan sonra 6.madde dahil olmak üzere anladım. Biz projemize alttaki Unit içeren kodları ekleyeceğiz buraya kadar tamam anlaşıldı;

7. maddeye kafamı karıştırdı şöyle demişsiniz
(7) Şimdi PRJ olan dosya içerisinden dilediğiniz iki fonksiyonu kullanabilirsiniz.

üstteki prj içeren dosya ile ilgili projemize bir ekleme yapacak mıyız_? ya da PRJ içeren dosyayı nasıl kullanacağız_?
Cevapla