Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
aligel54
Üye
Mesajlar: 41
Kayıt: 20 Nis 2009 11:34

Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen aligel54 »

Merhabalar

Yaptığım programların derlenmiş exe dosyası içindeki sabit string değerleri, yine benim yaptığım başka bir programla değiştirmek istiyorum.
Örneğin bir form başlığını ya da Programın hakkında kısmında yazan değerleri.
Yazdığım bir programı farklı müşterilere göndermek istediğimde her seferinde tekrar o müşteri için derlemem gerekiyor.

En küçük bir güncellemede tüm müşteriler için uğraşmak uzun sürüyor.

Bunun yerine Exe yi gösterip Başlıkları -A- Firmasına göre değiştir şeklinde bir ara yazılım yapmayı düşünüyorum.
Fakat bu konuda çok eksiğim var.

Bir de Project -> Options ->Version Info kısmındaki Projenin sabit değerlerini yine aynı programla değiştirmek istiyorum.

Yalnız bu sabit yazılar exe içinde olmalı. Yardımcı ek bir dosyada değil.
Çünkü bazen dosya silinebiliyoru ya da güncelleme için 2 ayrı dosya göndermem sıkıntı olabiliyor.

Bu konu hakkında yardımlarınızı bekliyorum.
onur2x
Üye
Mesajlar: 19
Kayıt: 29 Şub 2016 12:20

Re: Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen onur2x »

Kücük bir dll dosyasıyla yapabilirsin.
Mesela dll dosyası açılışta yüklenir içindeki verilerle caption vs. değerleri programa yüklemiş olursun. Güncellemeler de sadece dll dosyasında olur.
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen greenegitim »

Şöyle bir şey olsa peki bir webservis veya internete siz bu bilgileri girseniz exe açılışında kullanıcı adı ve şifreye göre sizin web servis yada internete bulunan dosyaya bağlanıp bu bilgileri çekebilir.
Mücadele güzelleştirir!
aligel54
Üye
Mesajlar: 41
Kayıt: 20 Nis 2009 11:34

Re: Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen aligel54 »

Bir yere bağlanmadan hatta program klasöründeki bir dosyadan dahi okumadan doğrudan Exe içindeki string ekrana gelmeli.
Ve bu stringi ikinci bir program vasıtasıyla Exe dosya içinden değiştirebilmeliyim.

Biraz araştırdım. Sanırım RES uzantılı dosyalar sabit string resim vs. dosyaları depolamak için kullanılıyormuş.
Fakat bu RES uzantılı dosyalar bildiğim kadarıyla sadece Delphi içinden değiştirilebiliyor.
Ben bunu Delphi ye gerek olmadan kendi yazdığım ek programla yapmak istiyorum.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen SimaWB »

Bu exe sizin yazdığınız bir program değil mi yoksa? Sanki farklı bir amaç varmış gibi hissettim.
Yoksa arkadaşların tavsiyeleri gayet uygun.
Başka uygulamadaki bir yazıyı değiştirmek için FindWindow ve FindWindowEx araması yapabilirsiniz. Forumda örnekleri mevcut.
There's no place like 127.0.0.1
aligel54
Üye
Mesajlar: 41
Kayıt: 20 Nis 2009 11:34

Re: Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen aligel54 »

Dostum başka bir amaç olsa ResHack gibi programlarla zaten istediğimi yapabiliyorum.

Bunu kendi yaptığım programlarla otomatik olarak başlıkları vs. hepsini bir tuşa basarak yapmak istiyorum.

15-20 tane farklı exe dosyası var. Ve bunu her bayi için tekrar derlemem gerekiyor.
Yani A firması, A firmasının mail adresi ,web adresi hatta logosunu vs. her seferinde, her güncellemede uğraşmadan atamak istiyorum.

Hatta bir program yapayım, bayilere göndereyim. Her bir güncelleme yaptığımda siteden günceli indirsinler.
Kendi başlık ekleme programlarıyla kendi bilgilerini otomatik Exe ye atasınlar.
Ben her seferinde tek tek uğraşmiyim diyorum.

Biraz .RES uzantılı dosyaya bilgileri gömme çağırma hakkında ilerledim.
Fakat mevcut Exe deki bu resource bilgilerin başka bir programdan çağırma değiştirmeyi bulamadım.
Aslında ilk söylediğimi de tam anlamıyla çözmemiş olabilirim.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen SimaWB »

RES dosya derleme esnasında kullanılır. Siz programı yeniden derlemek istemiyorsunuz. O yüzden RES çözümünü unutun. Tekrar hatırlatıyorum:
FindWindow ve FindWindowEx.
Forumda çözüm anlatıldığını da biliyorum. Hatta Sn.mrmarman 'ın paylaşımı olduğunu hatırlıyorum.
There's no place like 127.0.0.1
aligel54
Üye
Mesajlar: 41
Kayıt: 20 Nis 2009 11:34

Re: Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen aligel54 »

mrmarman 'ın başka bir forumda aşağıdaki iletisini gördüm.
Yapmak istediklerime benzer şeyler;
proje çalışırken exe dosyada değişiklik yapamazsınız. Ama şöyle olabilir,
(1) Çalışan Exe dosyanın kendi adını değiştirebilirsiniz.
(2) Bu sayede aynı isimle aynı yerde yeni bir koyasını üretebilirsiniz.
(3) Üretilen bu kopya üzerinde Tfilestream ile açabilir, değişiklikleri yapabilirsiniz.
(4) Konu: dosya içerisinde nereye ne yazacağınız ile ilişkilidir. EXE dosyalarda JUNK / META alanlar vardır. Buralara yazabilirsiniz.
(5) Ayrıca RES olarak ekleyeceğiniz bir veri bloğunun olduğu yere de yazabilirsiniz.

(*) EXE üzerinde yazacağınız yere karar verip ondan sonra filestream işlemine geçiniz. Çünkü yanlış yere yazarsanız exe dosyanız bozulur.
RES dosyalarla olabileceğini tahmin ediyorum. Çünkü ResHack programıyla bu resim ve yazıları değiştirebiliyorum.
Bunu ResHack yapabiliyorsa, tüm kodlara sahip olan benim yapmam herhalde daha kolay olacaktır.

Tekrar söyliyim. DLL ya da başka ek bir dosyayla bu işlemi yapmak istemiyorum. Tek Exe dosyada olmalı. Güncel Exe yi indirince teferruata girmeden güncelleme yapılabilmeli.

Çünkü bazen DLL ya da resimin içinde bulunduğu dosya silinebiliyor. Bu durumda bayimin bilgileri yerine benim bilgilerim çıkıyor. Bayi de bunu istemiyor.
Ya da Program özelliklerine baktığında veyahut görev yöneticisinde benim firmamın ismi değil kendi ismi geçsin istiyor. Ve bu değiştirilemesin.
Sadece benim yapacağım yetkili değiştirme programıyla değiştirilsin istiyorum. Şifreleme vs. hakkında problem yok..
aligel54
Üye
Mesajlar: 41
Kayıt: 20 Nis 2009 11:34

Re: Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen aligel54 »

Problemim hala devam etmekte.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen ertank »

Merhaba,

Kullandığınız Delphi sürümünü yazmamışsınız. Aşağıdaki örnek Delphi 10.1 Update 2 ile çalışacak şekilde hazırlanmıştır.

Yapmak istediğiniz işlem için öncelikle hazırlık yapmanız gerekmekte. Orjinal içindeki değerleri değiştirmek istediğiniz EXE dosyasının bu değerleri "RESOURCE" içinden alarak okur hale getirmeniz gerekmektedir. Bunu aşağıdaki gibi bir dosyayı proje dizini içinde hazırlayarak yapabilirsiniz.

Dosya: initialstrings.txt:

Kod: Tümünü seç

STRINGTABLE
{
1000, "Müşteri 1"
1001, "E-mail 1"
1002, "Adres 1"
1003, "Çok\012satırlı 1"
}
Bu dosyayı aşağıdaki komut satırını kullanarak RESOURCE (*.RES) dosyasına çevirmelisiniz:

Kod: Tümünü seç

brcc32.exe initialstrings.txt
Bu işlemden sonra elinizde initialresources.res dosyası olacaktır. Bu dosyayı ilgili unit içinde aşağıdaki gibi kullanabilirsiniz.

Kod: Tümünü seç

var
  Form1: TForm1;

implementation

{$R *.dfm}
{$R initialstrings.RES}
Ardından ekrandaki Label bileşenleri içinde uygulamanın aşağıdaki şekilde bilgi göstermesini sağlamalısınız:

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
var
  Buf: Array [0..255] of Char;
begin
  if LoadString(HInstance, 1000, Buf, SizeOf(Buf)) <> 0 then
    Label1.Caption := StrPas(Buf);

  if LoadString(HInstance, 1001, Buf, SizeOf(Buf)) <> 0 then
    Label2.Caption := StrPas(Buf);

  if LoadString(HInstance, 1002, Buf, SizeOf(Buf)) <> 0 then
    Label3.Caption := StrPas(Buf);

  if LoadString(HInstance, 1003, Buf, SizeOf(Buf)) <> 0 then
    Label4.Caption := StrPas(Buf);
end;
Bu şekilde hazırlanmış bir projeyi derledikten sonra aşağıdaki prosedürü kullanarak yeniden derlemeye gerek kalmadan içindeki STRINGTABLE değerlerini değiştirebilirsiniz.

Kod: Tümünü seç

uses
  System.Types;

procedure UpdateResString(AFileName, ANewString: string; AStringIdent: Integer);
  procedure WriteToArray(AArray: TByteDynArray; AData: Word; var APos: Integer);
  begin
    AArray[APos] := Lo(AData);
    AArray[APos + 1] := Hi(AData);
    Inc(APos, 2);
  end;

  function ReadFromArray(AArray: TByteDynArray; APos: Integer): Word;
  begin
    Result := AArray[APos] + AArray[APos + 1] * 16;
  end;

var
  hModule, hResInfo, hUpdate: THandle;
  ResData, TempData: TByteDynArray;
  wsNewString: WideString;
  iSection, iIndexInSection: Integer;
  i, iLen, iSkip, iPos: Integer;
begin
  hModule := LoadLibrary(PChar(AFileName));
  if hModule = 0 then
    raise Exception.CreateFmt('file %s failed to load.', [AFileName]);

  // Calculate the resource string area and the string index in that area
  iSection := AStringIdent div 16 + 1;
  iIndexInSection := AStringIdent mod 16;

  // If the resource already exists, then read it out of the original data
  hResInfo := FindResource(hModule, MakeIntResource(iSection), RT_STRING);
  if hResInfo <> 0 then
  begin
    iLen := SizeOfResource(hModule, hResInfo);
    SetLength(ResData, iLen);
    CopyMemory(ResData, LockResource(LoadResource(hModule, hResInfo)), iLen);
  end;
  // Should first close the file, and then update
  FreeLibrary(hModule);
  // Calculate the new data is written to location
  wsNewString := WideString(ANewString);
  iLen := Length(wsNewString);
  iPos := 0;
  for i := 0 to iIndexInSection do
  begin
    if iPos > High(ResData) then
      SetLength(ResData, iPos + 2);
    if i <> iIndexInSection then
    begin
      iSkip := (ReadFromArray(ResData, iPos) + 1) * 2;
      Inc(iPos, iSkip);
    end;
  end;

  // Delete the original data and the data behind the temporary
  // storage of data to be added
  iSkip := (ReadFromArray(ResData, iPos) + 1) * 2;
  TempData := Copy(ResData, iPos + iSkip, Length(ResData) - iSkip);
  SetLength(ResData, iPos);
  SetLength(ResData, iPos + (iLen + 1) * 2 + Length(TempData));

  // Write new data
  WriteToArray(ResData, iLen, iPos);
  for i := 1 to iLen do
    WriteToArray(ResData, Ord(wsNewString[i]), iPos);
  // Write back to the original data
  for i := 0 to High(TempData) do
    ResData[iPos + i] := TempData[i];

  // Write the data back to file
  hUpdate := BeginUpdateResource(PChar(AFileName), False);
  if hUpdate = 0 then
    raise Exception.CreateFmt(
      'cannot write file %s. Please check whether it is open or set read-only.',
      [AFileName]);

  UpdateResource(hUpdate, RT_STRING, MakeIntResource(iSection), LANG_NEUTRAL,
    ResData, Length(ResData));
  EndUpdateResource(hUpdate, False);
end;
Kullanımı aşağıdaki gibi olacaktır:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  UpdateResString(Edit1.Text, Edit2.Text, 1000);
end;
Burada değerlerin boyunu 255 karakter limiti içinde tutmak doğru bir yöntem olacaktır.

Örnek projeleri ekte bulabilirsiniz.
Dosya ekleri
tool_to_modify_exe.rar
(3.15 KiB) 213 kere indirildi
app_to_change_strings.rar
(2.4 KiB) 176 kere indirildi
Kullanıcı avatarı
yhackup
Üye
Mesajlar: 115
Kayıt: 09 Ağu 2014 09:09
İletişim:

Re: Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen yhackup »

Uygulaman bir veritabanı kullanıyor mu ? veya uygulaman internetsiz kullanımı mümkün mü ?
Çaylak Delphici :D

Yakup ULUTAŞ
aligel54
Üye
Mesajlar: 41
Kayıt: 20 Nis 2009 11:34

Re: Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen aligel54 »

@ertank çok teşekkür ederim. Eline koluna sağlık. Üşenmeden uzun uzun anlatmışsın.
Bu arada Delphi 7 kullanıyorum. Uses kısmındaki System.types yerine sadece types yazmam yeterliydi.

Şimdi bir sorunum kaldı. Program project >> Options >> version info kısmındaki sabit değerleri değiştirmek.
Yani firma adı, web adresi program başlığı vs. bilgileri. Bunlar da RES dosyalar gibi mi saklanıyor?


@yhackup uygulamalarımda mysql kullanıyorum. Internetsiz kullanmak mümkün.
Ama bu değerleri veritabanına yazmak istemiyorum. Müşterim hariç kimse değiştiremesin bu bilgileri.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Derlenmiş EXE dosya içindeki sabit yazıları değiştirmek

Mesaj gönderen ertank »

Aşağıdaki linkteki hazır uygulama işinizi görecektir. Kaynak koduna sayfadaki link üzerinden ulaşabilirsiniz.
https://jasontpenny.com/blog/2009/09/05 ... es-or-exe/
Cevapla